From aed2c2c716d64163466827d7503c39819bc4ff45 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 16 Jul 2018 16:16:05 +0200 Subject: [PATCH] Show the right actions in the menu item locator filter Instead of showing the actions that are available while locator has focus, we need to show the actions that were enabled just before. Task-number: QTCREATORBUG-20626 Change-Id: I16c8370074080f0d395922e0df77ce2aceee7088 Reviewed-by: David Schulz --- .../coreplugin/locator/locatormanager.cpp | 13 ++++++++ .../coreplugin/locator/locatormanager.h | 2 ++ src/plugins/coreplugin/menubarfilter.cpp | 31 ++++++++++++++++++- src/plugins/coreplugin/menubarfilter.h | 6 ++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/locator/locatormanager.cpp b/src/plugins/coreplugin/locator/locatormanager.cpp index 01c43b261ab..0ff25b02cdf 100644 --- a/src/plugins/coreplugin/locator/locatormanager.cpp +++ b/src/plugins/coreplugin/locator/locatormanager.cpp @@ -34,6 +34,8 @@ #include #include +#include + using namespace Core::Internal; namespace Core { @@ -95,4 +97,15 @@ QWidget *LocatorManager::createLocatorInputWidget(QWidget *window) return locatorWidget; } +bool LocatorManager::locatorHasFocus() +{ + QWidget *w = qApp->focusWidget(); + while (w) { + if (qobject_cast(w)) + return true; + w = w->parentWidget(); + } + return false; +} + } // namespace Core diff --git a/src/plugins/coreplugin/locator/locatormanager.h b/src/plugins/coreplugin/locator/locatormanager.h index ffc7493cd07..5d58da418ae 100644 --- a/src/plugins/coreplugin/locator/locatormanager.h +++ b/src/plugins/coreplugin/locator/locatormanager.h @@ -44,6 +44,8 @@ public: static void show(const QString &text, int selectionStart = -1, int selectionLength = 0); static QWidget *createLocatorInputWidget(QWidget *window); + + static bool locatorHasFocus(); }; } // namespace Core diff --git a/src/plugins/coreplugin/menubarfilter.cpp b/src/plugins/coreplugin/menubarfilter.cpp index c9ba7428ced..7d426a7f0d3 100644 --- a/src/plugins/coreplugin/menubarfilter.cpp +++ b/src/plugins/coreplugin/menubarfilter.cpp @@ -28,6 +28,8 @@ #include "actionmanager/actioncontainer.h" #include "actionmanager/actionmanager.h" #include "coreconstants.h" +#include "icore.h" +#include "locator/locatormanager.h" #include #include @@ -38,6 +40,11 @@ #include #include +uint qHash(const QPointer &p, uint seed) +{ + return qHash(p.data(), seed); +} + using namespace Core::Internal; using namespace Core; @@ -46,6 +53,10 @@ MenuBarFilter::MenuBarFilter() setId("Actions from the menu"); setDisplayName(tr("Actions from the Menu")); setShortcutString("t"); + connect(ICore::instance(), &ICore::contextAboutToChange, this, [this] { + if (LocatorManager::locatorHasFocus()) + updateEnabledActionCache(); + }); } static const QList menuBarActions() @@ -88,7 +99,7 @@ QList MenuBarFilter::matchesForAction(QAction *action, QVector &processedMenus) { QList entries; - if (!action->isEnabled()) + if (!m_enabledActions.contains(action)) return entries; const QString text = Utils::stripAccelerator(action->text()); if (QMenu *menu = action->menu()) { @@ -149,6 +160,24 @@ static void requestMenuUpdate(const QAction* action) } } +void MenuBarFilter::updateEnabledActionCache() +{ + m_enabledActions.clear(); + QList queue = menuBarActions(); + for (QAction *action : qAsConst(queue)) + requestMenuUpdate(action); + while (!queue.isEmpty()) { + QAction *action = queue.takeFirst(); + if (action->isEnabled()) { + m_enabledActions.insert(action); + if (QMenu *menu = action->menu()) { + if (menu->isEnabled()) + queue.append(menu->actions()); + } + } + } +} + void Core::Internal::MenuBarFilter::prepareSearch(const QString &entry) { Q_UNUSED(entry); diff --git a/src/plugins/coreplugin/menubarfilter.h b/src/plugins/coreplugin/menubarfilter.h index 68f98dddeac..39633aa6f1f 100644 --- a/src/plugins/coreplugin/menubarfilter.h +++ b/src/plugins/coreplugin/menubarfilter.h @@ -27,6 +27,10 @@ #include +#include +#include +#include + QT_BEGIN_NAMESPACE class QAction; class QMenu; @@ -52,8 +56,10 @@ private: const QStringList &entryPath, const QStringList &path, QVector &processedMenus); + void updateEnabledActionCache(); QList m_entries; + QSet> m_enabledActions; }; } // namespace Internal