diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 7f367331312..95398acc295 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -276,7 +276,7 @@ void CorePlugin::addToPathChooserContextMenu(Utils::PathChooser *pathChooser, QM }); menu->insertAction(firstAction, showInGraphicalShell); - auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalAction(), menu); + auto *showInTerminal = new QAction(Core::FileUtils::msgTerminalHereAction(), menu); connect(showInTerminal, &QAction::triggered, pathChooser, [pathChooser]() { Core::FileUtils::openTerminal(pathChooser->path()); }); diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 4d5bf55bb80..813d12739d0 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -214,7 +214,7 @@ EditorManagerPrivate::EditorManagerPrivate(QObject *parent) : m_closeOtherDocumentsContextAction(new QAction(EditorManager::tr("Close Others"), this)), m_closeAllEditorsExceptVisibleContextAction(new QAction(EditorManager::tr("Close All Except Visible"), this)), m_openGraphicalShellAction(new QAction(FileUtils::msgGraphicalShellAction(), this)), - m_openTerminalAction(new QAction(FileUtils::msgTerminalAction(), this)), + m_openTerminalAction(new QAction(FileUtils::msgTerminalHereAction(), this)), m_findInDirectoryAction(new QAction(FileUtils::msgFindInDirectory(), this)), m_filePropertiesAction(new QAction(tr("Properties..."), this)), m_pinAction(new QAction(tr("Pin"), this)) diff --git a/src/plugins/coreplugin/fileutils.cpp b/src/plugins/coreplugin/fileutils.cpp index 02392cb8887..223cc70cf65 100644 --- a/src/plugins/coreplugin/fileutils.cpp +++ b/src/plugins/coreplugin/fileutils.cpp @@ -135,13 +135,20 @@ QString FileUtils::msgGraphicalShellAction() return QApplication::translate("Core::Internal", "Show Containing Folder"); } -QString FileUtils::msgTerminalAction() +QString FileUtils::msgTerminalHereAction() { if (HostOsInfo::isWindowsHost()) return QApplication::translate("Core::Internal", "Open Command Prompt Here"); return QApplication::translate("Core::Internal", "Open Terminal Here"); } +QString FileUtils::msgTerminalWithAction() +{ + if (HostOsInfo::isWindowsHost()) + return QApplication::translate("Core::Internal", "Open Command Prompt With"); + return QApplication::translate("Core::Internal", "Open Terminal With"); +} + void FileUtils::removeFile(const QString &filePath, bool deleteFromFS) { // remove from version control diff --git a/src/plugins/coreplugin/fileutils.h b/src/plugins/coreplugin/fileutils.h index c7746251c1e..0067d1d7285 100644 --- a/src/plugins/coreplugin/fileutils.h +++ b/src/plugins/coreplugin/fileutils.h @@ -44,7 +44,8 @@ struct CORE_EXPORT FileUtils static QString msgFindInDirectory(); // Platform-dependent action descriptions static QString msgGraphicalShellAction(); - static QString msgTerminalAction(); + static QString msgTerminalHereAction(); + static QString msgTerminalWithAction(); // File operations aware of version control and file system case-insensitiveness static void removeFile(const QString &filePath, bool deleteFromFS); static bool renameFile(const QString &from, const QString &to); diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index 7d072588a76..b6a435d36ab 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -68,7 +68,7 @@ QWidget *SystemSettings::widget() m_widget = new QWidget; m_page->setupUi(m_widget); m_page->terminalOpenArgs->setToolTip( - tr("Command line arguments used for \"%1\".").arg(FileUtils::msgTerminalAction())); + tr("Command line arguments used for \"%1\".").arg(FileUtils::msgTerminalHereAction())); m_page->reloadBehavior->setCurrentIndex(EditorManager::reloadSetting()); if (HostOsInfo::isAnyUnixHost()) { diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index 4a1261793f1..6dd298826da 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -199,9 +199,7 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) setWindowTitle(tr("Start Debugger")); d->kitChooser = new KitChooser(this); - d->kitChooser->setKitPredicate([](const Kit *k) { - return !DebuggerKitAspect::configurationErrors(k); - }); + d->kitChooser->setShowIcons(true); d->kitChooser->populate(); d->serverPortLabel = new QLabel(tr("Server port:"), this); diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 7f58bf4a13f..88e2e65adaa 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -400,6 +401,20 @@ QIcon Kit::icon() const return d->m_cachedIcon; } +QIcon Kit::displayIcon() const +{ + QIcon result = icon(); + if (hasWarning()) { + static const QIcon warningIcon(Utils::Icons::WARNING.icon()); + result = warningIcon; + } + if (!isValid()) { + static const QIcon errorIcon(Utils::Icons::CRITICAL.icon()); + result = errorIcon; + } + return result; +} + FilePath Kit::iconPath() const { return d->m_iconPath; diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 9f0fc91623b..8e45911d175 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -96,7 +96,8 @@ public: // all other aspects are equal. int weight() const; - QIcon icon() const; + QIcon icon() const; // Raw device icon, independent of warning or error. + QIcon displayIcon() const; // Error or warning or device icon. Utils::FilePath iconPath() const; void setIconPath(const Utils::FilePath &path); void setDeviceTypeForIcon(Core::Id deviceType); diff --git a/src/plugins/projectexplorer/kitchooser.cpp b/src/plugins/projectexplorer/kitchooser.cpp index b0b779122e8..c3a0204fba1 100644 --- a/src/plugins/projectexplorer/kitchooser.cpp +++ b/src/plugins/projectexplorer/kitchooser.cpp @@ -72,6 +72,11 @@ void KitChooser::onManageButtonClicked() Core::ICore::showOptionsDialog(Constants::KITS_SETTINGS_PAGE_ID, this); } +void KitChooser::setShowIcons(bool showIcons) +{ + m_showIcons = showIcons; +} + void KitChooser::onCurrentIndexChanged() { const Id id = Id::fromSetting(m_chooser->currentData()); @@ -127,9 +132,12 @@ void KitChooser::populate() foreach (Kit *kit, KitManager::sortKits(KitManager::kits())) { if (m_kitPredicate(kit)) { m_chooser->addItem(kitText(kit), kit->id().toSetting()); - m_chooser->setItemData(m_chooser->count() - 1, kitToolTip(kit), Qt::ToolTipRole); + const int pos = m_chooser->count() - 1; + m_chooser->setItemData(pos, kitToolTip(kit), Qt::ToolTipRole); + if (m_showIcons) + m_chooser->setItemData(pos, kit->displayIcon(), Qt::DecorationRole); if (!didActivate && kit->id() == lastKit) { - m_chooser->setCurrentIndex(m_chooser->count() - 1); + m_chooser->setCurrentIndex(pos); didActivate = true; } } diff --git a/src/plugins/projectexplorer/kitchooser.h b/src/plugins/projectexplorer/kitchooser.h index 0f23baa5378..046c18f571f 100644 --- a/src/plugins/projectexplorer/kitchooser.h +++ b/src/plugins/projectexplorer/kitchooser.h @@ -54,6 +54,7 @@ public: Core::Id currentKitId() const; void setKitPredicate(const Kit::Predicate &predicate); + void setShowIcons(bool showIcons); Kit *currentKit() const; bool hasStartupKit() const { return m_hasStartupKit; } @@ -78,6 +79,7 @@ private: QComboBox *m_chooser; QPushButton *m_manageButton; bool m_hasStartupKit = false; + bool m_showIcons = false; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index bcf5c472b89..cdd508b0785 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -155,9 +156,15 @@ QString KitManagerConfigWidget::displayName() const return m_cachedDisplayName; } -QIcon KitManagerConfigWidget::icon() const +QIcon KitManagerConfigWidget::displayIcon() const { - return m_modifiedKit->icon(); + // Special case: Extra warning if there are no errors but name is not unique. + if (m_modifiedKit->isValid() && !m_hasUniqueName) { + static const QIcon warningIcon(Utils::Icons::WARNING.icon()); + return warningIcon; + } + + return m_modifiedKit->displayIcon(); } void KitManagerConfigWidget::apply() @@ -199,16 +206,6 @@ bool KitManagerConfigWidget::isDirty() const || m_isDefaultKit != (KitManager::defaultKit() == m_kit); } -bool KitManagerConfigWidget::isValid() const -{ - return m_modifiedKit->isValid(); -} - -bool KitManagerConfigWidget::hasWarning() const -{ - return m_modifiedKit->hasWarning() || !m_hasUniqueName; -} - QString KitManagerConfigWidget::validityMessage() const { Tasks tmp; diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h index 9eda98582d9..cf1b6b44d6e 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h @@ -52,13 +52,11 @@ public: ~KitManagerConfigWidget() override; QString displayName() const; - QIcon icon() const; + QIcon displayIcon() const; void apply(); void discard(); bool isDirty() const; - bool isValid() const; - bool hasWarning() const; QString validityMessage() const; void addAspectToWorkingCopy(KitAspect *aspect); void makeStickySubWidgetsReadOnly(); diff --git a/src/plugins/projectexplorer/kitmodel.cpp b/src/plugins/projectexplorer/kitmodel.cpp index 937615154f2..5f157dcbb37 100644 --- a/src/plugins/projectexplorer/kitmodel.cpp +++ b/src/plugins/projectexplorer/kitmodel.cpp @@ -85,15 +85,7 @@ public: return baseName; } if (role == Qt::DecorationRole) { - if (!widget->isValid()) { - static const QIcon errorIcon(Utils::Icons::CRITICAL.icon()); - return errorIcon; - } - if (widget->hasWarning()) { - static const QIcon warningIcon(Utils::Icons::WARNING.icon()); - return warningIcon; - } - return widget->icon(); + return widget->displayIcon(); } if (role == Qt::ToolTipRole) { return widget->validityMessage(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index bb6f77f0332..82a8ff8ed3a 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -836,13 +836,11 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er mfileContextMenu->appendGroup(Constants::G_PROJECT_TREE); // Open Terminal submenu -#if !defined(Q_OS_UNIX) || QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) ActionContainer * const openTerminal = ActionManager::createMenu(ProjectExplorer::Constants::M_OPENTERMINALCONTEXT); openTerminal->setOnAllDisabledBehavior(ActionContainer::Show); dd->m_openTerminalMenu = openTerminal->menu(); - dd->m_openTerminalMenu->setTitle(FileUtils::msgTerminalAction()); -#endif + dd->m_openTerminalMenu->setTitle(FileUtils::msgTerminalWithAction()); // "open with" submenu ActionContainer * const openWith = @@ -910,23 +908,16 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er mfileContextMenu->addAction(cmd, Constants::G_FILE_OPEN); mfolderContextMenu->addAction(cmd, Constants::G_FOLDER_FILES); -#if !defined(Q_OS_UNIX) || QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) // Open Terminal Here menu - mfileContextMenu->addMenu(openTerminal, Constants::G_FILE_OPEN); - mfolderContextMenu->addMenu(openTerminal, Constants::G_FOLDER_FILES); - - dd->m_openTerminalHere = new QAction(tr("System Environment"), this); - cmd = ActionManager::registerAction(dd->m_openTerminalHere, Constants::OPENTERMINALHERE, - projecTreeContext); - dd->m_openTerminalMenu->addAction(dd->m_openTerminalHere); -#else - dd->m_openTerminalHere = new QAction(FileUtils::msgTerminalAction(), this); + dd->m_openTerminalHere = new QAction(FileUtils::msgTerminalHereAction(), this); cmd = ActionManager::registerAction(dd->m_openTerminalHere, Constants::OPENTERMINALHERE, projecTreeContext); mfileContextMenu->addAction(cmd, Constants::G_FILE_OPEN); mfolderContextMenu->addAction(cmd, Constants::G_FOLDER_FILES); -#endif + + mfileContextMenu->addMenu(openTerminal, Constants::G_FILE_OPEN); + mfolderContextMenu->addMenu(openTerminal, Constants::G_FOLDER_FILES); dd->m_openTerminalHereBuildEnv = new QAction(tr("Build Environment"), this); dd->m_openTerminalHereRunEnv = new QAction(tr("Run Environment"), this);