From: Frederik Gladhorn Date: Sat, 23 Feb 2008 17:08:14 +0000 (+0000) Subject: Make caching of the vocabs of sublessons work, now recursive view of lessons is fast... X-Git-Tag: v4.0.71~52 X-Git-Url: https://git.rmz.fi/?a=commitdiff_plain;h=5c142e7f83405731697bd8c518072aca3b4d7cbf;p=libqmvoc.git Make caching of the vocabs of sublessons work, now recursive view of lessons is fast enough. 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 --- diff --git a/keduvocdocument/keduvoccontainer.cpp b/keduvocdocument/keduvoccontainer.cpp index ffc1151..8f28e95 100644 --- a/keduvocdocument/keduvoccontainer.cpp +++ b/keduvocdocument/keduvoccontainer.cpp @@ -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; im_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(); } } diff --git a/keduvocdocument/keduvoccontainer.h b/keduvocdocument/keduvoccontainer.h index 4259aec..ee67ab8 100644 --- a/keduvocdocument/keduvoccontainer.h +++ b/keduvocdocument/keduvoccontainer.h @@ -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; diff --git a/keduvocdocument/keduvoclesson.cpp b/keduvocdocument/keduvoclesson.cpp index 2cdd3b7..ad04a3d 100644 --- a/keduvocdocument/keduvoclesson.cpp +++ b/keduvocdocument/keduvoclesson.cpp @@ -54,7 +54,6 @@ KEduVocLesson::~KEduVocLesson() delete d; } - QList 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 ); -} diff --git a/keduvocdocument/keduvoclesson.h b/keduvocdocument/keduvoclesson.h index f8d9054..e8c5627 100644 --- a/keduvocdocument/keduvoclesson.h +++ b/keduvocdocument/keduvoclesson.h @@ -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 */ diff --git a/keduvocdocument/keduvocwordtype.cpp b/keduvocdocument/keduvocwordtype.cpp index e0bbcd5..8a17c2b 100644 --- a/keduvocdocument/keduvocwordtype.cpp +++ b/keduvocdocument/keduvocwordtype.cpp @@ -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) diff --git a/keduvocdocument/keduvocwordtype.h b/keduvocdocument/keduvocwordtype.h index 5ca8e46..1cce8c9 100644 --- a/keduvocdocument/keduvocwordtype.h +++ b/keduvocdocument/keduvocwordtype.h @@ -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).