From 58b38337f162b0bbb51910f6b5e0f3f2ccb409a3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 21 May 2021 14:30:02 +0100 Subject: [PATCH] Optimise tree view expand/collapse all to avoid slow Qt path --- qrenderdoc/Widgets/Extended/RDTreeView.cpp | 36 ++++++++++++++++++---- qrenderdoc/Widgets/Extended/RDTreeView.h | 3 ++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/qrenderdoc/Widgets/Extended/RDTreeView.cpp b/qrenderdoc/Widgets/Extended/RDTreeView.cpp index 257cf302c..be1ec2d5d 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeView.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeView.cpp @@ -376,20 +376,44 @@ void RDTreeView::copyIndex(QPoint pos, QModelIndex index) selectionModel()->clear(); } -void RDTreeView::expandAll(QModelIndex index) +void RDTreeView::expandAllInternal(QModelIndex index) { + int rows = model()->rowCount(index); + + if(rows == 0) + return; + expand(index); - for(int r = 0, rows = model()->rowCount(index); r < rows; r++) + for(int r = 0; r < rows; r++) expandAll(model()->index(r, 0, index)); } +void RDTreeView::collapseAllInternal(QModelIndex index) +{ + int rows = model()->rowCount(index); + + if(rows == 0) + return; + + collapse(index); + + for(int r = 0; r < rows; r++) + collapseAll(model()->index(r, 0, index)); +} + +void RDTreeView::expandAll(QModelIndex index) +{ + setUpdatesEnabled(false); + expandAllInternal(index); + setUpdatesEnabled(true); +} + void RDTreeView::collapseAll(QModelIndex index) { - collapse(index); - - for(int r = 0, rows = model()->rowCount(index); r < rows; r++) - collapseAll(model()->index(r, 0, index)); + setUpdatesEnabled(false); + collapseAllInternal(index); + setUpdatesEnabled(true); } bool RDTreeView::viewportEvent(QEvent *event) diff --git a/qrenderdoc/Widgets/Extended/RDTreeView.h b/qrenderdoc/Widgets/Extended/RDTreeView.h index 1f38dc365..ab6e7d59a 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeView.h +++ b/qrenderdoc/Widgets/Extended/RDTreeView.h @@ -214,6 +214,9 @@ private: bool m_customCopyPaste = false; bool m_instantTooltips = false; + void expandAllInternal(QModelIndex index); + void collapseAllInternal(QModelIndex index); + QMap m_Expansions; void updateExpansionFromRow(RDTreeViewExpansionState &state, QModelIndex idx, uint seed,