diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-12-07 13:32:29 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2022-12-12 13:54:35 +0200 |
commit | b7929635dcdbd01135c04e0a7ffc8fa29d647d4d (patch) | |
tree | 50d9e99af36847a973c5c8ef594fb5436f5d0477 | |
parent | 0e79bc653ac18bbd3f391298ae162880582ae0ce (diff) |
Fix freezing UI while searching components
This affected maintenance tool, which by default shows multiple header
columns for the component tree view.
After typing in a search pattern, the component indexes from the tree
are expanded based on the matches. The maintenance tool would visibly
hang at this point. Measuring with callgrind indicated that the biggest
relative cost was at automatically resizing the header sections, which
could be done hundreds of times, which is unnesessary because we only
need to update the view once all necessary indexes are expanded.
Fix by setting the resize modes of the sections temporarily to fixed
size, and restore the original modes after the tree view is updated.
Task-number: QTIFW-2886
Change-Id: I17547344494818de9e321b3501cf6c3bc550c51e
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r-- | src/libs/installer/componentselectionpage_p.cpp | 32 | ||||
-rw-r--r-- | src/libs/installer/componentselectionpage_p.h | 10 |
2 files changed, 40 insertions, 2 deletions
diff --git a/src/libs/installer/componentselectionpage_p.cpp b/src/libs/installer/componentselectionpage_p.cpp index 292b28e67..5f58ae5ba 100644 --- a/src/libs/installer/componentselectionpage_p.cpp +++ b/src/libs/installer/componentselectionpage_p.cpp @@ -44,7 +44,6 @@ #include <QVBoxLayout> #include <QHBoxLayout> #include <QCheckBox> -#include <QHeaderView> #include <QStandardPaths> #include <QFileDialog> #include <QStackedLayout> @@ -73,8 +72,10 @@ ComponentSelectionPagePrivate::ComponentSelectionPagePrivate(ComponentSelectionP , m_categoryWidget(Q_NULLPTR) , m_categoryLayoutVisible(false) , m_proxyModel(new ComponentSortFilterProxyModel(q)) + , m_headerStretchLastSection(false) { m_treeView->setObjectName(QLatin1String("ComponentsTreeView")); + m_treeView->setUniformRowHeights(true); m_proxyModel->setRecursiveFilteringEnabled(true); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); @@ -368,6 +369,9 @@ void ComponentSelectionPagePrivate::expandDefault() */ void ComponentSelectionPagePrivate::expandSearchResults() { + // Avoid resizing the sections after each expand of a node + storeHeaderResizeModes(); + // Expand parents of root indexes accepted by filter const QVector<QModelIndex> acceptedIndexes = m_proxyModel->directlyAcceptedIndexes(); for (auto proxyModelIndex : acceptedIndexes) { @@ -383,6 +387,7 @@ void ComponentSelectionPagePrivate::expandSearchResults() index = index.parent(); } } + restoreHeaderResizeModes(); } void ComponentSelectionPagePrivate::currentSelectedChanged(const QModelIndex ¤t) @@ -571,4 +576,29 @@ void ComponentSelectionPagePrivate::setSearchPattern(const QString &text) } } +/*! + Stores the current resize modes of the tree view header's columns, and sets + the new resize modes to \c QHeaderView::Fixed. +*/ +void ComponentSelectionPagePrivate::storeHeaderResizeModes() +{ + m_headerStretchLastSection = m_treeView->header()->stretchLastSection(); + for (int i = 0; i < ComponentModelHelper::LastColumn; ++i) + m_headerResizeModes.insert(i, m_treeView->header()->sectionResizeMode(i)); + + m_treeView->header()->setStretchLastSection(false); + m_treeView->header()->setSectionResizeMode(QHeaderView::Fixed); +} + +/*! + Restores the resize modes of the tree view header's columns, that were + stored when calling \l storeHeaderResizeModes(). +*/ +void ComponentSelectionPagePrivate::restoreHeaderResizeModes() +{ + m_treeView->header()->setStretchLastSection(m_headerStretchLastSection); + for (int i = 0; i < ComponentModelHelper::LastColumn; ++i) + m_treeView->header()->setSectionResizeMode(i, m_headerResizeModes.value(i)); +} + } // namespace QInstaller diff --git a/src/libs/installer/componentselectionpage_p.h b/src/libs/installer/componentselectionpage_p.h index fc37ebdaa..7c2f6a38e 100644 --- a/src/libs/installer/componentselectionpage_p.h +++ b/src/libs/installer/componentselectionpage_p.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -31,6 +31,7 @@ #include <QObject> #include <QWidget> +#include <QHeaderView> #include "componentmodel.h" #include "packagemanagergui.h" @@ -90,6 +91,10 @@ public slots: void setSearchPattern(const QString &text); private: + void storeHeaderResizeModes(); + void restoreHeaderResizeModes(); + +private: ComponentSelectionPage *q; PackageManagerCore *m_core; QTreeView *m_treeView; @@ -113,6 +118,9 @@ private: QStackedLayout *m_stackedLayout; ComponentSortFilterProxyModel *m_proxyModel; QLineEdit *m_searchLineEdit; + + bool m_headerStretchLastSection; + QHash<int, QHeaderView::ResizeMode> m_headerResizeModes; }; } // namespace QInstaller |