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 ***************************************************************************
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. *
24 ***************************************************************************/
26 #include "MCQueryDlg.h"
28 #include <kv_resource.h>
30 #include <kapplication.h>
31 #include <kstandarddirs.h>
34 #include <kprogress.h>
38 #include <qradiobutton.h>
39 #include <qbuttongroup.h>
40 #include <qpushbutton.h>
45 MCQueryDlg::MCQueryDlg(
58 : QueryDlgBase(i18n("Multiple Choice"))
60 mw
= new MCQueryDlgForm(this);
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()) );
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
,
107 //type_timeout = type_to;
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);
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
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
);
139 mw
->timebar
->setEnabled(false);
142 mw
->timebar
->setEnabled(false);
144 vector
<QString
> strings
;
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
);
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
168 ff
= exp
->getFauxAmi (q_tcol
, false).stripWhiteSpace();
170 ff
= exp
->getFauxAmi (q_ocol
, true).stripWhiteSpace();
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
);
181 strings
.push_back(act
->getOriginal());
183 strings
.push_back(act
->getTranslation(q_tcol
));
188 vector
<kvoctrainExpr
*> exprlist
;
191 srand((unsigned int)time((time_t *)NULL
));
192 int count
= MAX_MULTIPLE_CHOICE
;
193 // gather random expressions for the choice
195 int nr
= (int) (doc
->numEntries() * ((1.0*rand())/RAND_MAX
));
196 // append if new expr found
198 for (int i
= 0; newex
&& i
< (int) exprlist
.size(); i
++) {
199 if (exprlist
[i
] == doc
->getEntry(nr
))
202 if (newex
&& exp
!= doc
->getEntry(nr
)) {
204 exprlist
.push_back(doc
->getEntry(nr
));
208 for (int i
= 0; i
< (int) exprlist
.size(); i
++) {
210 strings
.push_back(exprlist
[i
]->getOriginal());
212 strings
.push_back(exprlist
[i
]->getTranslation(q_tcol
));
217 // solution is always the first
219 strings
.insert(strings
.begin(), exp
->getOriginal());
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()
288 known
= button_ref
[0].rb
->isChecked ();
290 known
= button_ref
[1].rb
->isChecked ();
292 known
= button_ref
[2].rb
->isChecked ();
294 known
= button_ref
[3].rb
->isChecked ();
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
);
335 mw
->status
->setText(getOKComment((mw
->countbar
->progress()/mw
->countbar
->totalSteps()) * 100));
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) {
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
)
366 mw
->dont_know
->setDefault(true);
368 else if (Prefs::queryTimeout() == Prefs::EnumQueryTimeout::Continue
)
369 emit
sigQueryChoice (Timeout
);
372 mw
->status
->setText("");
376 void MCQueryDlg::dontKnowClicked()
378 mw
->status
->setText("");
379 emit
sigQueryChoice (Unknown
);
383 void MCQueryDlg::slotUser2()
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
394 : exp
->getTranslation(q_ocol
));
398 void MCQueryDlg::keyPressEvent( QKeyEvent
*e
)
408 if (mw
->dont_know
->isDefault() )
410 else if (mw
->know_it
->isDefault() )
412 else if (mw
->show_all
->isDefault() )
423 void MCQueryDlg::trans1clicked()
429 void MCQueryDlg::trans2clicked()
435 void MCQueryDlg::trans3clicked()
441 void MCQueryDlg::trans4clicked()
447 void MCQueryDlg::trans5clicked()
453 #include "MCQueryDlg.moc"