summaryrefslogtreecommitdiffstats
path: root/kwordquiz/src/wqquiz.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kwordquiz/src/wqquiz.cpp')
-rw-r--r--kwordquiz/src/wqquiz.cpp586
1 files changed, 586 insertions, 0 deletions
diff --git a/kwordquiz/src/wqquiz.cpp b/kwordquiz/src/wqquiz.cpp
new file mode 100644
index 00000000..23399e5e
--- /dev/null
+++ b/kwordquiz/src/wqquiz.cpp
@@ -0,0 +1,586 @@
+/* This file is part of KWordQuiz
+ Copyright (C) 2003 Peter Hedlund <peter.hedlund@kdemail.net>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <krandomsequence.h>
+
+#include <qregexp.h>
+
+#include "wqquiz.h"
+#include "prefs.h"
+
+WQQuiz::WQQuiz(KWordQuizView * parent, const char *name) : QObject(parent, name)
+{
+ m_table = parent;
+
+ m_list.clear();
+ m_errorList.clear();
+ m_quizList.clear();
+}
+
+void WQQuiz::activateErrorList()
+{
+ m_list.clear();
+
+ WQListItem l;
+
+ QuizList::iterator it;
+ for ( it = m_errorList.begin(); it != m_errorList.end(); ++it )
+ m_list.append(*it);
+
+ m_errorList.clear();
+ m_questionCount = m_list.count();
+
+}
+
+void WQQuiz::activateBaseList()
+{
+ m_list.clear();
+
+ if (m_quizMode > 2)
+ {
+ listRandom();
+ };
+
+ QuizList::iterator it;
+ for (it = m_quizList.begin(); it != m_quizList.end(); ++it)
+ m_list.append(*it);
+
+ m_questionCount = m_list.count();
+
+}
+
+void WQQuiz::addToList(int aCol, int bCol)
+{
+ //build a list of row numbers containing text in both columns
+
+ typedef QValueList<int> IntList;
+ IntList tempList;
+ for (int current = 0; current < m_table ->numRows(); ++current)
+ {
+ if (!m_table->text(current, 0).isEmpty() && !m_table->text(current, 1).isEmpty())
+ {
+ tempList.append(current);
+ }
+ }
+
+ KRandomSequence *rs = new KRandomSequence(0);
+
+ int count = tempList.count();
+
+ IntList::ConstIterator it;
+ for ( it = tempList.begin(); it != tempList.end(); ++it )
+ {
+ WQListItem *li;
+ li = new WQListItem();
+ li->setQuestion(aCol);
+ li->setCorrect(1);
+ li->setOneOp(*it);
+
+ if (count > 2)
+ {
+
+ int a, b;
+ do
+ a = rs->getLong(count); //rand() % count;
+ while(a==*it);
+
+ li->setTwoOp(a);
+
+ do
+ b = rs->getLong(count); //rand() % count;
+ while(b == *it || b == a /*|| b < 0*/);
+
+ li->setThreeOp(b);
+
+ }
+ m_quizList.append(*li);
+
+ }
+
+}
+
+bool WQQuiz::init()
+{
+
+ bool result = false;
+ if (Prefs::enableBlanks())
+ {
+ result = m_table->checkSyntax(true, true);
+ }
+ else
+ {
+ result = true;
+ }
+
+ if (!result)
+ {
+ return false;
+ }
+
+ int aCol;
+ int bCol;
+
+ switch (m_quizMode)
+ {
+ case 1:
+ aCol = 0;
+ bCol = 1;
+ break;
+ case 2:
+ aCol = 1;
+ bCol = 0;
+ break;
+ case 3:
+ aCol = 0;
+ bCol = 1;
+ break;
+ case 4:
+ aCol = 1;
+ bCol = 0;
+ break;
+ case 5:
+ default:
+ aCol = 0;
+ bCol = 1;
+ break;
+ }
+
+ addToList(aCol, bCol);
+
+ //check if enough in list
+ switch (m_quizType)
+ {
+ case qtEditor:
+ //
+ break;
+ case qtFlash:
+ result = (m_quizList.count() > 0);
+ break;
+ case qtQA:
+ result = (m_quizList.count() > 0);
+ break;
+ case qtMultiple:
+ result = (m_quizList.count() > 2);
+ break;
+ }
+
+ if (!result)
+ {
+ return false;
+ }
+
+ if (m_quizMode == 5)
+ {
+ aCol = 1;
+ bCol = 0;
+ addToList(aCol, bCol);
+ }
+
+ //Prepare final lists
+ activateBaseList();
+ return true;
+}
+
+void WQQuiz::listRandom()
+{
+ QPtrList<void> list;
+
+ for(int i = 0; i < m_quizList.count(); i++)
+ list.append((void*) i);
+
+ KRandomSequence seq;
+ seq.randomize(&list);
+
+ QuizList items;
+ for(int i = 0; i < m_quizList.count(); i++)
+ items.append(m_quizList[(long) list.take()]);
+
+ m_quizList.clear();
+
+ for(int i = 0; i < items.count(); i++)
+ m_quizList.append(items[i]);
+}
+
+bool WQQuiz::checkAnswer(int i, const QString & a)
+{
+ bool result = false;
+ WQListItem li = m_list[i];
+ int j;
+ if (li.question() == 0)
+ {
+ j = 1;
+ }
+ else
+ {
+ j= 0;
+ }
+ QString ans = a;
+ QString tTemp = m_table -> text(li.oneOp(), j);
+ tTemp = tTemp.stripWhiteSpace();
+ ans = ans.stripWhiteSpace();
+
+ if (m_quizType == qtQA)
+ {
+ if (QString(m_correctBlank).length() > 0)
+ {
+ QStringList la, ls;
+ if (ans.find(";") > 0)
+ ls = QStringList::split(";", ans);
+ else
+ ls.append(ans);
+
+ if (m_correctBlank.find(";") > 0)
+ la = QStringList::split(";", m_correctBlank);
+ else
+ la.append(m_correctBlank);
+
+ result = (ls.count() == la.count());
+ if (result)
+ {
+ for (uint counter = 0; counter < la.count(); counter++)
+ {
+ result = (ls[counter].stripWhiteSpace() == la[counter].stripWhiteSpace());
+ if (!result)
+ break;
+ }
+ }
+ }
+ else
+ {
+ result = (ans == tTemp);
+ }
+ }
+ else
+ {
+ if (m_quizType == qtMultiple)
+ {
+ if (Prefs::enableBlanks())
+ {
+ tTemp.remove("[");
+ tTemp.remove("]");
+ }
+ result = (ans == tTemp);
+
+ }
+ else
+ {
+ result = (ans == tTemp);
+ }
+
+ }
+
+ if (!result)
+ {
+ m_errorList.append(li);
+ }
+
+ return result;
+}
+
+QStringList WQQuiz::multiOptions(int i)
+{
+ QString *s;
+ QStringList Result;
+ WQListItem li = m_list[i];
+
+ typedef QPtrList<QString> LS;
+ LS *ls;
+ ls = new QPtrList<QString>();
+
+ int j;
+ if (li.question() == 0)
+ {
+ j = 1;
+ }
+ else
+ {
+ j= 0;
+ }
+
+ s= new QString(m_table->text(li.oneOp(), j));
+ if (Prefs::enableBlanks())
+ {
+ s->remove("[");
+ s->remove("]");
+ }
+ ls->append(s);
+
+ s = new QString(m_table->text(li.twoOp(), j));
+ if (Prefs::enableBlanks())
+ {
+ s->remove("[");
+ s->remove("]");
+ }
+ ls->append(s);
+
+ s = new QString(m_table->text(li.threeOp(), j));
+ if (Prefs::enableBlanks())
+ {
+ s->remove("[");
+ s->remove("]");
+ }
+ ls->append(s);
+
+ KRandomSequence rs;
+ rs.randomize(ls);
+
+ while (ls->count())
+ {
+ Result.append(*ls->first());
+ ls->removeFirst();
+ }
+ return Result;
+}
+
+QString WQQuiz::quizIcon(int i, QuizIcon ico)
+{
+ QString s;
+ WQListItem li = m_list[i];
+ if (ico == qiLeftCol)
+ {
+ if (li.question() == 0)
+ s = "question";
+ else
+ s = "answer";
+ }
+
+ if (ico == qiRightCol)
+ {
+ if (li.question() == 0)
+ s = "answer";
+ else
+ s = "question";
+ }
+ return s;
+}
+
+QString WQQuiz::yourAnswer(int i, const QString & s)
+{
+ QString result ="";
+
+ if (QString(m_answerBlank).length() > 0)
+ {
+ QStringList ls;
+
+ if (s.find(";") > 0)
+ ls = QStringList::split(";", s, true);
+ else
+ ls.append(s);
+
+ result = m_answerBlank.replace("..........", "<u></u>");
+
+ int offset = 0, counter = 0;
+ while (offset >= 0)
+ {
+ offset = result.find("<u>", offset);
+ if (offset >= 0)
+ {
+ result.insert(offset + 3, ls[counter]);
+ offset++;
+ counter++;
+ }
+ }
+ result.append("</qt>");
+ result.prepend("<qt>");
+ }
+ else
+ {
+ result = s;
+ }
+ return result;
+}
+
+QString WQQuiz::hint(int i)
+{
+ if (QString(m_correctBlank).length() > 0)
+ {
+ return m_correctBlank;
+ }
+ else
+ {
+ return answer(i);
+ }
+}
+
+void WQQuiz::setQuizType(QuizType qt)
+{
+ m_quizType = qt;
+}
+
+void WQQuiz::setQuizMode(int qm)
+{
+ m_quizMode = qm;
+}
+
+
+QString WQQuiz::question(int i)
+{
+ WQListItem li = m_list[i];
+ QString s = m_table->text(li.oneOp(), li.question());
+ if (Prefs::enableBlanks())
+ {
+ s.remove("[");
+ s.remove("]");
+ }
+ if (m_quizType != qtFlash && i > 0)
+ {
+ WQListItem li2 = m_list[i - 1];
+ emit checkingAnswer(li2.oneOp());
+ }
+ else
+ emit checkingAnswer(li.oneOp());
+
+ return s;
+}
+
+QString WQQuiz::blankAnswer(int i)
+{
+
+ QString r = "";
+ m_correctBlank = "";
+ m_answerBlank = "";
+ QString tTemp;
+
+ if (m_quizType == qtQA && Prefs::enableBlanks())
+ {
+ WQListItem li = m_list[i];
+ int j;
+ if (li.question() == 0)
+ {
+ j = 1;
+ }
+ else
+ {
+ j= 0;
+ }
+ tTemp = m_table->text(li.oneOp(), j);
+ r = tTemp;
+ QRegExp rx;
+ rx.setMinimal(true);
+ rx.setPattern("\\[.*\\]");
+
+ r.replace(rx, "..........");
+
+ if (r != tTemp)
+ {
+ m_answerBlank = r;
+ int offset = 0;
+ while (offset >= 0)
+ {
+ offset = rx.search(tTemp, offset);
+ if (offset >= 0)
+ {
+ if (m_correctBlank.length() > 0)
+ m_correctBlank = m_correctBlank + ";" + " " + tTemp.mid(offset + 1, tTemp.find(']', offset) - offset - 1);
+ else
+ m_correctBlank = tTemp.mid(offset + 1, tTemp.find(']', offset) - offset - 1);
+ offset++;
+ }
+ }
+ }
+ }
+ return m_answerBlank;
+}
+
+QString WQQuiz::answer(int i)
+{
+ QString s;
+ WQListItem li = m_list[i];
+ int j;
+ if (li.question() == 0)
+ {
+ j = 1;
+ }
+ else
+ {
+ j= 0;
+ }
+
+
+ if (m_quizType == qtQA)
+ {
+ s = m_table->text(li.oneOp(), j);
+ if (Prefs::enableBlanks())
+ {
+ s.replace("[", "<u>");
+ s.replace("]", "</u>");
+ s.prepend("<qt>");
+ s.append("</qt>");
+ }
+ }
+ else
+ {
+ s = m_table->text(li.oneOp(), j);
+ if (Prefs::enableBlanks())
+ {
+ s.remove("[");
+ s.remove("]");
+ }
+ }
+ return s;
+}
+
+QString WQQuiz::langQuestion(int i)
+{
+ WQListItem li = m_list[i];
+ return m_table->horizontalHeader()->label(li.question());
+}
+
+QString WQQuiz::langAnswer(int i)
+{
+
+ WQListItem li = m_list[i];
+
+ int j;
+ if (li.question() == 0)
+ {
+ j = 1;
+ }
+ else
+ {
+ j= 0;
+ }
+
+ return m_table->horizontalHeader()->label(j);
+}
+
+int WQQuiz::kbAnswer(int i)
+{
+/* WQListItem *li = m_list->at(i);
+ if (li->question() == 0)
+ {
+ //@todo return m_table ->layoutLeft();
+ }
+ else
+ {
+ //@todo return m_table -> layoutRight();
+ }*/
+ return 0;
+}
+
+int WQQuiz::questionCount()
+{
+ return m_questionCount;
+}
+
+void WQQuiz::finish()
+{
+ emit checkingAnswer(-1);
+}
+
+#include "wqquiz.moc"