From 0a23dd4e2385613d460566c07fae85038f2fa278 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Thu, 7 May 2015 15:40:56 +0200 Subject: [PATCH] ProjectTree: Improve resizing of project tree On each resize event the treeview iterated over all rows to get the maximum width of them. That involves text layout and is very slow with bigger trees. So cache the size hint for the column and connect to all signals that can potentially change the size hint. Change-Id: I83a13982848df56515fed8225ced336096370546 Task-number: QTCREATORBUG-8075 Reviewed-by: David Schulz --- .../projectexplorer/projecttreewidget.cpp | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index b39e98ea92b..ee20f32d896 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -96,15 +96,71 @@ public: m_context = new IContext(this); m_context->setContext(Context(ProjectExplorer::Constants::C_PROJECT_TREE)); m_context->setWidget(this); + ICore::addContextObject(m_context); + + connect(this, &ProjectTreeView::expanded, + this, &ProjectTreeView::invalidateSize); + connect(this, &ProjectTreeView::collapsed, + this, &ProjectTreeView::invalidateSize); } + + void invalidateSize() + { + m_cachedSize = -1; + } + + void setModel(QAbstractItemModel *newModel) + { + // Note: Don't connect to column signals, as we have only one column + if (model()) { + QAbstractItemModel *m = model(); + disconnect(m, &QAbstractItemModel::dataChanged, + this, &ProjectTreeView::invalidateSize); + disconnect(m, &QAbstractItemModel::layoutChanged, + this, &ProjectTreeView::invalidateSize); + disconnect(m, &QAbstractItemModel::modelReset, + this, &ProjectTreeView::invalidateSize); + disconnect(m, &QAbstractItemModel::rowsInserted, + this, &ProjectTreeView::invalidateSize); + disconnect(m, &QAbstractItemModel::rowsMoved, + this, &ProjectTreeView::invalidateSize); + disconnect(m, &QAbstractItemModel::rowsRemoved, + this, &ProjectTreeView::invalidateSize); + } + if (newModel) { + connect(newModel, &QAbstractItemModel::dataChanged, + this, &ProjectTreeView::invalidateSize); + connect(newModel, &QAbstractItemModel::layoutChanged, + this, &ProjectTreeView::invalidateSize); + connect(newModel, &QAbstractItemModel::modelReset, + this, &ProjectTreeView::invalidateSize); + connect(newModel, &QAbstractItemModel::rowsInserted, + this, &ProjectTreeView::invalidateSize); + connect(newModel, &QAbstractItemModel::rowsMoved, + this, &ProjectTreeView::invalidateSize); + connect(newModel, &QAbstractItemModel::rowsRemoved, + this, &ProjectTreeView::invalidateSize); + } + Utils::NavigationTreeView::setModel(newModel); + } + ~ProjectTreeView() { ICore::removeContextObject(m_context); delete m_context; } + int sizeHintForColumn(int column) const override + { + if (m_cachedSize < 0) + m_cachedSize = Utils::NavigationTreeView::sizeHintForColumn(column); + + return m_cachedSize; + } + private: + mutable int m_cachedSize = -1; IContext *m_context; };