1 /* This file is part of KWordQuiz
2 Copyright (C) 2003 Peter Hedlund <peter@peterandlinda.com>
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation.
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 Boston, MA 02111-1307, USA.
21 #include <kiconloader.h>
23 #include <klineedit.h>
24 #include <knotifyclient.h>
28 #include "kwordquiz.h"
30 QString
highlightError(const QString
& c
, const QString
& e
)
33 if (s
.left(4) == "<qt>" && e
.left(4) != "<qt>")
34 s
= s
.mid(4, s
.length() - 9);
36 QString result
= "<qt>";
39 result
.append(e
[i
++]);
41 QString result2
= "</qt>";
42 int j
= s
.length() - 1;
43 int k
= e
.length() - 1;
46 result2
.prepend(e
[k
]);
50 result2
.prepend("</b>");
52 for (int m
= i
; m
<= k
; m
++)
55 result
.append(result2
);
60 QAView::QAView(QWidget
*parent
, const char *name
, WFlags f
):QAViewBase(parent
, name
, f
)
62 m_score
= new WQScore();
70 void QAView::setQuiz(WQQuiz
*quiz
)
77 m_score
-> setQuestionCount(m_quiz
->questionCount());
78 m_score
-> setAsPercent(Prefs::percent());
82 picAnswered
-> clear();
83 picCorrect
-> clear();
86 QFont f
= Prefs::editorFont();
87 f
.setWeight(QFont::Normal
);
88 lblQuestion
-> setFont(f
);
89 //lblQuestion -> font().setBold(false);
90 lblAnswerBlank
-> setFont(f
);
91 //lblAnswerBlank -> font().setBold(false);
92 txtAnswer
-> setFont(f
);
93 //txtAnswer -> font().setBold(false);
94 lblPreviousQuestion
-> setFont(f
);
95 //lblPreviousQuestion -> font().setBold(false);
96 lblYourAnswer
-> setFont(f
);
97 //lblYourAnswer -> font().setBold(false);
98 lblCorrect
-> setFont(f
);
99 //lblCorrect -> font().setBold(false);
101 lblPreviousQuestionHeader
->clear();
102 lblPreviousQuestion
->clear();
103 lblYourAnswerHeader
->clear();
104 lblYourAnswer
->clear();
105 lblCorrectHeader
->clear();
108 picPrevious
->clear();
109 picYourAnswer
->clear();
110 picCorrectAnswer
->clear();
112 KWordQuizApp
*win
=(KWordQuizApp
*) parent();
113 win
->actionCollection()->action("quiz_check")->setEnabled(true);
114 win
->actionCollection()->action("qa_hint")->setEnabled(true);
115 win
->actionCollection()->action("quiz_repeat_errors")->setEnabled(false);
120 txtAnswer
->setFocus();
123 void QAView::slotCheck()
125 KWordQuizApp
*win
=(KWordQuizApp
*) parent();
126 if (win
->actionCollection()->action("quiz_check")->isEnabled())
130 if (m_hintUsed
&& Prefs::hintError())
133 fIsCorrect
= m_quiz
->checkAnswer(m_question
, "");
137 //Really check the answer
138 fIsCorrect
= m_quiz
->checkAnswer(m_question
, txtAnswer
->text());
140 //Reset for next question
146 picYourAnswer
->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel
));
147 lblYourAnswer
->setText(m_quiz
->yourAnswer(m_question
, txtAnswer
->text()));
148 lblCorrectHeader
->clear();
149 picCorrectAnswer
->clear();
151 m_score
->countIncrement(WQScore::cdCorrect
);
153 KNotifyClient::event(winId(), "QuizCorrect", i18n("Your answer was correct!"));
159 picYourAnswer
->setPixmap(KGlobal::iconLoader()->loadIcon("error", KIcon::Panel
));
160 lblYourAnswer
->setText(highlightError(m_quiz
->answer(m_question
), m_quiz
->yourAnswer(m_question
, txtAnswer
->text())));
161 lblCorrect
->setText(m_quiz
->answer(m_question
));
162 //lblCorrect->setFont(m_quiz->fontAnswer(m_question));
163 picCorrectAnswer
->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel
));
164 lblCorrectHeader
->setText(i18n("Correct Answer"));
165 m_score
->countIncrement(WQScore::cdError
);
167 KNotifyClient::event(winId(), "QuizError", i18n("Your answer was incorrect."));
170 lblPreviousQuestionHeader
->setText(i18n("Previous Question"));
171 lblPreviousQuestion
->setText(m_quiz
->question(m_question
));
172 //lblPreviousQuestion->setFont(m_quiz->fontQuestion(m_question));
173 picPrevious
->setPixmap(KGlobal::iconLoader()->loadIcon("question", KIcon::Panel
));
175 lblYourAnswerHeader
->setText(i18n("Your Answer"));
177 //lblYourAnswer->setFont(m_quiz->fontAnswer(m_question));
179 if (++m_question
< m_quiz
->questionCount())
181 showQuestion(m_question
);
186 win
->actionCollection()->action("quiz_check")->setEnabled(false);
187 win
->actionCollection()->action("qa_hint")->setEnabled(false);
188 win
->actionCollection()->action("quiz_repeat_errors")->setEnabled((m_error
> 0));
190 lblQuestionLanguage
->setText(i18n("Summary"));
191 lblQuestion
->clear();
192 lblAnswerLanguage
->clear();
193 lblAnswerBlank
->hide();
195 picQuestion
->setPixmap(KGlobal::iconLoader()->loadIcon("kwordquiz", KIcon::Panel
));
201 void QAView::slotHint()
203 QString answer
= txtAnswer
->text();
204 QString correctAnswer
= m_quiz
->hint(m_question
);
206 int correctCharCount
= 1;
208 if (answer
.length() > 0)
210 for(uint i
= 0; i
<= answer
.length(); i
++)
212 if (answer
.at(i
) == correctAnswer
.at(i
))
217 txtAnswer
->setText(correctAnswer
.left(correctCharCount
));
218 txtAnswer
->setFocus();
219 txtAnswer
->setCursorPosition(txtAnswer
->text().length());
224 void QAView::slotRestart()
226 m_quiz
->activateBaseList();
230 void QAView::slotRepeat()
232 m_quiz
->activateErrorList();
236 void QAView::updateScore()
239 s
= s
.setNum(m_quiz
->questionCount(), 10);
240 lblScoreCount
->setText(s
);
241 picCount
->setPixmap(KGlobal::iconLoader()->loadIcon("kwordquiz", KIcon::Panel
));
243 s
= m_score
->answerText();
244 lblScoreAnswered
->setText(s
);
246 picAnswered
->setPixmap(KGlobal::iconLoader()->loadIcon("question", KIcon::Panel
));
248 s
= m_score
->correctText();
249 lblScoreCorrect
->setText(s
);
251 picCorrect
->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel
));
253 s
= m_score
->errorText();
254 lblScoreError
->setText(s
);
256 picError
->setPixmap(KGlobal::iconLoader()->loadIcon("error", KIcon::Panel
));
261 \fn QAView::showQuestion(int i)
263 void QAView::showQuestion(int i
)
265 //m_quiz->setColumn(i);
266 lblQuestionLanguage
-> setText(m_quiz
->langQuestion(i
));
267 lblQuestion
-> setText(m_quiz
->question(i
));
268 //lblQuestion -> setFont(m_quiz->fontQuestion(i));
270 picQuestion
->setPixmap(KGlobal::iconLoader()->loadIcon(m_quiz
->quizIcon(i
, WQQuiz::qiLeftCol
), KIcon::Panel
));
272 lblAnswerLanguage
-> setText(m_quiz
->langAnswer(i
));
274 if (!QString(m_quiz
->blankAnswer(i
)).isEmpty())
276 lblAnswerBlank
->show();
277 //lblAnswerBlank->setFont(m_quiz->fontAnswer(i));
278 lblAnswerBlank
->setText(m_quiz
->blankAnswer(i
));
281 lblAnswerBlank
->hide();
283 //txtAnswer->setFont(m_quiz->fontAnswer(i));
284 txtAnswer
-> setText("");
286 picAnswer
->setPixmap(KGlobal::iconLoader()->loadIcon(m_quiz
->quizIcon(i
, WQQuiz::qiRightCol
), KIcon::Panel
));
288 //@todo handle keyboard layouts
291 void QAView::slotApplySettings( )
293 m_score
->setAsPercent(Prefs::percent());
297 void QAView::slotSpecChar( const QChar
& c
)
299 if (txtAnswer
->hasFocus())
301 if (txtAnswer
->hasSelectedText())
303 QString ls
= txtAnswer
->text();
304 QString s
= txtAnswer
->selectedText();
305 int len
= s
.length();
306 int ss
= txtAnswer
->selectionStart();
307 ls
= ls
.replace(ss
, len
, c
);
308 txtAnswer
->setText(ls
);
309 txtAnswer
->setSelection(ss
, 1);
313 QString s
= txtAnswer
->text();
314 int i
= txtAnswer
->cursorPosition();
316 txtAnswer
->setText(s
);
317 txtAnswer
->setCursorPosition(i
+ 1);
322 #include "qaview.moc"