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