d->m_inPractice = other.d->m_inPractice;
d->m_type = other.d->m_type;
d->m_parentContainer = other.d->m_parentContainer;
+ d->m_childLessonEntriesValid = false;
}
KEduVocContainer::~KEduVocContainer()
QList< KEduVocExpression * > KEduVocContainer::entriesRecursive()
{
+// kDebug() << "entriesRecursive: " << name();
if (!d->m_childLessonEntriesValid) {
+ kDebug() << "entriesRecursive: update: " << name();
updateChildLessonEntries();
}
return d->m_childLessonEntries;
void KEduVocContainer::updateChildLessonEntries()
{
+ kDebug() << "updateChildLessonEntries: " << name();
QList < KEduVocExpression* > entriesRecursive = entries();
foreach(KEduVocContainer *childContainer, d->m_childContainers)
void KEduVocContainer::invalidateChildLessonEntries()
{
+ kDebug() << "invalidateChildLessonEntries: " << name();
d->m_childLessonEntriesValid = false;
// propagate to parent
if (d->m_parentContainer) {
{
public:
EnumWordType m_wordType;
- // entries
+ // cache the entries
+ QList<KEduVocExpression*> m_expressions;
+ // list of translations
QList<KEduVocTranslation*> m_translations;
};
if (recursive == Recursive) {
return entriesRecursive();
}
- /// FIXME this is recalculated every time, very inefficient!
- /// cache entries here, only update on dirty
- QSet<KEduVocExpression*> entries;
- foreach(KEduVocTranslation* translation, d->m_translations) {
- entries.insert(translation->entry());
- }
- return entries.toList();
+
+ return d->m_expressions;
}
int KEduVocWordType::entryCount(EnumEntriesRecursive recursive)
if (recursive == Recursive) {
return entriesRecursive().count();
}
- return entries().count();
+ return d->m_expressions.count();
}
void KEduVocWordType::addTranslation(KEduVocTranslation* translation)
{
+ // add to expression - if not already there because another translation of the same word is there.
+ bool found = false;
+ foreach(int i, translation->entry()->translationIndices()) {
+ if (translation->entry()->translation(i)->wordType() == this) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ d->m_expressions.append(translation->entry());
+ }
d->m_translations.append( translation );
invalidateChildLessonEntries();
}
void KEduVocWordType::removeTranslation(KEduVocTranslation* translation)
{
d->m_translations.removeAt( d->m_translations.indexOf(translation));
+
+ // remove from cache
+ bool found = false;
+ foreach(int i, translation->entry()->translationIndices()) {
+ if (translation->entry()->translation(i)->wordType() == this) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ d->m_expressions.removeAt(d->m_expressions.indexOf(translation->entry()));
+ }
+
invalidateChildLessonEntries();
}