forked from qt-creator/qt-creator
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 <david.schulz@qt.io>
This commit is contained in:
@@ -34,6 +34,8 @@
|
|||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
using namespace Core::Internal;
|
using namespace Core::Internal;
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
@@ -95,4 +97,15 @@ QWidget *LocatorManager::createLocatorInputWidget(QWidget *window)
|
|||||||
return locatorWidget;
|
return locatorWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LocatorManager::locatorHasFocus()
|
||||||
|
{
|
||||||
|
QWidget *w = qApp->focusWidget();
|
||||||
|
while (w) {
|
||||||
|
if (qobject_cast<LocatorWidget *>(w))
|
||||||
|
return true;
|
||||||
|
w = w->parentWidget();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
@@ -44,6 +44,8 @@ public:
|
|||||||
static void show(const QString &text, int selectionStart = -1, int selectionLength = 0);
|
static void show(const QString &text, int selectionStart = -1, int selectionLength = 0);
|
||||||
|
|
||||||
static QWidget *createLocatorInputWidget(QWidget *window);
|
static QWidget *createLocatorInputWidget(QWidget *window);
|
||||||
|
|
||||||
|
static bool locatorHasFocus();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
@@ -28,6 +28,8 @@
|
|||||||
#include "actionmanager/actioncontainer.h"
|
#include "actionmanager/actioncontainer.h"
|
||||||
#include "actionmanager/actionmanager.h"
|
#include "actionmanager/actionmanager.h"
|
||||||
#include "coreconstants.h"
|
#include "coreconstants.h"
|
||||||
|
#include "icore.h"
|
||||||
|
#include "locator/locatormanager.h"
|
||||||
|
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
@@ -38,6 +40,11 @@
|
|||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
uint qHash(const QPointer<QAction> &p, uint seed)
|
||||||
|
{
|
||||||
|
return qHash(p.data(), seed);
|
||||||
|
}
|
||||||
|
|
||||||
using namespace Core::Internal;
|
using namespace Core::Internal;
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
|
|
||||||
@@ -46,6 +53,10 @@ MenuBarFilter::MenuBarFilter()
|
|||||||
setId("Actions from the menu");
|
setId("Actions from the menu");
|
||||||
setDisplayName(tr("Actions from the Menu"));
|
setDisplayName(tr("Actions from the Menu"));
|
||||||
setShortcutString("t");
|
setShortcutString("t");
|
||||||
|
connect(ICore::instance(), &ICore::contextAboutToChange, this, [this] {
|
||||||
|
if (LocatorManager::locatorHasFocus())
|
||||||
|
updateEnabledActionCache();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static const QList<QAction *> menuBarActions()
|
static const QList<QAction *> menuBarActions()
|
||||||
@@ -88,7 +99,7 @@ QList<LocatorFilterEntry> MenuBarFilter::matchesForAction(QAction *action,
|
|||||||
QVector<const QMenu *> &processedMenus)
|
QVector<const QMenu *> &processedMenus)
|
||||||
{
|
{
|
||||||
QList<LocatorFilterEntry> entries;
|
QList<LocatorFilterEntry> entries;
|
||||||
if (!action->isEnabled())
|
if (!m_enabledActions.contains(action))
|
||||||
return entries;
|
return entries;
|
||||||
const QString text = Utils::stripAccelerator(action->text());
|
const QString text = Utils::stripAccelerator(action->text());
|
||||||
if (QMenu *menu = action->menu()) {
|
if (QMenu *menu = action->menu()) {
|
||||||
@@ -149,6 +160,24 @@ static void requestMenuUpdate(const QAction* action)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MenuBarFilter::updateEnabledActionCache()
|
||||||
|
{
|
||||||
|
m_enabledActions.clear();
|
||||||
|
QList<QAction *> 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)
|
void Core::Internal::MenuBarFilter::prepareSearch(const QString &entry)
|
||||||
{
|
{
|
||||||
Q_UNUSED(entry);
|
Q_UNUSED(entry);
|
||||||
|
@@ -27,6 +27,10 @@
|
|||||||
|
|
||||||
#include <coreplugin/locator/ilocatorfilter.h>
|
#include <coreplugin/locator/ilocatorfilter.h>
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <QPointer>
|
||||||
|
#include <QSet>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QAction;
|
class QAction;
|
||||||
class QMenu;
|
class QMenu;
|
||||||
@@ -52,8 +56,10 @@ private:
|
|||||||
const QStringList &entryPath,
|
const QStringList &entryPath,
|
||||||
const QStringList &path,
|
const QStringList &path,
|
||||||
QVector<const QMenu *> &processedMenus);
|
QVector<const QMenu *> &processedMenus);
|
||||||
|
void updateEnabledActionCache();
|
||||||
|
|
||||||
QList<LocatorFilterEntry> m_entries;
|
QList<LocatorFilterEntry> m_entries;
|
||||||
|
QSet<QPointer<QAction>> m_enabledActions;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
Reference in New Issue
Block a user