/* This file is part of KWordQuiz Copyright (C) 2003 Peter Hedlund This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include "qaview.h" #include "prefs.h" #include "kwordquiz.h" TQString highlightError(const TQString & c, const TQString & e) { if (c == e) return c; TQString s = c; if (s.left(4) == "" && e.left(4) != "") s = s.mid(4, s.length() - 9); if (s == e) return s; TQString result = ""; int i = 0; while (s[i] == e[i]) result.append(e[i++]); result.append(""); TQString result2 = ""; int j = s.length() - 1; int k = e.length() - 1; while (s[j] == e[k] && k > i) { result2.prepend(e[k]); j--; k--; } result2.prepend(""); for (int m = i; m <= k; m++) result.append(e[m]); result.append(result2); return result; } QAView::QAView(TQWidget *tqparent, const char *name, WFlags f):QAViewBase(tqparent, name, f) { m_score = new WTQScore(); } QAView::~QAView() { delete txtAnswer; //Fixes #122110 on PCLOS and Ubuntu } void QAView::setQuiz(WQQuiz *quiz) { m_quiz = quiz; } void QAView::init() { m_score -> setQuestionCount(m_quiz->questionCount()); m_score -> setAsPercent(Prefs::percent()); m_hintUsed = false; m_question = 0; m_error = 0; picAnswered -> clear(); picCorrect -> clear(); picError -> clear(); TQFont f = Prefs::editorFont(); f.setWeight(TQFont::Normal); lblQuestion -> setFont(f); //lblQuestion -> font().setBold(false); lblAnswerBlank -> setFont(f); //lblAnswerBlank -> font().setBold(false); txtAnswer -> setFont(f); //txtAnswer -> font().setBold(false); lblPreviousQuestion -> setFont(f); //lblPreviousQuestion -> font().setBold(false); lblYourAnswer -> setFont(f); //lblYourAnswer -> font().setBold(false); lblCorrect -> setFont(f); //lblCorrect -> font().setBold(false); lblPreviousQuestionHeader->clear(); lblPreviousQuestion->clear(); lblYourAnswerHeader->clear(); lblYourAnswer->clear(); lblCorrectHeader->clear(); lblCorrect->clear(); picPrevious->clear(); picYourAnswer->clear(); picCorrectAnswer->clear(); KWordQuizApp *win=(KWordQuizApp *) tqparent(); win->actionCollection()->action("quiz_check")->setEnabled(true); win->actionCollection()->action("qa_hint")->setEnabled(true); win->actionCollection()->action("quiz_repeat_errors")->setEnabled(false); updateScore(); showQuestion(0); txtAnswer->show(); txtAnswer->setFocus(); } void QAView::slotCheck() { KWordQuizApp *win=(KWordQuizApp *) tqparent(); if (win->actionCollection()->action("quiz_check")->isEnabled()) { bool fIsCorrect; if (m_hintUsed && Prefs::hintError()) { //Force an Error fIsCorrect = m_quiz->checkAnswer(m_question, ""); } else { //Really check the answer fIsCorrect = m_quiz->checkAnswer(m_question, txtAnswer->text()); } //Reset for next question m_hintUsed = false; if (fIsCorrect) { picYourAnswer->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel)); lblYourAnswer->setText(m_quiz->yourAnswer(m_question, txtAnswer->text())); lblCorrectHeader->clear(); picCorrectAnswer->clear(); lblCorrect->clear(); m_score->countIncrement(WTQScore::cdCorrect); updateScore(); KNotifyClient::event(winId(), "QuizCorrect", i18n("Your answer was correct!")); } else { m_error++; picYourAnswer->setPixmap(KGlobal::iconLoader()->loadIcon("error", KIcon::Panel)); lblYourAnswer->setText(highlightError(m_quiz->answer(m_question), m_quiz->yourAnswer(m_question, txtAnswer->text()))); lblCorrect->setText(m_quiz->answer(m_question)); picCorrectAnswer->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel)); lblCorrectHeader->setText(i18n("Correct Answer")); m_score->countIncrement(WTQScore::cdError); updateScore(); KNotifyClient::event(winId(), "QuizError", i18n("Your answer was incorrect.")); } lblPreviousQuestionHeader->setText(i18n("Previous Question")); lblPreviousQuestion->setText(m_quiz->question(m_question)); picPrevious->setPixmap(KGlobal::iconLoader()->loadIcon("question", KIcon::Panel)); lblYourAnswerHeader->setText(i18n("Your Answer")); if (++m_question < m_quiz->questionCount()) { showQuestion(m_question); } else { m_quiz->finish(); win->actionCollection()->action("quiz_check")->setEnabled(false); win->actionCollection()->action("qa_hint")->setEnabled(false); win->actionCollection()->action("quiz_repeat_errors")->setEnabled((m_error > 0)); lblQuestionLanguage->setText(i18n("Summary")); lblQuestion->clear(); lblAnswerLanguage->clear(); lblAnswerBlank->hide(); txtAnswer->hide(); picQuestion->setPixmap(KGlobal::iconLoader()->loadIcon("kwordquiz", KIcon::Panel)); picAnswer->clear(); } } } void QAView::slotHint() { TQString answer = txtAnswer->text(); TQString correctAnswer = m_quiz->hint(m_question); if (correctAnswer.left(4) == "") { correctAnswer = correctAnswer.remove(""); correctAnswer = correctAnswer.remove(""); } int correctCharCount = 1; if (answer.length() > 0) { for(uint i = 0; i <= answer.length(); i++) { if (answer.at(i) == correctAnswer.at(i)) correctCharCount++; } } txtAnswer->setText(correctAnswer.left(correctCharCount)); txtAnswer->setFocus(); txtAnswer->setCursorPosition(txtAnswer->text().length()); m_hintUsed = true; } void QAView::slotRestart() { m_quiz->activateBaseList(); init(); } void QAView::slotRepeat() { m_quiz->activateErrorList(); init(); } void QAView::updateScore() { TQString s; s = s.setNum(m_quiz->questionCount(), 10); lblScoreCount->setText(s); picCount->setPixmap(KGlobal::iconLoader()->loadIcon("kwordquiz", KIcon::Panel)); s = m_score->answerText(); lblScoreAnswered->setText(s); if (!s.isEmpty()) picAnswered->setPixmap(KGlobal::iconLoader()->loadIcon("question", KIcon::Panel)); s = m_score->correctText(); lblScoreCorrect->setText(s); if (!s.isEmpty()) picCorrect->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel)); s = m_score->errorText(); lblScoreError->setText(s); if (!s.isEmpty()) picError->setPixmap(KGlobal::iconLoader()->loadIcon("error", KIcon::Panel)); } /*! \fn QAView::showQuestion(int i) */ void QAView::showQuestion(int i) { //m_quiz->setColumn(i); lblQuestionLanguage -> setText(m_quiz ->langQuestion(i)); lblQuestion -> setText(m_quiz ->question(i)); //lblQuestion -> setFont(m_quiz->fontQuestion(i)); picQuestion->setPixmap(KGlobal::iconLoader()->loadIcon(m_quiz->quizIcon(i, WQQuiz::qiLeftCol), KIcon::Panel)); lblAnswerLanguage -> setText(m_quiz ->langAnswer(i)); if (!TQString(m_quiz ->blankAnswer(i)).isEmpty()) { lblAnswerBlank->show(); //lblAnswerBlank->setFont(m_quiz->fontAnswer(i)); lblAnswerBlank->setText(m_quiz->blankAnswer(i)); } else lblAnswerBlank->hide(); //txtAnswer->setFont(m_quiz->fontAnswer(i)); txtAnswer -> setText(""); picAnswer->setPixmap(KGlobal::iconLoader()->loadIcon(m_quiz->quizIcon(i, WQQuiz::qiRightCol), KIcon::Panel)); //@todo handle keyboard layouts } void QAView::slotApplySettings( ) { m_score ->setAsPercent(Prefs::percent()); updateScore(); } void QAView::slotSpecChar( const TQChar & c) { if (txtAnswer->hasFocus()) { if (txtAnswer->hasSelectedText()) { TQString ls = txtAnswer->text(); TQString s = txtAnswer->selectedText(); int len = s.length(); int ss = txtAnswer->selectionStart(); ls = ls.tqreplace(ss, len, c); txtAnswer->setText(ls); txtAnswer->setSelection(ss, 1); } else { TQString s = txtAnswer->text(); int i = txtAnswer->cursorPosition(); s.insert(i, c); txtAnswer->setText(s); txtAnswer->setCursorPosition(i + 1); } } } #include "qaview.moc"