summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libs/utils/stringutils.cpp8
-rw-r--r--src/libs/utils/stringutils.h3
-rw-r--r--src/plugins/coreplugin/actionmanager/command.cpp6
-rw-r--r--src/plugins/coreplugin/dialogs/ioptionspage.cpp14
-rw-r--r--src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp7
-rw-r--r--src/plugins/coreplugin/locator/commandlocator.cpp5
-rw-r--r--src/plugins/designer/settingspage.cpp4
-rw-r--r--tests/auto/utils/stringutils/tst_stringutils.cpp26
8 files changed, 55 insertions, 18 deletions
diff --git a/src/libs/utils/stringutils.cpp b/src/libs/utils/stringutils.cpp
index 04df87fb5f..b69bfe6f97 100644
--- a/src/libs/utils/stringutils.cpp
+++ b/src/libs/utils/stringutils.cpp
@@ -238,4 +238,12 @@ QTCREATOR_UTILS_EXPORT QString expandMacros(const QString &str, AbstractMacroExp
return ret;
}
+QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text)
+{
+ QString res = text;
+ for (int index = res.indexOf('&'); index != -1; index = res.indexOf('&', index + 1))
+ res.remove(index, 1);
+ return res;
+}
+
} // namespace Utils
diff --git a/src/libs/utils/stringutils.h b/src/libs/utils/stringutils.h
index 20f6063710..8ff42bac6a 100644
--- a/src/libs/utils/stringutils.h
+++ b/src/libs/utils/stringutils.h
@@ -50,6 +50,9 @@ QTCREATOR_UTILS_EXPORT QString commonPath(const QStringList &files);
// If path is not sub of home path, or when running on Windows, returns the input
QTCREATOR_UTILS_EXPORT QString withTildeHomePath(const QString &path);
+// Removes first unescaped ampersand in text
+QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text);
+
class QTCREATOR_UTILS_EXPORT AbstractMacroExpander
{
public:
diff --git a/src/plugins/coreplugin/actionmanager/command.cpp b/src/plugins/coreplugin/actionmanager/command.cpp
index 186ac4649f..45d72ecead 100644
--- a/src/plugins/coreplugin/actionmanager/command.cpp
+++ b/src/plugins/coreplugin/actionmanager/command.cpp
@@ -30,6 +30,7 @@
#include <coreplugin/id.h>
#include <utils/hostosinfo.h>
+#include <utils/stringutils.h>
#include <QAction>
#include <QRegExp>
@@ -263,9 +264,8 @@ QString Action::description() const
{
if (!m_defaultText.isEmpty())
return m_defaultText;
- if (action()) {
- QString text = action()->text();
- text.remove(QRegExp(QLatin1String("&(?!&)")));
+ if (QAction *act = action()) {
+ const QString text = Utils::stripAccelerator(act->text());
if (!text.isEmpty())
return text;
}
diff --git a/src/plugins/coreplugin/dialogs/ioptionspage.cpp b/src/plugins/coreplugin/dialogs/ioptionspage.cpp
index 04a7b3131b..16ac6e9184 100644
--- a/src/plugins/coreplugin/dialogs/ioptionspage.cpp
+++ b/src/plugins/coreplugin/dialogs/ioptionspage.cpp
@@ -28,6 +28,8 @@
#include "ioptionspage.h"
+#include <utils/stringutils.h>
+
#include <QCheckBox>
#include <QGroupBox>
#include <QIcon>
@@ -165,18 +167,14 @@ bool Core::IOptionsPage::matches(const QString &searchKeyWord) const
return false;
// find common subwidgets
foreach (const QLabel *label, widget->findChildren<QLabel *>())
- m_keywords << label->text();
+ m_keywords << Utils::stripAccelerator(label->text());
foreach (const QCheckBox *checkbox, widget->findChildren<QCheckBox *>())
- m_keywords << checkbox->text();
+ m_keywords << Utils::stripAccelerator(checkbox->text());
foreach (const QPushButton *pushButton, widget->findChildren<QPushButton *>())
- m_keywords << pushButton->text();
+ m_keywords << Utils::stripAccelerator(pushButton->text());
foreach (const QGroupBox *groupBox, widget->findChildren<QGroupBox *>())
- m_keywords << groupBox->title();
+ m_keywords << Utils::stripAccelerator(groupBox->title());
- // clean up accelerators
- QMutableStringListIterator it(m_keywords);
- while (it.hasNext())
- it.next().remove(QLatin1Char('&'));
m_keywordsInitialized = true;
}
foreach (const QString &keyword, m_keywords)
diff --git a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
index 88eaa2cba6..5f7ecedd23 100644
--- a/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
+++ b/src/plugins/coreplugin/dialogs/readonlyfilesdialog.cpp
@@ -35,6 +35,7 @@
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
+#include <utils/stringutils.h>
#include <QDir>
#include <QFileInfo>
@@ -211,7 +212,7 @@ void ReadOnlyFilesDialogPrivate::promptFailWarning(const QStringList &files, Rea
switch (type) {
case ReadOnlyFilesDialog::RO_OpenVCS: {
if (IVersionControl *vc = versionControls[file]) {
- const QString openText = vc->vcsOpenText().remove(QLatin1Char('&'));
+ const QString openText = Utils::stripAccelerator(vc->vcsOpenText());
title = tr("Failed to %1 File").arg(openText);
message = tr("%1 file %2 from version control system %3 failed.")
.arg(openText)
@@ -411,9 +412,9 @@ void ReadOnlyFilesDialogPrivate::initDialog(const QStringList &fileNames)
&& versionControlForFile->openSupportMode(fileName) != IVersionControl::NoOpen;
if (fileManagedByVCS) {
const QString vcsOpenTextForFile =
- versionControlForFile->vcsOpenText().remove(QLatin1Char('&'));
+ Utils::stripAccelerator(versionControlForFile->vcsOpenText());
const QString vcsMakeWritableTextforFile =
- versionControlForFile->vcsMakeWritableText().remove(QLatin1Char('&'));
+ Utils::stripAccelerator(versionControlForFile->vcsMakeWritableText());
if (!useVCS) {
vcsOpenTextForAll = vcsOpenTextForFile;
vcsMakeWritableTextForAll = vcsMakeWritableTextforFile;
diff --git a/src/plugins/coreplugin/locator/commandlocator.cpp b/src/plugins/coreplugin/locator/commandlocator.cpp
index bb38336656..2768dca3a3 100644
--- a/src/plugins/coreplugin/locator/commandlocator.cpp
+++ b/src/plugins/coreplugin/locator/commandlocator.cpp
@@ -28,6 +28,7 @@
#include <coreplugin/actionmanager/command.h>
#include <utils/qtcassert.h>
+#include <utils/stringutils.h>
#include <QAction>
@@ -66,7 +67,6 @@ QList<LocatorFilterEntry> CommandLocator::matchesFor(QFutureInterface<LocatorFil
QList<LocatorFilterEntry> betterEntries;
// Get active, enabled actions matching text, store in list.
// Reference via index in extraInfo.
- const QChar ampersand = QLatin1Char('&');
const Qt::CaseSensitivity entryCaseSensitivity = caseSensitivity(entry);
const int count = d->commands.size();
for (int i = 0; i < count; i++) {
@@ -77,8 +77,7 @@ QList<LocatorFilterEntry> CommandLocator::matchesFor(QFutureInterface<LocatorFil
QAction *action = d->commands.at(i)->action();
if (action && action->isEnabled()) {
- QString text = action->text();
- text.remove(ampersand);
+ const QString text = Utils::stripAccelerator(action->text());
const int index = text.indexOf(entry, 0, entryCaseSensitivity);
if (index >= 0) {
LocatorFilterEntry filterEntry(this, text, QVariant(i));
diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp
index 0730e5fec5..137f9a66aa 100644
--- a/src/plugins/designer/settingspage.cpp
+++ b/src/plugins/designer/settingspage.cpp
@@ -28,6 +28,8 @@
#include <coreplugin/icontext.h>
+#include <utils/stringutils.h>
+
#include <QDesignerOptionsPageInterface>
#include <QCoreApplication>
@@ -116,7 +118,7 @@ bool SettingsPageProvider::matches(const QString &searchKeyWord) const
if (m_keywords.isEmpty()) {
m_keywords.reserve(itemCount);
for (size_t i = 0; i < itemCount; ++i)
- m_keywords << QCoreApplication::translate(uitext[i].context, uitext[i].value).remove(QLatin1Char('&'));
+ m_keywords << Utils::stripAccelerator(QCoreApplication::translate(uitext[i].context, uitext[i].value));
}
foreach (const QString &key, m_keywords) {
if (key.contains(searchKeyWord, Qt::CaseInsensitive))
diff --git a/tests/auto/utils/stringutils/tst_stringutils.cpp b/tests/auto/utils/stringutils/tst_stringutils.cpp
index d9d47e1845..96a950bb43 100644
--- a/tests/auto/utils/stringutils/tst_stringutils.cpp
+++ b/tests/auto/utils/stringutils/tst_stringutils.cpp
@@ -80,6 +80,8 @@ private slots:
void testWithTildeHomePath();
void testMacroExpander_data();
void testMacroExpander();
+ void testStripAccelerator();
+ void testStripAccelerator_data();
private:
TestMacroExpander mx;
@@ -176,6 +178,30 @@ void tst_StringUtils::testMacroExpander()
QCOMPARE(in, out);
}
+void tst_StringUtils::testStripAccelerator()
+{
+ QFETCH(QString, expected);
+
+ QCOMPARE(Utils::stripAccelerator(QTest::currentDataTag()), expected);
+}
+
+void tst_StringUtils::testStripAccelerator_data()
+{
+ QTest::addColumn<QString>("expected");
+
+ QTest::newRow("Test") << "Test";
+ QTest::newRow("&Test") << "Test";
+ QTest::newRow("&&Test") << "&Test";
+ QTest::newRow("T&est") << "Test";
+ QTest::newRow("&Te&&st") << "Te&st";
+ QTest::newRow("T&e&st") << "Test";
+ QTest::newRow("T&&est") << "T&est";
+ QTest::newRow("T&&e&st") << "T&est";
+ QTest::newRow("T&&&est") << "T&est";
+ QTest::newRow("Tes&t") << "Test";
+ QTest::newRow("Test&") << "Test";
+}
+
QTEST_MAIN(tst_StringUtils)
#include "tst_stringutils.moc"