From b84ffa262103ce3b0d6353452b7863bd8140bfd1 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Sat, 26 Apr 2008 14:57:34 +0000 Subject: [PATCH] Massive speedup in word type view - cache entries in the container - otherwise modelview is pretty much unusable. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=801406 --- keduvocdocument/keduvoccontainer.cpp | 5 ++++ keduvocdocument/keduvocwordtype.cpp | 39 +++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/keduvocdocument/keduvoccontainer.cpp b/keduvocdocument/keduvoccontainer.cpp index b6a9d43..dd90331 100644 --- a/keduvocdocument/keduvoccontainer.cpp +++ b/keduvocdocument/keduvoccontainer.cpp @@ -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) { diff --git a/keduvocdocument/keduvocwordtype.cpp b/keduvocdocument/keduvocwordtype.cpp index bf5d383..da45c6d 100644 --- a/keduvocdocument/keduvocwordtype.cpp +++ b/keduvocdocument/keduvocwordtype.cpp @@ -27,7 +27,9 @@ class KEduVocWordType::Private { public: EnumWordType m_wordType; - // entries + // cache the entries + QList m_expressions; + // list of translations QList m_translations; }; @@ -50,13 +52,8 @@ QList 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 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(); } -- 2.47.3