]> Git trees. - libqmvoc.git/commitdiff
Make caching of the vocabs of sublessons work, now recursive view of lessons is fast...
authorFrederik Gladhorn <gladhorn@kde.org>
Sat, 23 Feb 2008 17:08:14 +0000 (17:08 +0000)
committerFrederik Gladhorn <gladhorn@kde.org>
Sat, 23 Feb 2008 17:08:14 +0000 (17:08 +0000)
Still disabled by default as modeltest doesn't like me and asserts when attempting to insert an entry.
Start some feeble attempt to implement Cut for vocabs.

svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=778458

keduvocdocument/keduvoccontainer.cpp
keduvocdocument/keduvoccontainer.h
keduvocdocument/keduvoclesson.cpp
keduvocdocument/keduvoclesson.h
keduvocdocument/keduvocwordtype.cpp
keduvocdocument/keduvocwordtype.h

index ffc1151d862f2c52948946541ad87cf1be14caef..8f28e9550e104efd5dcfa6a75c906692717da6cd 100644 (file)
@@ -37,7 +37,8 @@ public:
 
     EnumContainerType m_type;
 
-    QSet < KEduVocExpression* > m_childLessonEntries;
+    QList < KEduVocExpression* > m_childLessonEntries;
+    bool m_childLessonEntriesValid;
 
     /// Image url
     KUrl m_imageUrl;
@@ -55,6 +56,7 @@ KEduVocContainer::KEduVocContainer(const QString& name, EnumContainerType type,
     d->m_name = name;
     d->m_inPractice = true;
     d->m_type = type;
+    d->m_childLessonEntriesValid = false;
 }
 
 KEduVocContainer::KEduVocContainer( const KEduVocContainer &other )
@@ -76,7 +78,7 @@ void KEduVocContainer::appendChildContainer(KEduVocContainer * child)
     d->m_childContainers.append(child);
     child->d->m_parentContainer = this;
 
-    d->m_childLessonEntries.unite(child->entries(Recursive).toSet());
+    invalidateChildLessonEntries();
 }
 
 KEduVocContainer * KEduVocContainer::childContainer(int row)
@@ -90,12 +92,13 @@ void KEduVocContainer::deleteChildContainer(int row)
     kDebug() << "Delete of container - check entry deletion!";
     delete d->m_childContainers.takeAt(row);
 
-    resetChildLessonEntries();
+    invalidateChildLessonEntries();
 }
 
 void KEduVocContainer::removeChildContainer(int row)
 {
     d->m_childContainers.removeAt(row);
+    invalidateChildLessonEntries();
 }
 
 
@@ -123,7 +126,9 @@ KEduVocContainer& KEduVocContainer::operator= ( const KEduVocContainer &other )
 bool KEduVocContainer::operator==(const KEduVocContainer &other)
 {
     return  d->m_name == other.d->m_name &&
-            d->m_inPractice == other.d->m_inPractice;;
+            d->m_inPractice == other.d->m_inPractice
+/// @todo make this return something useful
+            ;
 }
 
 void KEduVocContainer::setName( const QString &name )
@@ -155,22 +160,14 @@ void KEduVocContainer::removeTranslation(int translation)
     foreach(KEduVocExpression *entry, entries() ) {
         entry->removeTranslation( translation );
     }
-    if (parent()) {
-        parent()->resetChildLessonEntries();
-    }
 }
 
 QList< KEduVocExpression * > KEduVocContainer::entriesRecursive()
 {
-    QList< KEduVocExpression * > entryList = entries(NotRecursive);
-    foreach(KEduVocContainer *childContainer, d->m_childContainers) {
-        foreach(KEduVocExpression *childEntry, childContainer->entriesRecursive()) {
-            if(!entryList.contains(childEntry)) {
-                entryList.append(childEntry);
-            }
-        }
+    if (!d->m_childLessonEntriesValid) {
+        updateChildLessonEntries();
     }
-    return entryList;
+    return d->m_childLessonEntries;
 }
 
 QList< KEduVocContainer * > KEduVocContainer::childContainers()
@@ -183,16 +180,6 @@ KEduVocContainer * KEduVocContainer::parent()
     return d->m_parentContainer;
 }
 
-// KEduVocContainer * KEduVocContainer::childContainer(const QString & name)
-// {
-//     for(int i = 0; i<d->m_childContainers.count(); i++){
-//         if(d->m_childContainers.value(i)->name() == name) {
-//             return d->m_childContainers[i];
-//         }
-//     }
-//     return 0;
-// }
-
 void KEduVocContainer::setContainerType(KEduVocContainer::EnumContainerType type)
 {
     d->m_type = type;
@@ -214,18 +201,31 @@ void KEduVocContainer::setImageUrl(const KUrl &url)
     d->m_imageUrl = url;
 }
 
-
 void KEduVocContainer::insertChildContainer(int row, KEduVocContainer * child)
 {
     d->m_childContainers.insert(row, child);
     child->d->m_parentContainer = this;
+
+    invalidateChildLessonEntries();
 }
 
-void KEduVocContainer::resetChildLessonEntries()
+void KEduVocContainer::updateChildLessonEntries()
 {
-    d->m_childLessonEntries.clear();
+    QSet < KEduVocExpression* > entriesRecursive = entries().toSet();
+
     foreach(KEduVocContainer *childContainer, d->m_childContainers) {
-        d->m_childLessonEntries.unite(childContainer->entries(Recursive).toSet());
+        entriesRecursive.unite(childContainer->entries(Recursive).toSet());
+    }
+    d->m_childLessonEntries = entriesRecursive.toList();
+    d->m_childLessonEntriesValid = true;
+}
+
+void KEduVocContainer::invalidateChildLessonEntries()
+{
+    d->m_childLessonEntriesValid = false;
+    // propagate to parent
+    if (d->m_parentContainer) {
+        d->m_parentContainer->invalidateChildLessonEntries();
     }
 }
 
index 4259aecc391b208f1489e1fc1f1f4c02f375c4d7..ee67ab84e9e284f32476c5cc87ed88dd3519db45 100644 (file)
@@ -126,9 +126,14 @@ protected:
     QList< KEduVocExpression * > entriesRecursive();
 
     /**
-     * The cache of entries in this lessons child lessons.
+     * Set the child entry cache to invalid
      */
-    void resetChildLessonEntries();
+    void invalidateChildLessonEntries();
+
+    /**
+     * Recreate the cache of entries in this lesson's child lessons.
+     */
+    void updateChildLessonEntries();
 
 private:
     class Private;
index 2cdd3b74850b8f2cec9727532e073b3bc247017f..ad04a3d0c195d10deda6556d6f80a25f7da0d682 100644 (file)
@@ -54,7 +54,6 @@ KEduVocLesson::~KEduVocLesson()
     delete d;
 }
 
-
 QList<KEduVocExpression*> KEduVocLesson::entries(EnumEntriesRecursive recursive)
 {
     if (recursive == Recursive) {
@@ -73,20 +72,26 @@ int KEduVocLesson::entryCount(EnumEntriesRecursive recursive)
 
 void KEduVocLesson::appendEntry(KEduVocExpression* entry)
 {
+    Q_ASSERT(entry);
     d->m_entries.append( entry );
     entry->addLesson(this);
+    invalidateChildLessonEntries();
 }
 
 void KEduVocLesson::insertEntry(int index, KEduVocExpression * entry)
 {
     d->m_entries.insert( index, entry );
     entry->addLesson(this);
+    invalidateChildLessonEntries();
 }
 
 void KEduVocLesson::removeEntry(KEduVocExpression* entry)
 {
-    d->m_entries.removeAt( d->m_entries.indexOf(entry) );
-    entry->removeLesson(this);
+    if (entry) {
+        d->m_entries.removeAt( d->m_entries.indexOf(entry) );
+        entry->removeLesson(this);
+        invalidateChildLessonEntries();
+    }
 }
 
 KEduVocExpression * KEduVocLesson::entry(int row, EnumEntriesRecursive recursive)
@@ -97,9 +102,4 @@ KEduVocExpression * KEduVocLesson::entry(int row, EnumEntriesRecursive recursive
     return d->m_entries.value(row);
 }
 
-void KEduVocLesson::randomizeEntries()
-{
-    KRandomSequence randomSequence(QDateTime::currentDateTime().toTime_t());
-    randomSequence.randomize( d->m_entries );
-}
 
index f8d905411c4280559d5e442ad322dc03b5698d9b..e8c562719eb495afff7a4b06f21997043786b069 100644 (file)
@@ -70,11 +70,6 @@ public:
      */
     void insertEntry(int index, KEduVocExpression* entry);
 
-    /**
-     * shuffle the order of the entries in the lesson
-     */
-    void randomizeEntries();
-
     /** remove an entry from the lesson
      * @param entryid id of the entry to remove
      */
index e0bbcd55c54943e9481760d98e3158d640e9d961..8a17c2b2a3acfec8a480bbd1ef97e44401a85cb2 100644 (file)
@@ -68,11 +68,13 @@ int KEduVocWordType::entryCount(EnumEntriesRecursive recursive)
 void KEduVocWordType::addTranslation(KEduVocTranslation* translation)
 {
     d->m_translations.append( translation );
+    invalidateChildLessonEntries();
 }
 
 void KEduVocWordType::removeTranslation(KEduVocTranslation* translation)
 {
     d->m_translations.removeAt( d->m_translations.indexOf(translation));
+    invalidateChildLessonEntries();
 }
 
 KEduVocTranslation * KEduVocWordType::translation(int row)
index 5ca8e4661797f2b5584dfff6d1e04f60e06e6782..1cce8c9cda5e2d8763f3100c4403f80d3735e8cd 100644 (file)
@@ -51,7 +51,7 @@ public:
     ~KEduVocWordType();
 
     /** assignment operator */
-    KEduVocWordType& operator= ( const KEduVocWordType& );
+//     KEduVocWordType& operator= ( const KEduVocWordType& );
 
     /**
      * Internally (different from the name) the class can have one of the preset word types. These are used to determine special properties (verbs have conjugations available for example).