You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/klatin/klatin/klatingrammar.cpp

244 lines
6.4 KiB

/***************************************************************************
begin : Thu Jul 17
copyright : (C) 2001-2004 by George Wright
email : gwright@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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 <tqfile.h>
#include <tqlabel.h>
#include <tdeapplication.h>
#include <kcombobox.h>
#include <kiconloader.h>
#include <klineedit.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kpushbutton.h>
#include <kstandarddirs.h>
#include <stdlib.h>
#include <time.h>
#include "klatingrammar.h"
KLatinGrammar::KLatinGrammar(TQWidget* parent, const char *name)
: KLatinGrammarWidget(parent, name)
{
// Set defaults
m_total = 0;
m_totalCorrect = 0;
m_numWrong = 0;
OKButton->setIconSet(TDEGlobal::iconLoader()->loadIconSet("button_ok", TDEIcon::Small));
BackButton->setIconSet(TDEGlobal::iconLoader()->loadIconSet("back", TDEIcon::Small));
// Set connections
connect(BackButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(goBack()));
connect(OKButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(checkAnswer()));
connect(AnswerBox, TQT_SIGNAL(returnPressed()), this, TQT_SLOT(checkAnswer()));
connect(ChooseSection, TQT_SIGNAL(activated(int)), this, TQT_SLOT(loadDatabase()));
// Insert the various declensions
ChooseSection->insertItem(i18n("All Declensions"));
ChooseSection->insertItem(i18n("1st Feminine"));
ChooseSection->insertItem(i18n("2nd Masculine"));
ChooseSection->insertItem(i18n("2nd Neuter"));
ChooseSection->insertItem(i18n("3rd Masc/Fem"));
ChooseSection->insertItem(i18n("3rd Neuter"));
ChooseSection->insertItem(i18n("4th Masc/Fem"));
ChooseSection->insertItem(i18n("4th Neuter"));
ChooseSection->insertItem(i18n("5th Feminine"));
// Load the database of nouns
loadDatabase();
AnswerBox->setFocus();
}
KLatinGrammar::~KLatinGrammar()
{
}
void KLatinGrammar::loadDatabase()
{
int curitem = ChooseSection->currentItem();
if ( curitem != 0 ) {
curitem--;
}
else
{
// Seed the random number generator
srandom(time(NULL));
curitem = (random() % 8);
}
// Various files that are used for each declension
TQString file = "klatin/data/grammar/";
switch (curitem) {
case 0:
file += "puella.klat";
break;
case 1:
file += "servus.klat";
break;
case 2:
file += "bellum.klat";
break;
case 3:
file += "rex.klat";
break;
case 4:
file += "opus.klat";
break;
case 5:
file += "gradus.klat";
break;
case 6:
file += "genu.klat";
break;
case 7:
file += "res.klat";
break;
default: // fake case...
file += "foo.klat";
}
// Check whether the file actually exists
// If not - warn user.
if (TQFile::exists(locate("data", file)) == FALSE) {
KMessageBox::error(this, i18n("Could not load grammar-definition file, check KLatin installation."), i18n("Error with KLatin"));
QuestionLabel->setText(i18n("Error."));
return;
}
KEduVocDataItemList grammar = KEduVocData::parse(locate("data", file));
// Load XML file into memory
int numberOfWords = 0;
for(KEduVocDataItemList::Iterator dataIt = grammar.begin(); dataIt != grammar.end(); ++dataIt) {
m_noun[numberOfWords] = grammar[numberOfWords].originalText();
numberOfWords++;
}
nextQuestion();
}
void KLatinGrammar::goBack()
{
emit exited();
close();
}
void KLatinGrammar::nextQuestion()
{
emit statusMsg(i18n("Grammar"));
// Seed the random number generator
srandom(time(NULL));
m_grammarNumber = (random() % 12) + 1;
TQString questionString;
// Question string...
switch (m_grammarNumber) {
case 1:
questionString = i18n("What is the nominative singular of %1?").arg(m_noun[0]);
break;
case 2:
questionString = i18n("What is the vocative singular of %1?").arg(m_noun[0]);
break;
case 3:
questionString = i18n("What is the accusative singular of %1?").arg(m_noun[0]);
break;
case 4:
questionString = i18n("What is the genitive singular of %1?").arg(m_noun[0]);
break;
case 5:
questionString = i18n("What is the dative singular of %1?").arg(m_noun[0]);
break;
case 6:
questionString = i18n("What is the ablative singular of %1?").arg(m_noun[0]);
break;
case 7:
questionString = i18n("What is the nominative plural of %1?").arg(m_noun[0]);
break;
case 8:
questionString = i18n("What is the vocative plural of %1?").arg(m_noun[0]);
break;
case 9:
questionString = i18n("What is the accusative plural of %1?").arg(m_noun[0]);
break;
case 10:
questionString = i18n("What is the genitive plural of %1?").arg(m_noun[0]);
break;
case 11:
questionString = i18n("What is the dative plural of %1?").arg(m_noun[0]);
break;
case 12:
questionString = i18n("What is the ablative plural of %1?").arg(m_noun[0]);
break;
}
// Set question on screen
QuestionLabel->setText(questionString);
}
void KLatinGrammar::checkAnswer()
{
if (m_noun[m_grammarNumber - 1] != AnswerBox->text().lower()) {
m_numWrong++;
// Allow a tolerance of 1 retry
if (m_numWrong == 2) {
m_numWrong = 0;
KMessageBox::information(this, i18n("The correct answer was %1.").arg(m_noun[m_grammarNumber - 1]), i18n("Wrong"));
if (ChooseSection->currentItem()==0)
loadDatabase();
else
nextQuestion();
} else {
if (AnswerBox->text().isEmpty()) {
emit statusMsg(i18n("Please enter an answer"));
}
}
} else {
m_totalCorrect++;
// Reset the number of questions that were wrong
m_numWrong = 0;
if (ChooseSection->currentItem()==0)
loadDatabase();
else
nextQuestion();
}
m_total++;
AnswerBox->setText(NULL);
updateScores();
}
void KLatinGrammar::updateScores()
{
// Update the score labels
Score1Label->setNum(m_totalCorrect);
Score2Label->setNum(m_total);
// Set percentage
PercentageLabel->setText(TQString::number(int(double(m_totalCorrect) / m_total * 100))+TQString("%"));
}
#include "klatingrammar.moc"