/*************************************************************************** Copyright 2007 Frederik Gladhorn *************************************************************************** *************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "mixedletterpracticedialog.h" #include #include #include #include #include #include #include #include #include MixedLetterPracticeDialog::MixedLetterPracticeDialog(KEduVocDocument *doc, QWidget *parent) :PracticeDialog(i18n("Image Practice"), doc, parent), Ui::MixedLetterPracticeDialog() { setupUi(mainWidget()); stopPracticeButton->setIcon( KIcon("list-remove") ); verifySolutionButton->setIcon(KIcon("dialog-ok")); connect(stopPracticeButton, SIGNAL(clicked()), SLOT(close())); connect(verifySolutionButton, SIGNAL(clicked()), SLOT(verifyClicked())); connect(showSolutionButton, SIGNAL(clicked()), SLOT(showSolution())); connect(answerLineEdit, SIGNAL(textEdited(const QString&)), SLOT(slotAnswerChanged())); countbar->setFormat("%v/%m"); timeProgressBar->setFormat("%v"); verifySolutionButton->setIcon( KIcon("dialog-ok") ); mixedLettersGraphicsView->setScene(new QGraphicsScene(mixedLettersGraphicsView)); imageGraphicsView->setVisible(false); KConfigGroup cg(KGlobal::config(), "MixedLetterPracticeDlg"); restoreDialogSize(cg); } MixedLetterPracticeDialog::~MixedLetterPracticeDialog() { KConfigGroup cg(KGlobal::config(), "MixedLetterPracticeDlg"); KDialog::saveDialogSize(cg); } void MixedLetterPracticeDialog::setEntry(TestEntry* entry) { PracticeDialog::setEntry(entry); timeProgressBar->setEnabled(Prefs::practiceTimeout()); timelabel->setEnabled(Prefs::practiceTimeout()); answerLineEdit->setFont(Prefs::tableFont()); answerLineEdit->setText(""); verifySolutionButton->setDefault(true); progCount->setText( QString::number(entry->statisticCount()) ); setWidgetStyle(answerLineEdit); answerLineEdit->setFocus(); QString original = m_entry->entry()->translation(Prefs::questionLanguage())->text(); originalLabel->setText( original ); QString solution = m_entry->entry()->translation(Prefs::solutionLanguage())->text(); // remove old items foreach ( QGraphicsItem* item, mixedLettersGraphicsView->scene()->items() ) { mixedLettersGraphicsView->scene()->removeItem(item); delete item; } m_answerTextItems.clear(); KRandomSequence random = KRandomSequence( QDateTime::currentDateTime().toTime_t() ); QList positions; for ( int i = 0; i < solution.length(); i++ ) { positions.append( (mixedLettersGraphicsView->width()-20) * i/solution.length() + 10 ); } for ( int i = 0; i < solution.length(); i++ ) { QGraphicsTextItem* textItem = new QGraphicsTextItem( QString(solution[i]) ); textItem->translate( positions.takeAt( random.getLong(positions.size()) ), mixedLettersGraphicsView->height()/4 - 5 + random.getLong( mixedLettersGraphicsView->height()/2 ) ); m_answerTextItems.append(textItem); mixedLettersGraphicsView->scene()->addItem( textItem ); } imageShowFromEntry(imageGraphicsView); } void MixedLetterPracticeDialog::slotAnswerChanged() { QString solution = m_entry->entry()->translation(Prefs::solutionLanguage())->text(); for ( int i = 0; i < solution.length(); i++ ) { if ( answerLineEdit->text()[i] == solution[i] ) { m_answerTextItems[i]->setHtml("" + solution[i] + ""); } else { // if ( i >= answerLineEdit->text().length() ) { // no input yet m_answerTextItems[i]->setHtml(QString(solution[i])); // } else { // wrong // m_answerTextItems[i]->setHtml("" + solution[i] + ""); // } } } setWidgetStyle(answerLineEdit); verifySolutionButton->setDefault(true); } void MixedLetterPracticeDialog::showSolution() { answerLineEdit->setText( m_entry->entry()->translation(Prefs::solutionLanguage())->text() ); setWidgetStyle( answerLineEdit, PositiveResult ); setAnswerTainted(); verifySolutionButton->setFocus(); } void MixedLetterPracticeDialog::verifyClicked() { double result = verifyAnswer(answerLineEdit->text(), m_entry->entry()->translation(Prefs::solutionLanguage())->text()); if ( result == 1.0 ) { resultCorrect(); emit currentEntryFinished(); } else { setWidgetStyle( answerLineEdit, NegativeResult ); setAnswerTainted(); } } void MixedLetterPracticeDialog::setProgressCounter(int current, int total) { countbar->setMaximum(total); countbar->setValue(current); } QProgressBar * MixedLetterPracticeDialog::timebar() { return timeProgressBar; } #include "mixedletterpracticedialog.moc"