moved kdeaccessibility kdeaddons kdeadmin kdeartwork kdebindings kdeedu kdegames...
[kdeedu.git] / kvoctrain / kvoctrain / query-dialogs / MCQueryDlg.cpp
blob00e102cef585abbea905921b6fd12a8ab2ce6a89
1 /***************************************************************************
3 multiple choice query dialog
5 -----------------------------------------------------------------------
7 begin : Thu Nov 25 11:45:53 MET 1999
9 copyright : (C) 1999-2001 Ewald Arnold <kvoctrain@ewald-arnold.de>
10 (C) 2001 The KDE-EDU team
11 (C) 2004-2005 Peter Hedlund <peter@peterandlinda.com>
13 -----------------------------------------------------------------------
15 ***************************************************************************
17 ***************************************************************************
18 * *
19 * This program is free software; you can redistribute it and/or modify *
20 * it under the terms of the GNU General Public License as published by *
21 * the Free Software Foundation; either version 2 of the License, or *
22 * (at your option) any later version. *
23 * *
24 ***************************************************************************/
26 #include "MCQueryDlg.h"
28 #include <kv_resource.h>
30 #include <kapplication.h>
31 #include <kstandarddirs.h>
32 #include <klocale.h>
33 #include <kdebug.h>
34 #include <kprogress.h>
36 #include <qtimer.h>
37 #include <qlabel.h>
38 #include <qradiobutton.h>
39 #include <qbuttongroup.h>
40 #include <qpushbutton.h>
42 #include <algorithm>
43 using namespace std;
45 MCQueryDlg::MCQueryDlg(
46 QString org,
47 QString trans,
48 int entry,
49 int orgcol,
50 int transcol,
51 int q_cycle,
52 int q_num,
53 int q_start,
54 kvoctrainExpr *exp,
55 kvoctrainDoc *doc,
56 int mqtime,
57 bool _show)
58 : QueryDlgBase(i18n("Multiple Choice"))
60 mw = new MCQueryDlgForm(this);
61 setMainWidget(mw);
63 mw->transgroup->insert(mw->rb_trans1);
64 mw->transgroup->insert(mw->rb_trans2);
65 mw->transgroup->insert(mw->rb_trans3);
66 mw->transgroup->insert(mw->rb_trans4);
67 mw->transgroup->insert(mw->rb_trans5);
69 connect( mw->dont_know, SIGNAL(clicked()), SLOT(dontKnowClicked()) );
70 connect( mw->know_it, SIGNAL(clicked()), SLOT(knowItClicked()) );
71 // connect( verify, SIGNAL(clicked()), SLOT(verifyClicked()) );
72 connect( mw->show_all, SIGNAL(clicked()), SLOT(showItClicked()) );
73 connect( mw->rb_trans5, SIGNAL(clicked()), SLOT(trans5clicked()) );
74 connect( mw->rb_trans4, SIGNAL(clicked()), SLOT(trans4clicked()) );
75 connect( mw->rb_trans3, SIGNAL(clicked()), SLOT(trans3clicked()) );
76 connect( mw->rb_trans2, SIGNAL(clicked()), SLOT(trans2clicked()) );
77 connect( mw->rb_trans1, SIGNAL(clicked()), SLOT(trans1clicked()) );
79 qtimer = 0;
81 setQuery (org, trans, entry, orgcol, transcol, q_cycle, q_num, q_start, exp, doc, mqtime, _show);
82 mw->countbar->setFormat("%v/%m");
83 mw->timebar->setFormat("%v");
84 resize(configDialogSize("MCQueryDialog"));
88 MCQueryDlg::~MCQueryDlg()
90 saveDialogSize("MCQueryDialog");
94 void MCQueryDlg::setQuery(QString org,
95 QString trans,
96 int entry,
97 int orgcol,
98 int transcol,
99 int q_cycle,
100 int q_num,
101 int q_start,
102 kvoctrainExpr *exp,
103 kvoctrainDoc *doc,
104 int mqtime,
105 bool _show)
107 //type_timeout = type_to;
108 kv_doc = doc;
109 q_row = entry;
110 q_ocol = orgcol;
111 q_tcol = transcol;
112 translation = trans;
113 showCounter = _show,
114 mw->timebar->setEnabled(showCounter);
115 mw->timelabel->setEnabled(showCounter);
116 mw->orgField->setFont(Prefs::tableFont());
117 mw->orgField->setText (org);
118 mw->show_all->setDefault(true);
119 QString s;
120 s.setNum (q_cycle);
121 mw->progCount->setText (s);
123 mw->countbar->setTotalSteps(q_start);
124 mw->countbar->setProgress(q_start - q_num + 1);
126 if (mqtime >= 1000) { // more than 1000 milli-seconds
127 if (qtimer == 0) {
128 qtimer = new QTimer( this );
129 connect( qtimer, SIGNAL(timeout()), this, SLOT(timeoutReached()) );
132 if (Prefs::queryTimeout() != Prefs::EnumQueryTimeout::NoTimeout) {
133 timercount = mqtime/1000;
134 mw->timebar->setTotalSteps(timercount);
135 mw->timebar->setProgress(timercount);
136 qtimer->start(1000, TRUE);
138 else
139 mw->timebar->setEnabled(false);
141 else
142 mw->timebar->setEnabled(false);
144 vector<QString> strings;
145 button_ref.clear();
146 button_ref.push_back(RB_Label(mw->rb_trans1, mw->trans1));
147 button_ref.push_back(RB_Label(mw->rb_trans2, mw->trans2));
148 button_ref.push_back(RB_Label(mw->rb_trans3, mw->trans3));
149 button_ref.push_back(RB_Label(mw->rb_trans4, mw->trans4));
150 button_ref.push_back(RB_Label(mw->rb_trans5, mw->trans5));
151 random_shuffle(button_ref.begin(), button_ref.end() );
152 resetButton(button_ref[0].rb, button_ref[0].label);
153 resetButton(button_ref[1].rb, button_ref[1].label);
154 resetButton(button_ref[2].rb, button_ref[2].label);
155 resetButton(button_ref[3].rb, button_ref[3].label);
156 resetButton(button_ref[4].rb, button_ref[4].label);
158 solution = 0;
160 MultipleChoice mc = exp->getMultipleChoice(q_tcol);
161 for (unsigned i = 0; i < QMIN(MAX_MULTIPLE_CHOICE, mc.size()); ++i)
162 strings.push_back(mc.mc(i));
163 std::random_shuffle(strings.begin(), strings.end());
165 // always include false friend
166 QString ff;
167 if (q_tcol != 0)
168 ff = exp->getFauxAmi (q_tcol, false).stripWhiteSpace();
169 else
170 ff = exp->getFauxAmi (q_ocol, true).stripWhiteSpace();
172 if (ff.length())
173 strings.insert(strings.begin(), ff);
175 if (doc->numEntries() <= MAX_MULTIPLE_CHOICE) {
176 for (int i = strings.size(); i < doc->numEntries(); ++i ) {
177 kvoctrainExpr *act = doc->getEntry(i);
179 if (act != exp) {
180 if (q_tcol == 0)
181 strings.push_back(act->getOriginal());
182 else
183 strings.push_back(act->getTranslation(q_tcol));
187 else {
188 vector<kvoctrainExpr*> exprlist;
189 solution = 0;
191 srand((unsigned int)time((time_t *)NULL));
192 int count = MAX_MULTIPLE_CHOICE;
193 // gather random expressions for the choice
194 while (count > 0) {
195 int nr = (int) (doc->numEntries() * ((1.0*rand())/RAND_MAX));
196 // append if new expr found
197 bool newex = true;
198 for (int i = 0; newex && i < (int) exprlist.size(); i++) {
199 if (exprlist[i] == doc->getEntry(nr))
200 newex = false;
202 if (newex && exp != doc->getEntry(nr)) {
203 count--;
204 exprlist.push_back(doc->getEntry(nr));
208 for (int i = 0; i < (int) exprlist.size(); i++) {
209 if (q_tcol == 0)
210 strings.push_back(exprlist[i]->getOriginal());
211 else
212 strings.push_back(exprlist[i]->getTranslation(q_tcol));
217 // solution is always the first
218 if (q_tcol == 0)
219 strings.insert(strings.begin(), exp->getOriginal());
220 else
221 strings.insert(strings.begin(), exp->getTranslation(q_tcol));
223 for (int i = strings.size(); i < MAX_MULTIPLE_CHOICE; i++ )
224 strings.push_back("");
226 if (strings.size() > MAX_MULTIPLE_CHOICE)
227 strings.erase(strings.begin()+MAX_MULTIPLE_CHOICE, strings.end());
229 button_ref[0].rb->setEnabled(!strings[0].isEmpty() );
230 button_ref[1].rb->setEnabled(!strings[1].isEmpty() );
231 button_ref[2].rb->setEnabled(!strings[2].isEmpty() );
232 button_ref[3].rb->setEnabled(!strings[3].isEmpty() );
233 button_ref[4].rb->setEnabled(!strings[4].isEmpty() );
235 button_ref[0].label->setEnabled(!strings[0].isEmpty() );
236 button_ref[1].label->setEnabled(!strings[1].isEmpty() );
237 button_ref[2].label->setEnabled(!strings[2].isEmpty() );
238 button_ref[3].label->setEnabled(!strings[3].isEmpty() );
239 button_ref[4].label->setEnabled(!strings[4].isEmpty() );
241 button_ref[0].label->setText(strings[0]);
242 button_ref[0].label->setFont(Prefs::tableFont());
243 button_ref[1].label->setText(strings[1]);
244 button_ref[1].label->setFont(Prefs::tableFont());
245 button_ref[2].label->setText(strings[2]);
246 button_ref[2].label->setFont(Prefs::tableFont());
247 button_ref[3].label->setText(strings[3]);
248 button_ref[3].label->setFont(Prefs::tableFont());
249 button_ref[4].label->setText(strings[4]);
250 button_ref[4].label->setFont(Prefs::tableFont());
252 mw->rb_trans1->setChecked (false);
253 mw->rb_trans2->setChecked (false);
254 mw->rb_trans3->setChecked (false);
255 mw->rb_trans4->setChecked (false);
256 mw->rb_trans5->setChecked (false);
258 mw->show_all->setFocus();
262 void MCQueryDlg::initFocus() const
264 mw->rb_trans1->setFocus();
268 void MCQueryDlg::showItClicked()
270 resetButton(button_ref[0].rb, button_ref[0].label);
271 resetButton(button_ref[1].rb, button_ref[1].label);
272 resetButton(button_ref[2].rb, button_ref[2].label);
273 resetButton(button_ref[3].rb, button_ref[3].label);
274 resetButton(button_ref[4].rb, button_ref[4].label);
276 button_ref[solution].rb->setFocus();
277 button_ref[solution].rb->setChecked(true);
278 verifyButton(button_ref[solution].rb, true, button_ref[solution].label);
279 mw->dont_know->setDefault(true);
283 void MCQueryDlg::verifyClicked()
286 bool known = false;
287 if (solution == 0)
288 known = button_ref[0].rb->isChecked ();
289 if (solution == 1)
290 known = button_ref[1].rb->isChecked ();
291 if (solution == 2)
292 known = button_ref[2].rb->isChecked ();
293 if (solution == 3)
294 known = button_ref[3].rb->isChecked ();
295 if (solution == 4)
296 known = button_ref[4].rb->isChecked ();
298 if (button_ref[0].rb->isChecked() ) {
299 verifyButton(button_ref[0].rb, known, button_ref[0].label);
300 resetButton(button_ref[1].rb, button_ref[1].label);
301 resetButton(button_ref[2].rb, button_ref[2].label);
302 resetButton(button_ref[3].rb, button_ref[3].label);
303 resetButton(button_ref[4].rb, button_ref[4].label);
305 else if (button_ref[1].rb->isChecked() ) {
306 resetButton(button_ref[0].rb, button_ref[0].label);
307 verifyButton(button_ref[1].rb, known, button_ref[1].label);
308 resetButton(button_ref[2].rb, button_ref[2].label);
309 resetButton(button_ref[3].rb, button_ref[3].label);
310 resetButton(button_ref[4].rb, button_ref[4].label);
312 else if (button_ref[2].rb->isChecked() ) {
313 resetButton(button_ref[0].rb, button_ref[0].label);
314 resetButton(button_ref[1].rb, button_ref[1].label);
315 verifyButton(button_ref[2].rb, known, button_ref[2].label);
316 resetButton(button_ref[3].rb, button_ref[3].label);
317 resetButton(button_ref[4].rb, button_ref[4].label);
319 else if (button_ref[3].rb->isChecked() ) {
320 resetButton(button_ref[0].rb, button_ref[0].label);
321 resetButton(button_ref[1].rb, button_ref[1].label);
322 resetButton(button_ref[2].rb, button_ref[2].label);
323 verifyButton(button_ref[3].rb, known, button_ref[3].label);
324 resetButton(button_ref[4].rb, button_ref[4].label);
326 else if (button_ref[4].rb->isChecked() ) {
327 resetButton(button_ref[0].rb, button_ref[0].label);
328 resetButton(button_ref[1].rb, button_ref[1].label);
329 resetButton(button_ref[2].rb, button_ref[2].label);
330 resetButton(button_ref[3].rb, button_ref[3].label);
331 verifyButton(button_ref[4].rb, known, button_ref[4].label);
334 if (known) {
335 mw->status->setText(getOKComment((mw->countbar->progress()/mw->countbar->totalSteps()) * 100));
336 knowItClicked();
338 else {
339 mw->status->setText(getNOKComment((mw->countbar->progress()/mw->countbar->totalSteps()) * 100));
340 mw->dont_know->setDefault(true);
345 void MCQueryDlg::knowItClicked()
347 mw->status->setText("");
348 emit sigQueryChoice (Known);
352 void MCQueryDlg::timeoutReached()
354 if (timercount > 0) {
355 timercount--;
356 mw->timebar->setProgress(timercount);
357 qtimer->start(1000, TRUE);
360 if (timercount <= 0) {
361 mw->status->setText(getTimeoutComment((mw->countbar->progress()/mw->countbar->totalSteps()) * 100));
362 mw->timebar->setProgress(0);
363 if (Prefs::queryTimeout() == Prefs::EnumQueryTimeout::Show)
365 showItClicked();
366 mw->dont_know->setDefault(true);
368 else if (Prefs::queryTimeout() == Prefs::EnumQueryTimeout::Continue)
369 emit sigQueryChoice (Timeout);
371 else
372 mw->status->setText("");
376 void MCQueryDlg::dontKnowClicked()
378 mw->status->setText("");
379 emit sigQueryChoice (Unknown);
383 void MCQueryDlg::slotUser2()
386 if (qtimer != 0)
387 qtimer->stop();
389 emit sigEditEntry (q_row, KV_COL_ORG+q_ocol);
391 kvoctrainExpr *exp = kv_doc->getEntry(q_row);
392 mw->orgField->setText (q_ocol == 0
393 ? exp->getOriginal()
394 : exp->getTranslation(q_ocol));
398 void MCQueryDlg::keyPressEvent( QKeyEvent *e )
400 switch( e->key() )
402 case Key_Escape:
403 dontKnowClicked();
404 break;
406 case Key_Return:
407 case Key_Enter:
408 if (mw->dont_know->isDefault() )
409 dontKnowClicked();
410 else if (mw->know_it->isDefault() )
411 knowItClicked();
412 else if (mw->show_all->isDefault() )
413 showItClicked();
414 break;
416 default:
417 e->ignore();
418 break;
423 void MCQueryDlg::trans1clicked()
425 verifyClicked();
429 void MCQueryDlg::trans2clicked()
431 verifyClicked();
435 void MCQueryDlg::trans3clicked()
437 verifyClicked();
441 void MCQueryDlg::trans4clicked()
443 verifyClicked();
447 void MCQueryDlg::trans5clicked()
449 verifyClicked();
453 #include "MCQueryDlg.moc"