MenuBarFilter: Do not access menu bar and actions from non-UI thread

Nothing of this is thread-safe and needs to be done in the UI thread.
Luckily this is easy for locator filters: prepareSearch is run in the UI
thread, and matchesFor is guaranteed to never run while prepareSearch
runs.

Change-Id: I757a2488db7254b8973c21dbda221a116b4bf6e9
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2018-07-16 16:13:25 +02:00
parent 16c93b423d
commit 1bf2ff6d92
2 changed files with 13 additions and 12 deletions

View File

@@ -59,17 +59,8 @@ QList<LocatorFilterEntry> MenuBarFilter::matchesFor(QFutureInterface<LocatorFilt
const QString &entry)
{
Q_UNUSED(future);
static const QString separators = ". >/";
static const QRegularExpression seperatorRegExp(QString("[%1]").arg(separators));
QList<LocatorFilterEntry> entries;
QString normalized = entry;
normalized.replace(seperatorRegExp, separators.at(0));
const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts);
QVector<const QMenu *> processedMenus;
for (QAction* action : menuBarActions())
entries << matchesForAction(action, entryPath, QStringList(), processedMenus);
return entries;
Q_UNUSED(entry);
return std::move(m_entries);
}
void MenuBarFilter::accept(LocatorFilterEntry selection, QString *newText,
@@ -161,6 +152,15 @@ static void requestMenuUpdate(const QAction* action)
void Core::Internal::MenuBarFilter::prepareSearch(const QString &entry)
{
Q_UNUSED(entry);
for (const QAction *action : menuBarActions())
static const QString separators = ". >/";
static const QRegularExpression seperatorRegExp(QString("[%1]").arg(separators));
QString normalized = entry;
normalized.replace(seperatorRegExp, separators.at(0));
const QStringList entryPath = normalized.split(separators.at(0), QString::SkipEmptyParts);
m_entries.clear();
QVector<const QMenu *> processedMenus;
for (QAction* action : menuBarActions()) {
requestMenuUpdate(action);
m_entries << matchesForAction(action, entryPath, QStringList(), processedMenus);
}
}

View File

@@ -53,6 +53,7 @@ private:
const QStringList &path,
QVector<const QMenu *> &processedMenus);
QList<LocatorFilterEntry> m_entries;
};
} // namespace Internal