21 #include <KMessageBox>
23 #include <keduvocdocument.h>
24 #include <keduvocwordtype.h>
25 #include <keduvocexpression.h>
30 using namespace Practice;
39 kDebug() <<
"Filter for " << m_fromTranslation <<
" to " << m_toTranslation;
42 DocumentSettings documentSettings(m_doc->url().url() + QString::number(m_toTranslation));
43 documentSettings.readConfig();
44 m_tenses = documentSettings.conjugationTenses();
45 kDebug() <<
"Tenses" << m_tenses;
51 void EntryFilter::expireEntries()
55 foreach (KEduVocExpression* entry, m_entries) {
56 int grade = entry->translation(m_toTranslation)->grade();
58 const QDateTime &date = entry->translation(m_toTranslation)->practiceDate();
60 const QDateTime &expireDate = QDateTime::currentDateTime().addSecs( -
Prefs::expireItem(grade) );
62 if ( date < expireDate && grade > 0) {
64 entry->translation(m_toTranslation)->decGrade();
67 entry->translation(m_toTranslation)->setPracticeDate( QDateTime::currentDateTime().addSecs( -
Prefs::expireItem( grade - 2) ) );
71 kDebug() <<
"Expired words dropped their grade: " << counter;
78 m_entries = m_doc->lesson()->entries(KEduVocLesson::Recursive).toSet();
81 static QString noEntriesError =
82 i18n(
"The vocabulary document contains no entries that can be used for the chosen type"
85 kDebug() <<
"Document contains " << m_entries.count() <<
" valid entries.";
86 if (m_entries.count() == 0) {
87 KMessageBox::error(0, noEntriesError);
88 return QList<TestEntry*>();
108 timesPracticedEntries();
109 minMaxGradeEntries();
113 bool ignoreBlocked =
false;
114 if (m_currentSelection.count() == 0) {
115 kDebug() <<
"Creating practice filter dialog.";
117 m_dialog->setCaption(i18n(
"Start Practice"));
120 m_dialog->setMainWidget(widget);
121 m_dialog->setButtons( KDialog::Ok | KDialog::Cancel );
123 ui.lessonLabel ->setText(QString::number(m_entries.count() - m_entriesLesson.count()));
124 ui.wordTypeLabel ->setText(QString::number(m_entries.count() - m_entriesWordType.count()));
125 ui.blockedLabel ->setText(QString::number(m_entries.count() - m_entriesNotBlocked.count()));
126 ui.timesWrongLabel ->setText(QString::number(m_entries.count() - m_entriesTimesWrong.count()));
127 ui.timesPracticedLabel->setText(QString::number(m_entries.count() - m_entriesTimesPracticed.count()));
128 ui.minMaxGradeLabel ->setText(QString::number(m_entries.count() - m_entriesMinMaxGrade.count()));
130 ui.documentTotalLabel->setText(QString::number(m_entries.count()));
133 ui.lessonCheckBox->setChecked(!m_entriesLesson.count());
134 ui.wordTypeCheckBox->setChecked(!m_entriesWordType.count());
135 ui.blockedCheckBox->setChecked(!m_entriesNotBlocked.count());
136 ui.timesWrongCheckBox->setChecked(!m_entriesTimesWrong.count());
137 ui.timesPracticedCheckBox->setChecked(!m_entriesTimesPracticed.count());
138 ui.minMaxGradeCheckBox->setChecked(!m_entriesMinMaxGrade.count());
140 connect( ui.lessonCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
141 connect( ui.wordTypeCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
142 connect( ui.blockedCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
143 connect( ui.timesWrongCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
144 connect( ui.timesPracticedCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
145 connect( ui.minMaxGradeCheckBox, SIGNAL(toggled(
bool)),
this, SLOT(checkBoxChanged(
bool)));
150 ui.wordTypeLabel->setVisible(
false);
151 ui.wordTypeCheckBox->setVisible(
false);
154 if (m_dialog->exec() == QDialog::Rejected) {
156 return QList<TestEntry*>();
158 ignoreBlocked = ui.blockedCheckBox->isChecked();
163 QList< TestEntry* > ret = conjugationTestEntries(ignoreBlocked);
164 if (ret.count() == 0) {
165 KMessageBox::error(0, noEntriesError);
169 QList<TestEntry*> testEntries;
170 foreach (KEduVocExpression* entry, m_currentSelection){
171 randomizedInsert(testEntries,
new TestEntry(entry));
177 void EntryFilter::checkBoxChanged(
bool filter)
185 QSet< KEduVocExpression * > selected = m_entries;
186 if (!m_dialog || !ui.lessonCheckBox->isChecked()) {
187 selected = selected.intersect(m_entriesLesson);
189 if (!m_dialog || !ui.wordTypeCheckBox->isChecked()) {
190 selected = selected.intersect(m_entriesWordType);
192 if (!m_dialog || !ui.blockedCheckBox->isChecked()) {
193 selected = selected.intersect(m_entriesNotBlocked);
195 if (!m_dialog || !ui.timesWrongCheckBox->isChecked()) {
196 selected = selected.intersect(m_entriesTimesWrong);
198 if (!m_dialog || !ui.timesPracticedCheckBox->isChecked()) {
199 selected = selected.intersect(m_entriesTimesPracticed);
201 if (!m_dialog || !ui.minMaxGradeCheckBox->isChecked()) {
202 selected = selected.intersect(m_entriesMinMaxGrade);
206 ui.totalLabel->setText(QString::number(selected.count()));
207 m_dialog->enableButtonOk(selected.count() > 0);
210 m_currentSelection = selected;
213 void EntryFilter::lessonEntries()
215 foreach(KEduVocExpression* entry, m_entries) {
216 if (entry->lesson()->inPractice()) {
217 m_entriesLesson.insert(entry);
222 void EntryFilter::wordTypeEntries()
225 foreach(KEduVocExpression* entry, m_entries) {
226 if (entry->translation(m_toTranslation)->wordType()) {
227 if(entry->translation(m_toTranslation)->wordType()->inPractice()) {
228 m_entriesWordType.insert(entry);
233 m_entriesWordType = m_entries;
237 void EntryFilter::blockedEntries()
240 m_entriesNotBlocked = m_entries;
246 foreach(KEduVocExpression* entry, m_entries) {
247 if (!isConjugationBlocked(entry->translation(m_toTranslation))) {
248 m_entriesNotBlocked.insert(entry);
253 foreach(KEduVocExpression* entry, m_entries) {
254 KEduVocText article = entry->translation(m_toTranslation)->article();
255 if (!isBlocked(&article)) {
256 m_entriesNotBlocked.insert(entry);
261 foreach(KEduVocExpression* entry, m_entries) {
262 KEduVocTranslation* translation = entry->translation(m_toTranslation);
263 KEduVocText comparative = translation->comparativeForm();
264 KEduVocText superlative = translation->superlativeForm();
265 if (!isBlocked(&(comparative))
266 || !isBlocked(&(superlative)) )
268 m_entriesNotBlocked.insert(entry);
273 foreach(KEduVocExpression* entry, m_entries) {
274 if (!isBlocked(entry->translation(m_toTranslation))) {
275 m_entriesNotBlocked.insert(entry);
282 bool EntryFilter::isConjugationBlocked(KEduVocTranslation* translation)
const
284 foreach(
const QString& tense, translation->conjugationTenses()) {
285 if(m_tenses.contains(tense)) {
286 QList<KEduVocWordFlags> pronouns = translation->conjugation(tense).keys();
287 foreach(
const KEduVocWordFlags& pronoun, pronouns) {
288 KEduVocText grade = translation->conjugation(tense).conjugation(pronoun);
289 if (!isBlocked(&(grade))) {
300 bool EntryFilter::isBlocked(
const KEduVocText*
const text)
const
302 grade_t grade = text->grade();
307 QDateTime date = text->practiceDate();
316 void EntryFilter::timesWrongEntries()
318 foreach(KEduVocExpression* entry, m_entries) {
320 m_entriesTimesWrong.insert(entry);
325 void EntryFilter::timesPracticedEntries()
327 foreach(KEduVocExpression* entry, m_entries) {
329 m_entriesTimesPracticed.insert(entry);
334 void EntryFilter::minMaxGradeEntries()
336 foreach(KEduVocExpression* entry, m_entries) {
338 entry->translation(m_toTranslation)->grade();
340 m_entriesMinMaxGrade.insert(entry);
370 void EntryFilter::cleanupInvalid()
377 QSet<KEduVocExpression*>::iterator i = m_entries.begin();
378 while (i != m_entries.end()) {
380 if ((*i)->translation(m_toTranslation)->text().isEmpty()
381 || (*i)->translation(m_fromTranslation)->text().isEmpty()) {
382 i = m_entries.erase(i);
387 if (wordTypeNeeded && !(*i)->translation(m_toTranslation)->wordType()) {
388 i = m_entries.erase(i);
397 if ((*i)->translation(m_toTranslation)->example().simplified().isEmpty()){
398 i = m_entries.erase(i);
404 if (!((*i)->translation(m_toTranslation)->wordType()->wordType() & KEduVocWordFlag::Noun)) {
405 i = m_entries.erase(i);
413 (((*i)->translation(m_toTranslation)->wordType()->wordType() != KEduVocWordFlag::Adjective)
414 && ((*i)->translation(m_toTranslation)->wordType()->wordType() != KEduVocWordFlag::Adverb))
416 || ((*i)->translation(m_toTranslation)->comparative().isEmpty() || (*i)->translation(m_toTranslation)->superlative().isEmpty())) {
417 i = m_entries.erase(i);
423 KEduVocTranslation* translation = (*i)->translation(m_toTranslation);
427 if (translation->wordType()->wordType() != KEduVocWordFlag::Verb) {
432 QSet<QString> practice_tenses = QSet<QString>::fromList(m_tenses);
433 QSet<QString> existing_tenses;
434 foreach(
const QString& tense, translation->conjugationTenses()) {
435 if (!translation->conjugation(tense).isEmpty()) {
436 existing_tenses << tense;
439 if (existing_tenses.intersect(practice_tenses).isEmpty()) erase =
true;
442 i = m_entries.erase(i);
452 kDebug() <<
"Invalid items removed. Remaining: " << m_entries.count();
455 QList< TestEntry* > EntryFilter::conjugationTestEntries(
bool ignoreBlocked)
const
457 kDebug() <<
"Filtering conjugation entries for tenses... " << m_tenses;
465 MODE mode = M_SEPARATE;
467 QList<TestEntry*> testEntries;
468 foreach (KEduVocExpression* entry, m_currentSelection) {
469 foreach(
const QString& tense, entry->translation(m_toTranslation)->conjugationTenses()) {
472 if (!m_tenses.contains(tense)) {
475 KEduVocConjugation& conjugation = entry->translation(m_toTranslation)->conjugation(tense);
476 if (conjugation.isEmpty()) {
481 QList<KEduVocWordFlags> pronouns = conjugation.keys();
482 foreach(
const KEduVocWordFlags& pronoun, pronouns) {
483 KEduVocText* grade = &conjugation.conjugation(pronoun);
484 if (ignoreBlocked || !isBlocked(grade)) {
487 if (mode == M_SEPARATE)
491 QList<KEduVocWordFlags> list;
494 randomizedInsert(testEntries, testEntry);
499 if (!blocked && mode == M_COMPLETE) {
503 randomizedInsert(testEntries, testEntry);
511 void EntryFilter::randomizedInsert(QList<TestEntry*>& list,
TestEntry* entry)
513 list.insert(KRandom::random() % (list.size()+1), entry);
516 #include "entryfilter.moc"
static bool wordTypesInPracticeEnabled()
Get Only selected word types will be included in practice.
static EnumPracticeMode::type practiceMode()
Get The practice mode that is currently selected.
static int practiceMinimumGrade()
Get The entry must have at least this grade to be included in the practice (0..7).
static int practiceMaximumTimesAsked()
Get The entry must have been asked at most this often to be included in the practice.
static int questionLanguage()
Get The language that is displayed in a test.
static int expireItem(int i)
Get Amount of time after which different grades should expire.
static int blockItem(int i)
Get Amount of time different grades should be blocked.
void setConjugationTense(const QString &tense)
static int practiceMinimumTimesAsked()
Get The entry must have been asked at least this often to be included in the practice.
static bool expire()
Get In Blocking Query Tab Dialog, if checked then the Query accepts an expiring time.
static int practiceMinimumWrongCount()
Get The entry must have been answered incorrectly at least this often to be included in the practice...
static int practiceMaximumWrongCount()
Get The entry must have been answered incorrectly at most this often to be included in the practice...
QObject doc
Abreviation of document property (same as Parley.document)
static bool block()
Get In Blocking Query Tab Dialog, if checked then the Query is blocked.
static int practiceMaximumGrade()
Get The entry must have at most this grade to be included in the practice (0..7). ...
void setConjugationPronouns(const QList< KEduVocWordFlags > &flags)
QList< TestEntry * > entries()
Returns the list of test entries after filtering out invalid entries according to the settings...
EntryFilter(QObject *parent, KEduVocDocument *doc)
static int solutionLanguage()
Get The language in which the user has to answer.