From 936b63b4fcfd1c22f15fcf01d67933f8e0e9fc06 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 18 Dec 2020 15:39:48 +0100 Subject: [PATCH] Highlight old item after activating new class in type hierarchy Highlight the old visible class after double click on a new class in type hierarchy editor. Don't do that when opening type hierarchy from cpp editor. Change-Id: Ie9a1131cba9b5a35ab826909b994555188aaceb7 Reviewed-by: hjk --- src/plugins/cppeditor/cpptypehierarchy.cpp | 26 +++++++++++++++++----- src/plugins/cppeditor/cpptypehierarchy.h | 6 +++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index 977c890ce7a..64009f38642 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -199,6 +199,8 @@ void CppTypeHierarchyWidget::perform() if (m_future.isRunning()) m_future.cancel(); + m_showOldClass = false; + updateSynchronizer(); auto editor = qobject_cast(Core::EditorManager::currentEditor()); @@ -230,6 +232,8 @@ void CppTypeHierarchyWidget::performFromExpression(const QString &expression, co if (m_future.isRunning()) m_future.cancel(); + m_showOldClass = true; + updateSynchronizer(); showProgress(); @@ -270,25 +274,37 @@ void CppTypeHierarchyWidget::displayHierarchy() m_inspectedClass->setLink(cppClass->link); QStandardItem *bases = new QStandardItem(tr("Bases")); m_model->invisibleRootItem()->appendRow(bases); - buildHierarchy(*cppClass, bases, true, &CppClass::bases); + QStandardItem *selectedItem1 = buildHierarchy(*cppClass, bases, true, &CppClass::bases); QStandardItem *derived = new QStandardItem(tr("Derived")); m_model->invisibleRootItem()->appendRow(derived); - buildHierarchy(*cppClass, derived, true, &CppClass::derived); + QStandardItem *selectedItem2 = buildHierarchy(*cppClass, derived, true, &CppClass::derived); m_treeView->expandAll(); + m_oldClass = cppClass->qualifiedName; + + QStandardItem *selectedItem = selectedItem1 ? selectedItem1 : selectedItem2; + if (selectedItem) + m_treeView->setCurrentIndex(m_model->indexFromItem(selectedItem)); showTypeHierarchy(); } -void CppTypeHierarchyWidget::buildHierarchy(const CppClass &cppClass, QStandardItem *parent, +QStandardItem *CppTypeHierarchyWidget::buildHierarchy(const CppClass &cppClass, QStandardItem *parent, bool isRoot, const HierarchyMember member) { + QStandardItem *selectedItem = nullptr; if (!isRoot) { QStandardItem *item = itemForClass(cppClass); parent->appendRow(item); parent = item; + if (m_showOldClass && cppClass.qualifiedName == m_oldClass) + selectedItem = item; } - foreach (const CppClass &klass, sortClasses(cppClass.*member)) - buildHierarchy(klass, parent, false, member); + foreach (const CppClass &klass, sortClasses(cppClass.*member)) { + QStandardItem *item = buildHierarchy(klass, parent, false, member); + if (!selectedItem) + selectedItem = item; + } + return selectedItem; } void CppTypeHierarchyWidget::showNoTypeHierarchyLabel() diff --git a/src/plugins/cppeditor/cpptypehierarchy.h b/src/plugins/cppeditor/cpptypehierarchy.h index 8972bea7463..a8c6a1745be 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.h +++ b/src/plugins/cppeditor/cpptypehierarchy.h @@ -85,8 +85,8 @@ private slots: private: typedef QList CppTools::CppClass::*HierarchyMember; void performFromExpression(const QString &expression, const QString &fileName); - void buildHierarchy(const CppTools::CppClass &cppClass, QStandardItem *parent, - bool isRoot, HierarchyMember member); + QStandardItem *buildHierarchy(const CppTools::CppClass &cppClass, QStandardItem *parent, + bool isRoot, HierarchyMember member); void showNoTypeHierarchyLabel(); void showTypeHierarchy(); void showProgress(); @@ -108,6 +108,8 @@ private: QFutureWatcher m_futureWatcher; QFutureSynchronizer m_synchronizer; Utils::ProgressIndicator *m_progressIndicator = nullptr; + QString m_oldClass; + bool m_showOldClass = false; }; class CppTypeHierarchyFactory : public Core::INavigationWidgetFactory