From 9ca10fadb83eea7b1482de7cfc20ae14315ad584 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 12 Jul 2024 16:49:16 +0200 Subject: [PATCH] Utils: Add a simple way to make a Utils::TreeView searchable Call setSearchRole(...) to create a suitable find aggregate. Use it in a few places. Change-Id: Iaa663d13bbc7776019e7b18ea720cc2411e0b691 Reviewed-by: Eike Ziller --- src/libs/utils/itemviews.cpp | 27 +++++++++++++++++++ src/libs/utils/itemviews.h | 10 +++++++ src/plugins/coreplugin/find/findplugin.cpp | 6 +++++ .../coreplugin/find/searchresulttreeview.cpp | 4 +++ .../coreplugin/find/searchresultwidget.cpp | 4 --- src/plugins/debugger/console/console.cpp | 6 +---- src/plugins/projectexplorer/taskwindow.cpp | 4 +-- src/plugins/todo/todooutputpane.cpp | 5 ---- src/plugins/todo/todooutputtreeview.cpp | 1 + 9 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/libs/utils/itemviews.cpp b/src/libs/utils/itemviews.cpp index c043b07ff52..ad3b734bf6e 100644 --- a/src/libs/utils/itemviews.cpp +++ b/src/libs/utils/itemviews.cpp @@ -53,12 +53,39 @@ namespace Utils { Also adds sane keyboard navigation for mac. */ +static Internal::ViewSearchCallback &viewSearchCallback() +{ + static Internal::ViewSearchCallback theViewSearchCallback; + return theViewSearchCallback; +} + +static void makeViewSearchable(QAbstractItemView *view, int role) +{ + if (viewSearchCallback()) + viewSearchCallback()(view, role); +} + +/*! + \internal + + \note Only use once from Core initialization. +*/ +void Internal::setViewSearchCallback(const ViewSearchCallback &cb) +{ + viewSearchCallback() = cb; +} + TreeView::TreeView(QWidget *parent) : View(parent) { setUniformRowHeights(true); } +void TreeView::setSearchRole(int role) +{ + makeViewSearchable(this, role); +} + TreeWidget::TreeWidget(QWidget *parent) : View(parent) { diff --git a/src/libs/utils/itemviews.h b/src/libs/utils/itemviews.h index ff1f5328b15..ee36ffb2ea0 100644 --- a/src/libs/utils/itemviews.h +++ b/src/libs/utils/itemviews.h @@ -28,6 +28,7 @@ public: View(QWidget *parent = nullptr) : BaseT(parent) {} + void setActivationMode(ActivationMode mode) { if (mode == PlatformDefaultActivation) @@ -81,6 +82,8 @@ class QTCREATOR_UTILS_EXPORT TreeView : public View { public: TreeView(QWidget *parent = nullptr); + + void setSearchRole(int role); }; class QTCREATOR_UTILS_EXPORT TreeWidget : public View @@ -101,4 +104,11 @@ public: ListWidget(QWidget *parent = nullptr); }; +namespace Internal { + +using ViewSearchCallback = std::function; +QTCREATOR_UTILS_EXPORT void setViewSearchCallback(const ViewSearchCallback &cb); + +} // Internal + } // Utils diff --git a/src/plugins/coreplugin/find/findplugin.cpp b/src/plugins/coreplugin/find/findplugin.cpp index 9f10a064520..e94b371ddee 100644 --- a/src/plugins/coreplugin/find/findplugin.cpp +++ b/src/plugins/coreplugin/find/findplugin.cpp @@ -15,12 +15,14 @@ #include "findtoolbar.h" #include "findtoolwindow.h" #include "ifindfilter.h" +#include "itemviewfind.h" #include "searchresultwindow.h" #include "textfindconstants.h" #include #include +#include #include #include @@ -261,6 +263,10 @@ void Find::initialize() &FindPrivate::writeSettings); QObject::connect( SessionManager::instance(), &SessionManager::sessionLoaded, d, &FindPrivate::readSettings); + + Utils::Internal::setViewSearchCallback([](QAbstractItemView *view, int role) { + Aggregation::aggregate({view, new ItemViewFind(view, role)}); + }); } void Find::extensionsInitialized() diff --git a/src/plugins/coreplugin/find/searchresulttreeview.cpp b/src/plugins/coreplugin/find/searchresulttreeview.cpp index 35902360400..1f54a3a1ed0 100644 --- a/src/plugins/coreplugin/find/searchresulttreeview.cpp +++ b/src/plugins/coreplugin/find/searchresulttreeview.cpp @@ -45,6 +45,10 @@ SearchResultTreeView::SearchResultTreeView(QWidget *parent) setItemDelegate(new SearchResultTreeItemDelegate(8, this)); setIndentation(14); setExpandsOnDoubleClick(true); + setFrameStyle(QFrame::NoFrame); + setAttribute(Qt::WA_MacShowFocusRect, false); + setSearchRole(ItemDataRoles::ResultLineRole); + header()->setSectionResizeMode(QHeaderView::ResizeToContents); header()->setStretchLastSection(false); header()->hide(); diff --git a/src/plugins/coreplugin/find/searchresultwidget.cpp b/src/plugins/coreplugin/find/searchresultwidget.cpp index 0a801b7ea43..50e310c122d 100644 --- a/src/plugins/coreplugin/find/searchresultwidget.cpp +++ b/src/plugins/coreplugin/find/searchresultwidget.cpp @@ -110,15 +110,11 @@ SearchResultWidget::SearchResultWidget(QWidget *parent) : m_messageWidget->setVisible(false); m_searchResultTreeView = new SearchResultTreeView(this); - m_searchResultTreeView->setFrameStyle(QFrame::NoFrame); - m_searchResultTreeView->setAttribute(Qt::WA_MacShowFocusRect, false); connect(m_searchResultTreeView, &SearchResultTreeView::filterInvalidated, this, &SearchResultWidget::filterInvalidated); connect(m_searchResultTreeView, &SearchResultTreeView::filterChanged, this, &SearchResultWidget::filterChanged); - auto find = new ItemViewFind(m_searchResultTreeView, ItemDataRoles::ResultLineRole); - Aggregation::aggregate({m_searchResultTreeView, find}); layout->addWidget(m_searchResultTreeView); m_infoBarDisplay.setTarget(layout, 2); diff --git a/src/plugins/debugger/console/console.cpp b/src/plugins/debugger/console/console.cpp index d2c8bbe4764..56e3da94d73 100644 --- a/src/plugins/debugger/console/console.cpp +++ b/src/plugins/debugger/console/console.cpp @@ -14,9 +14,6 @@ #include -#include -#include - #include #include #include @@ -77,8 +74,7 @@ Console::Console() connect(m_consoleView->selectionModel(), &QItemSelectionModel::currentChanged, itemDelegate, &ConsoleItemDelegate::currentChanged); m_consoleView->setItemDelegate(itemDelegate); - - Aggregation::aggregate({m_consoleView, new Core::ItemViewFind(m_consoleView)}); + m_consoleView->setSearchRole(Qt::DisplayRole); vbox->addWidget(m_consoleView); vbox->addWidget(new Core::FindToolBarPlaceHolder(m_consoleWidget)); diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 5fed4ac21b4..35e382fe263 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -172,9 +172,7 @@ TaskWindow::TaskWindow() : d(std::make_unique()) d->m_filter = new Internal::TaskFilterModel(d->m_model); d->m_filter->setAutoAcceptChildRows(true); - auto find = new Core::ItemViewFind(&d->m_treeView, TaskModel::Description); - Aggregation::aggregate({&d->m_treeView, find}); - + d->m_treeView.setSearchRole(TaskModel::Description); d->m_treeView.setHeaderHidden(true); d->m_treeView.setExpandsOnDoubleClick(false); d->m_treeView.setAlternatingRowColors(true); diff --git a/src/plugins/todo/todooutputpane.cpp b/src/plugins/todo/todooutputpane.cpp index 9145899b331..2ef8fe0ca9e 100644 --- a/src/plugins/todo/todooutputpane.cpp +++ b/src/plugins/todo/todooutputpane.cpp @@ -10,10 +10,7 @@ #include "todooutputtreeview.h" #include "todotr.h" -#include - #include -#include #include #include @@ -214,8 +211,6 @@ void TodoOutputPane::createTreeView() m_todoTreeView = new TodoOutputTreeView(); m_todoTreeView->setModel(m_filteredTodoItemsModel); - Aggregation::aggregate({m_todoTreeView, new Core::ItemViewFind(m_todoTreeView)}); - connect(m_todoTreeView, &TodoOutputTreeView::activated, this, &TodoOutputPane::todoTreeViewClicked); } diff --git a/src/plugins/todo/todooutputtreeview.cpp b/src/plugins/todo/todooutputtreeview.cpp index a0519d59e94..4fdb83a0f34 100644 --- a/src/plugins/todo/todooutputtreeview.cpp +++ b/src/plugins/todo/todooutputtreeview.cpp @@ -26,6 +26,7 @@ TodoOutputTreeView::TodoOutputTreeView(QWidget *parent) : setAttribute(Qt::WA_MacShowFocusRect, false); setSelectionBehavior(QTreeView::SelectRows); setItemDelegate(new TodoOutputTreeViewDelegate(this)); + setSearchRole(Qt::DisplayRole); header()->setSectionResizeMode(QHeaderView::Interactive); header()->setStretchLastSection(true);