Fix that menus didn't show ampersands in files names

And instead interpreted the ampersand + following character as an
accelerator key.

Task-number: QTCREATORBUG-17817
Change-Id: I327239499ce56e75fd12f2df5be60d4b04913acd
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Eike Ziller
2018-03-26 10:44:10 +02:00
parent 3fa8db13e9
commit f1e02c0826
7 changed files with 27 additions and 11 deletions

View File

@@ -375,4 +375,10 @@ int caseFriendlyCompare(const QString &a, const QString &b)
return a.compare(b, Qt::CaseSensitive); return a.compare(b, Qt::CaseSensitive);
} }
QString quoteAmpersands(const QString &text)
{
QString result = text;
return result.replace("&", "&&");
}
} // namespace Utils } // namespace Utils

View File

@@ -53,6 +53,8 @@ QTCREATOR_UTILS_EXPORT QString withTildeHomePath(const QString &path);
// Removes first unescaped ampersand in text // Removes first unescaped ampersand in text
QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text); QTCREATOR_UTILS_EXPORT QString stripAccelerator(const QString &text);
// Quotes all ampersands
QTCREATOR_UTILS_EXPORT QString quoteAmpersands(const QString &text);
QTCREATOR_UTILS_EXPORT bool readMultiLineString(const QJsonValue &value, QString *out); QTCREATOR_UTILS_EXPORT bool readMultiLineString(const QJsonValue &value, QString *out);

View File

@@ -70,8 +70,9 @@
#include <utils/macroexpander.h> #include <utils/macroexpander.h>
#include <utils/mimetypes/mimedatabase.h> #include <utils/mimetypes/mimedatabase.h>
#include <utils/mimetypes/mimetype.h> #include <utils/mimetypes/mimetype.h>
#include <utils/qtcassert.h>
#include <utils/overridecursor.h> #include <utils/overridecursor.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QClipboard> #include <QClipboard>
@@ -1695,7 +1696,8 @@ void EditorManagerPrivate::setupSaveActions(IDocument *document, QAction *saveAc
revertToSavedAction->setEnabled(hasFile); revertToSavedAction->setEnabled(hasFile);
if (document && !document->displayName().isEmpty()) { if (document && !document->displayName().isEmpty()) {
const QString quotedName = QLatin1Char('"') + document->displayName() + QLatin1Char('"'); const QString quotedName = QLatin1Char('"')
+ Utils::quoteAmpersands(document->displayName()) + QLatin1Char('"');
saveAction->setText(tr("&Save %1").arg(quotedName)); saveAction->setText(tr("&Save %1").arg(quotedName));
saveAsAction->setText(tr("Save %1 &As...").arg(quotedName)); saveAsAction->setText(tr("Save %1 &As...").arg(quotedName));
revertToSavedAction->setText(document->isModified() revertToSavedAction->setText(document->isModified()
@@ -1718,7 +1720,8 @@ void EditorManagerPrivate::updateActions()
QString quotedName; QString quotedName;
if (curDocument) if (curDocument)
quotedName = QLatin1Char('"') + curDocument->displayName() + QLatin1Char('"'); quotedName = QLatin1Char('"') + Utils::quoteAmpersands(curDocument->displayName())
+ QLatin1Char('"');
setupSaveActions(curDocument, d->m_saveAction, d->m_saveAsAction, d->m_revertToSavedAction); setupSaveActions(curDocument, d->m_saveAction, d->m_saveAsAction, d->m_revertToSavedAction);
d->m_closeCurrentEditorAction->setEnabled(curDocument); d->m_closeCurrentEditorAction->setEnabled(curDocument);
@@ -2397,11 +2400,12 @@ void EditorManager::addSaveAndCloseEditorActions(QMenu *contextMenu, DocumentMod
contextMenu->addSeparator(); contextMenu->addSeparator();
const QString quotedDisplayName = Utils::quoteAmpersands(entry->displayName());
d->m_closeCurrentEditorContextAction->setText(entry d->m_closeCurrentEditorContextAction->setText(entry
? tr("Close \"%1\"").arg(entry->displayName()) ? tr("Close \"%1\"").arg(quotedDisplayName)
: tr("Close Editor")); : tr("Close Editor"));
d->m_closeOtherDocumentsContextAction->setText(entry d->m_closeOtherDocumentsContextAction->setText(entry
? tr("Close All Except \"%1\"").arg(entry->displayName()) ? tr("Close All Except \"%1\"").arg(quotedDisplayName)
: tr("Close Other Editors")); : tr("Close Other Editors"));
d->m_closeCurrentEditorContextAction->setEnabled(entry != nullptr); d->m_closeCurrentEditorContextAction->setEnabled(entry != nullptr);
d->m_closeOtherDocumentsContextAction->setEnabled(entry != nullptr); d->m_closeOtherDocumentsContextAction->setEnabled(entry != nullptr);

View File

@@ -1060,7 +1060,8 @@ void MainWindow::aboutToShowRecentFiles()
for (int i = 0; i < recentFiles.count(); ++i) { for (int i = 0; i < recentFiles.count(); ++i) {
const DocumentManager::RecentFile file = recentFiles[i]; const DocumentManager::RecentFile file = recentFiles[i];
const QString filePath = QDir::toNativeSeparators(withTildeHomePath(file.first)); const QString filePath
= Utils::quoteAmpersands(QDir::toNativeSeparators(withTildeHomePath(file.first)));
const QString actionText = ActionManager::withNumberAccelerator(filePath, i + 1); const QString actionText = ActionManager::withNumberAccelerator(filePath, i + 1);
QAction *action = menu->addAction(actionText); QAction *action = menu->addAction(actionText);
connect(action, &QAction::triggered, this, [file] { connect(action, &QAction::triggered, this, [file] {

View File

@@ -34,6 +34,7 @@
#include <app/app_version.h> #include <app/app_version.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <QAction> #include <QAction>
#include <QEvent> #include <QEvent>
@@ -194,7 +195,7 @@ void WindowList::updateTitle(QWidget *window)
QString title = window->windowTitle(); QString title = window->windowTitle();
if (title.endsWith(QStringLiteral("- ") + Constants::IDE_DISPLAY_NAME)) if (title.endsWith(QStringLiteral("- ") + Constants::IDE_DISPLAY_NAME))
title.chop(12); title.chop(12);
m_windowActions.at(index)->setText(title.trimmed()); m_windowActions.at(index)->setText(Utils::quoteAmpersands(title.trimmed()));
} }
void WindowList::removeWindow(QWidget *window) void WindowList::removeWindow(QWidget *window)

View File

@@ -59,9 +59,10 @@
#include <coreplugin/messagebox.h> #include <coreplugin/messagebox.h>
#include <utils/asconst.h> #include <utils/asconst.h>
#include <utils/qtcassert.h>
#include <utils/parameteraction.h> #include <utils/parameteraction.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
@@ -1358,7 +1359,7 @@ void GitPlugin::updateActions(VcsBasePlugin::ActionState as)
updateVersionWarning(); updateVersionWarning();
// Note: This menu is visible if there is no repository. Only // Note: This menu is visible if there is no repository. Only
// 'Create Repository'/'Show' actions should be available. // 'Create Repository'/'Show' actions should be available.
const QString fileName = state.currentFileName(); const QString fileName = Utils::quoteAmpersands(state.currentFileName());
for (ParameterAction *fileAction : Utils::asConst(m_fileActions)) for (ParameterAction *fileAction : Utils::asConst(m_fileActions))
fileAction->setParameter(fileName); fileAction->setParameter(fileName);
// If the current file looks like a patch, offer to apply // If the current file looks like a patch, offer to apply

View File

@@ -46,8 +46,9 @@
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <utils/proxyaction.h> #include <utils/proxyaction.h>
#include <utils/utilsicons.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h>
#include <utils/utilsicons.h>
#include <qmljs/qmljsreformatter.h> #include <qmljs/qmljsreformatter.h>
@@ -281,7 +282,7 @@ void ShortCutManager::updateActions(Core::IEditor* currentEditor)
QString quotedName; QString quotedName;
if (currentEditor && document) if (currentEditor && document)
quotedName = '"' + document->displayName() + '"'; quotedName = '"' + Utils::quoteAmpersands(document->displayName()) + '"';
m_saveAsAction.setText(tr("Save %1 As...").arg(quotedName)); m_saveAsAction.setText(tr("Save %1 As...").arg(quotedName));
m_saveAction.setText(tr("&Save %1").arg(quotedName)); m_saveAction.setText(tr("&Save %1").arg(quotedName));