]> Git trees. - libqmvoc.git/commitdiff
Massive speedup in word type view - cache entries in the container - otherwise modelv...
authorFrederik Gladhorn <gladhorn@kde.org>
Sat, 26 Apr 2008 14:57:34 +0000 (14:57 +0000)
committerFrederik Gladhorn <gladhorn@kde.org>
Sat, 26 Apr 2008 14:57:34 +0000 (14:57 +0000)
svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=801406

keduvocdocument/keduvoccontainer.cpp
keduvocdocument/keduvocwordtype.cpp

index b6a9d433da0024706770916d09c9a0b1bf394709..dd90331aa1f32855fb7dcd7a3afe120ffc5e39d1 100644 (file)
@@ -66,6 +66,7 @@ KEduVocContainer::KEduVocContainer( const KEduVocContainer &other )
     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()
@@ -164,7 +165,9 @@ void KEduVocContainer::removeTranslation(int translation)
 
 QList< KEduVocExpression * > KEduVocContainer::entriesRecursive()
 {
+//     kDebug() << "entriesRecursive: " << name();
     if (!d->m_childLessonEntriesValid) {
+        kDebug() << "entriesRecursive: update: " << name();
         updateChildLessonEntries();
     }
     return d->m_childLessonEntries;
@@ -211,6 +214,7 @@ void KEduVocContainer::insertChildContainer(int row, KEduVocContainer * child)
 
 void KEduVocContainer::updateChildLessonEntries()
 {
+    kDebug() << "updateChildLessonEntries: " << name();
     QList < KEduVocExpression* > entriesRecursive = entries();
 
     foreach(KEduVocContainer *childContainer, d->m_childContainers)
@@ -223,6 +227,7 @@ void KEduVocContainer::updateChildLessonEntries()
 
 void KEduVocContainer::invalidateChildLessonEntries()
 {
+    kDebug() << "invalidateChildLessonEntries: " << name();
     d->m_childLessonEntriesValid = false;
     // propagate to parent
     if (d->m_parentContainer) {
index bf5d3833732e8c39283ac25cfcf614d82b97587c..da45c6d5abfdfa3f0b23cdefb221c7611db178df 100644 (file)
@@ -27,7 +27,9 @@ class KEduVocWordType::Private
 {
 public:
     EnumWordType m_wordType;
-    // entries
+    // cache the entries
+    QList<KEduVocExpression*> m_expressions;
+    // list of translations
     QList<KEduVocTranslation*> m_translations;
 };
 
@@ -50,13 +52,8 @@ QList<KEduVocExpression*> KEduVocWordType::entries(EnumEntriesRecursive recursiv
     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)
@@ -64,11 +61,22 @@ 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();
 }
@@ -76,6 +84,19 @@ void KEduVocWordType::addTranslation(KEduVocTranslation* translation)
 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();
 }