moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kwordquiz / src / qaview.cpp
blobf37d8c703e3d0129d8813f40d40e8919790b51dd
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.
19 #include <qlabel.h>
21 #include <kiconloader.h>
22 #include <klocale.h>
23 #include <klineedit.h>
24 #include <knotifyclient.h>
26 #include "qaview.h"
27 #include "prefs.h"
28 #include "kwordquiz.h"
30 QString highlightError(const QString & c, const QString & e)
32 QString s = c;
33 if (s.left(4) == "<qt>" && e.left(4) != "<qt>")
34 s = s.mid(4, s.length() - 9);
36 QString result = "<qt>";
37 int i = 0;
38 while (s[i] == e[i])
39 result.append(e[i++]);
40 result.append("<b>");
41 QString result2 = "</qt>";
42 int j = s.length() - 1;
43 int k = e.length() - 1;
44 while (s[j] == e[k])
46 result2.prepend(e[k]);
47 j--;
48 k--;
50 result2.prepend("</b>");
52 for (int m = i; m <= k; m++)
53 result.append(e[m]);
55 result.append(result2);
56 return result;
60 QAView::QAView(QWidget *parent, const char *name, WFlags f):QAViewBase(parent, name, f)
62 m_score = new WQScore();
66 QAView::~QAView()
70 void QAView::setQuiz(WQQuiz *quiz)
72 m_quiz = quiz;
75 void QAView::init()
77 m_score -> setQuestionCount(m_quiz->questionCount());
78 m_score -> setAsPercent(Prefs::percent());
79 m_hintUsed = false;
80 m_question = 0;
81 m_error = 0;
82 picAnswered -> clear();
83 picCorrect -> clear();
84 picError -> 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();
106 lblCorrect->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);
117 updateScore();
118 showQuestion(0);
119 txtAnswer->show();
120 txtAnswer->setFocus();
123 void QAView::slotCheck()
125 KWordQuizApp *win=(KWordQuizApp *) parent();
126 if (win->actionCollection()->action("quiz_check")->isEnabled())
128 bool fIsCorrect;
130 if (m_hintUsed && Prefs::hintError())
132 //Force an Error
133 fIsCorrect = m_quiz->checkAnswer(m_question, "");
135 else
137 //Really check the answer
138 fIsCorrect = m_quiz->checkAnswer(m_question, txtAnswer->text());
140 //Reset for next question
141 m_hintUsed = false;
143 if (fIsCorrect)
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();
150 lblCorrect->clear();
151 m_score->countIncrement(WQScore::cdCorrect);
152 updateScore();
153 KNotifyClient::event(winId(), "QuizCorrect", i18n("Your answer was correct!"));
155 else
157 m_error++;
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);
166 updateScore();
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);
183 else
185 m_quiz->finish();
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();
194 txtAnswer->hide();
195 picQuestion->setPixmap(KGlobal::iconLoader()->loadIcon("kwordquiz", KIcon::Panel));
196 picAnswer->clear();
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))
213 correctCharCount++;
217 txtAnswer->setText(correctAnswer.left(correctCharCount));
218 txtAnswer->setFocus();
219 txtAnswer->setCursorPosition(txtAnswer->text().length());
221 m_hintUsed = true;
224 void QAView::slotRestart()
226 m_quiz->activateBaseList();
227 init();
230 void QAView::slotRepeat()
232 m_quiz->activateErrorList();
233 init();
236 void QAView::updateScore()
238 QString s;
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);
245 if (!s.isEmpty())
246 picAnswered->setPixmap(KGlobal::iconLoader()->loadIcon("question", KIcon::Panel));
248 s = m_score->correctText();
249 lblScoreCorrect->setText(s);
250 if (!s.isEmpty())
251 picCorrect->setPixmap(KGlobal::iconLoader()->loadIcon("check", KIcon::Panel));
253 s = m_score->errorText();
254 lblScoreError->setText(s);
255 if (!s.isEmpty())
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));
280 else
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());
294 updateScore();
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);
311 else
313 QString s = txtAnswer->text();
314 int i = txtAnswer->cursorPosition();
315 s.insert(i, c);
316 txtAnswer->setText(s);
317 txtAnswer->setCursorPosition(i + 1);
322 #include "qaview.moc"