From 6300c8f536a4fc41735097ff0c2e2c4e01067cdf Mon Sep 17 00:00:00 2001 From: Igor Malinovskiy Date: Thu, 13 Aug 2015 04:59:30 +0300 Subject: [PATCH] Optimize tree rendering --- .../connections-tree/items/databaseitem.cpp | 39 +++++++++++-------- .../connections-tree/items/namespaceitem.cpp | 11 ++++++ .../connections-tree/items/namespaceitem.h | 3 ++ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/modules/connections-tree/items/databaseitem.cpp b/src/modules/connections-tree/items/databaseitem.cpp index 42dba458..55fb1fb0 100644 --- a/src/modules/connections-tree/items/databaseitem.cpp +++ b/src/modules/connections-tree/items/databaseitem.cpp @@ -177,7 +177,7 @@ void DatabaseItem::resetFilter() void DatabaseItem::renderRawKeys(const Operations::RawKeysList &rawKeys) { - qDebug() << "Keys: " << rawKeys.size(); + qDebug() << "Render keys: " << rawKeys.size(); if (rawKeys.size() == 0) { m_locked = false; @@ -209,10 +209,14 @@ QSharedPointer DatabaseItem::KeysTreeRenderer::renderKeys(QSharedP QSharedPointer parent) { //init + QElapsedTimer timer; + timer.start(); keys.sort(); + qDebug() << "Keys sorted in: " << timer.elapsed() << " ms"; QSharedPointer>> result(new QList>()); //render + timer.restart(); for (QVariant key : keys) { QString rawKey = key.toString(); @@ -226,7 +230,7 @@ QSharedPointer DatabaseItem::KeysTreeRenderer::renderKeys(QSharedP rawKey, rawKey, operations, namespaceSeparator, result, parent); } - + qDebug() << "Tree builded in: " << timer.elapsed() << " ms"; return result; } @@ -241,35 +245,38 @@ void DatabaseItem::KeysTreeRenderer::renderNamaspacedKey(QSharedPointer currentParent = (currItem.isNull())? db.staticCast().toWeakRef() : currItem.staticCast().toWeakRef(); - if (!notProcessedKeyPart.contains(m_namespaceSeparator) || m_namespaceSeparator.isEmpty()) { + int indexOfNaspaceSeparator = (m_namespaceSeparator.isEmpty())? + -1 : notProcessedKeyPart.indexOf(m_namespaceSeparator); + if (indexOfNaspaceSeparator == -1) { QSharedPointer newKey( (new KeyItem(fullKey, db->getIndex(), m_operations, currentParent)) ); if (currItem.isNull()) m_result->push_back(newKey); else currItem->append(newKey); - return; } - int indexOfNaspaceSeparator = notProcessedKeyPart.indexOf(m_namespaceSeparator); - QString firstNamespaceName = notProcessedKeyPart.mid(0, indexOfNaspaceSeparator); - QSharedPointer namespaceItem; - int size = (currItem.isNull())? m_result->size() : currItem->childCount(); + QSharedPointer namespaceItem; - for (int i=0; i < size; ++i) - { - QSharedPointer child = (currItem.isNull())? (*m_result)[i] : currItem->child(i); + if (currItem.isNull()) { + int size = m_result->size(); + QSharedPointer child; - if (child->getDisplayName() == firstNamespaceName - && typeid(NamespaceItem)==typeid(*child)) { - - namespaceItem = qSharedPointerCast(child); - break; + for (int i=0; i < size; ++i) + { + child = (*m_result)[i]; + if (typeid(NamespaceItem)==typeid(*child) + && child->getDisplayName() == firstNamespaceName) { + namespaceItem = qSharedPointerCast(child); + break; + } } + } else { + namespaceItem = currItem->findChildNamespace(firstNamespaceName); } if (namespaceItem.isNull()) { diff --git a/src/modules/connections-tree/items/namespaceitem.cpp b/src/modules/connections-tree/items/namespaceitem.cpp index 8ecd13b8..76e11ff7 100644 --- a/src/modules/connections-tree/items/namespaceitem.cpp +++ b/src/modules/connections-tree/items/namespaceitem.cpp @@ -72,6 +72,17 @@ bool NamespaceItem::isEnabled() const void NamespaceItem::append(QSharedPointer item) { + if (typeid(NamespaceItem)==typeid(*item)) { + m_childNamespaces[item->getDisplayName()] = qSharedPointerCast(item); + } m_childItems.append(item); } +QSharedPointer NamespaceItem::findChildNamespace(const QString &name) +{ + if (!m_childNamespaces.contains(name)) + return QSharedPointer(); + + return m_childNamespaces[name]; +} + diff --git a/src/modules/connections-tree/items/namespaceitem.h b/src/modules/connections-tree/items/namespaceitem.h index 6c9facf2..c17057a3 100644 --- a/src/modules/connections-tree/items/namespaceitem.h +++ b/src/modules/connections-tree/items/namespaceitem.h @@ -24,11 +24,14 @@ namespace ConnectionsTree { void append(QSharedPointer item); + QSharedPointer findChildNamespace(const QString& name); + private: QString m_fullPath; QSharedPointer m_operations; QWeakPointer m_parent; bool m_locked; QList> m_childItems; + QHash> m_childNamespaces; }; }