From 59b7601c58fb2a4bbc2505c6455f2608ba41fd1d Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 23 Sep 2016 00:39:50 +0200 Subject: [PATCH] ProjectExplorer: default icons for IDevice Enable devices to define their default themable icon. Kit icons are now by default the Desktopdevice icon, overridable by the device icon of the kit's device, in turn overridable by an icon file path. KitManagerConfigWidget: The browse button for the Kit icon gets a "reset" action. Change-Id: I6328ba7d640393aee2c324c592e76b4d5430586a Reviewed-by: Tobias Hunger --- src/plugins/android/androidconfigurations.cpp | 1 - src/plugins/android/androiddevice.cpp | 1 + src/plugins/ios/iosdevice.cpp | 2 + .../projectexplorer/devicesupport/idevice.cpp | 16 +++++++ .../projectexplorer/devicesupport/idevice.h | 4 ++ src/plugins/projectexplorer/kit.cpp | 47 ++++++++++--------- src/plugins/projectexplorer/kit.h | 1 - src/plugins/projectexplorer/kitmanager.cpp | 1 - .../kitmanagerconfigwidget.cpp | 26 +++++++--- .../projectexplorer/kitmanagerconfigwidget.h | 1 + .../projectexplorerconstants.h | 1 - .../projectexplorer/settingsaccessor.cpp | 6 ++- 12 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 0fad4155d05..191555b948b 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -1312,7 +1312,6 @@ void AndroidConfigurations::updateAutomaticKitList() foreach (QtSupport::BaseQtVersion *qt, qtVersions) { Kit *newKit = new Kit; newKit->setAutoDetected(true); - newKit->setIconPath(FileName::fromString(QLatin1String(Constants::ANDROID_SETTINGS_CATEGORY_ICON))); DeviceTypeKitInformation::setDeviceTypeId(newKit, Core::Id(Constants::ANDROID_DEVICE_TYPE)); ToolChainKitInformation::setToolChain(newKit, tc); QtSupport::QtKitInformation::setQtVersion(newKit, qt); diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index c3717ed6fdc..34e915164e4 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -45,6 +45,7 @@ AndroidDevice::AndroidDevice() { setDisplayName(QCoreApplication::translate("Android::Internal::AndroidDevice", "Run on Android")); setDeviceState(DeviceReadyToUse); + setDeviceIcon({Utils::Icon(":/android/images/QtAndroid.png")}); } AndroidDevice::AndroidDevice(const AndroidDevice &other) diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp index 4945b4cd0a7..69d1703124b 100644 --- a/src/plugins/ios/iosdevice.cpp +++ b/src/plugins/ios/iosdevice.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -91,6 +92,7 @@ IosDevice::IosDevice() ports.addRange(Utils::Port(Constants::IOS_DEVICE_PORT_START), Utils::Port(Constants::IOS_DEVICE_PORT_END)); setFreePorts(ports); + setDeviceIcon({Utils::Icon(":/ios/images/iossettings.png")}); } IosDevice::IosDevice(const IosDevice &other) diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index f3a7b088634..f6608ee0e45 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -34,6 +34,8 @@ #include "../runnables.h" #include +#include +#include #include #include @@ -154,6 +156,8 @@ public: QSsh::SshConnectionParameters sshParameters; Utils::PortList freePorts; QString debugServerPath; + + QList deviceIcons; }; } // namespace Internal @@ -398,6 +402,18 @@ QString IDevice::deviceStateToString() const } } +void IDevice::setDeviceIcon(const QList &deviceIcon) +{ + d->deviceIcons = deviceIcon; +} + +QIcon IDevice::deviceIcon() const +{ + const QList icons = + Utils::transform(d->deviceIcons, [](const Utils::Icon &icon){return icon.icon();}); + return Utils::Icon::combinedIcon(icons); +} + QSsh::SshConnectionParameters IDevice::sshParameters() const { return d->sshParameters; diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h index d9874045d00..60ee5766051 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.h +++ b/src/plugins/projectexplorer/devicesupport/idevice.h @@ -43,6 +43,7 @@ namespace QSsh { class SshConnectionParameters; } namespace Utils { class Environment; +class Icon; class PortList; class Port; } // Utils @@ -166,6 +167,9 @@ public: void setDeviceState(const DeviceState state); QString deviceStateToString() const; + void setDeviceIcon(const QList &deviceIcon); + QIcon deviceIcon() const; + virtual void fromMap(const QVariantMap &map); virtual QVariantMap toMap() const; virtual Ptr clone() const = 0; diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 06b0e19f12e..e41e9a3a176 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -25,6 +25,7 @@ #include "kit.h" +#include "kitinformation.h" #include "kitmanager.h" #include "ioutputparser.h" #include "osparser.h" @@ -78,7 +79,6 @@ public: m_id = Id::fromString(QUuid::createUuid().toString()); m_unexpandedDisplayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed"); - m_iconPath = FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON); m_macroExpander.setDisplayName(tr("Kit")); m_macroExpander.setAccumulating(true); @@ -116,7 +116,7 @@ public: bool m_hasWarning = false; bool m_hasValidityInfo = false; bool m_mustNotify = false; - QIcon m_icon; + QIcon m_cachedIcon; FileName m_iconPath; QHash m_data; @@ -136,8 +136,6 @@ Kit::Kit(Id id) : { foreach (KitInformation *sti, KitManager::kitInformation()) d->m_data.insert(sti->id(), sti->defaultValue(this)); - - d->m_icon = icon(d->m_iconPath); } Kit::Kit(const QVariantMap &data) : @@ -160,7 +158,6 @@ Kit::Kit(const QVariantMap &data) : d->m_fileSystemFriendlyName = data.value(QLatin1String(FILESYSTEMFRIENDLYNAME_KEY)).toString(); d->m_iconPath = FileName::fromString(data.value(QLatin1String(ICON_KEY), d->m_iconPath.toString()).toString()); - d->m_icon = icon(d->m_iconPath); QVariantMap extra = data.value(QLatin1String(DATA_KEY)).toMap(); d->m_data.clear(); // remove default values @@ -213,7 +210,7 @@ Kit *Kit::clone(bool keepName) const k->d->m_data = d->m_data; // Do not clone m_fileSystemFriendlyName, needs to be unique k->d->m_isValid = d->m_isValid; - k->d->m_icon = d->m_icon; + k->d->m_cachedIcon = d->m_cachedIcon; k->d->m_iconPath = d->m_iconPath; k->d->m_sticky = d->m_sticky; k->d->m_mutable = d->m_mutable; @@ -225,7 +222,7 @@ void Kit::copyFrom(const Kit *k) KitGuard g(this); d->m_data = k->d->m_data; d->m_iconPath = k->d->m_iconPath; - d->m_icon = k->d->m_icon; + d->m_cachedIcon = k->d->m_cachedIcon; d->m_autodetected = k->d->m_autodetected; d->m_autoDetectionSource = k->d->m_autoDetectionSource; d->m_unexpandedDisplayName = k->d->m_unexpandedDisplayName; @@ -361,24 +358,28 @@ Id Kit::id() const QIcon Kit::icon() const { - return d->m_icon; -} + if (!d->m_cachedIcon.isNull()) + return d->m_cachedIcon; -QIcon Kit::icon(const FileName &path) -{ - if (path.isEmpty()) - return QIcon(); + if (d->m_iconPath.exists()) { + d->m_cachedIcon = QIcon(d->m_iconPath.toString()); + return d->m_cachedIcon; + } - if (path == FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON)) - return creatorTheme()->flag(Theme::FlatSideBarIcons) - ? Icon::combinedIcon({Icons::DESKTOP_DEVICE.icon(), - Icons::DESKTOP_DEVICE_SMALL.icon()}) - : QApplication::style()->standardIcon(QStyle::SP_ComputerIcon); + const IDevice::ConstPtr kitDevice = DeviceKitInformation::device(this); + if (!kitDevice.isNull()) { + const QIcon deviceIcon = kitDevice->deviceIcon(); + if (!deviceIcon.isNull()) { + d->m_cachedIcon = deviceIcon; + return d->m_cachedIcon; + } + } - QFileInfo fi = path.toFileInfo(); - if (fi.isFile() && fi.isReadable()) - return QIcon(path.toString()); - return QIcon(); + d->m_cachedIcon = creatorTheme()->flag(Theme::FlatSideBarIcons) + ? Icon::combinedIcon({Icons::DESKTOP_DEVICE.icon(), + Icons::DESKTOP_DEVICE_SMALL.icon()}) + : QApplication::style()->standardIcon(QStyle::SP_ComputerIcon); + return d->m_cachedIcon; } FileName Kit::iconPath() const @@ -391,7 +392,6 @@ void Kit::setIconPath(const FileName &path) if (d->m_iconPath == path) return; d->m_iconPath = path; - d->m_icon = icon(path); kitUpdated(); } @@ -661,6 +661,7 @@ void Kit::kitUpdated() return; } d->m_hasValidityInfo = false; + d->m_cachedIcon = QIcon(); KitManager::notifyAboutUpdate(this); d->m_mustNotify = false; } diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 43f82f378a5..13f92bce474 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -84,7 +84,6 @@ public: Core::Id id() const; QIcon icon() const; - static QIcon icon(const Utils::FileName &path); Utils::FileName iconPath() const; void setIconPath(const Utils::FileName &path); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index d23712cda97..36f94b65cc5 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -205,7 +205,6 @@ void KitManager::restoreKits() defaultKit->setUnexpandedDisplayName(tr("Desktop")); defaultKit->setSdkProvided(false); defaultKit->setAutoDetected(false); - defaultKit->setIconPath(FileName::fromLatin1(ProjectExplorer::Constants::DESKTOP_DEVICE_ICON)); defaultKit->setup(); diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index d5b4d60e872..b0ac5fa4ca7 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -95,11 +95,19 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : label = createLabel(tr("Name:"), toolTip); m_layout->addWidget(label, 0, LabelColumn, alignment); m_iconButton->setToolTip(toolTip); + auto setIconAction = new QAction(tr("Select a file as icon"), this); + m_iconButton->addAction(setIconAction); + auto resetIconAction = new QAction(tr("Reset to the device default icon"), this); + m_iconButton->addAction(resetIconAction); discard(); connect(m_iconButton, &QAbstractButton::clicked, this, &KitManagerConfigWidget::setIcon); + connect(setIconAction, &QAction::triggered, + this, &KitManagerConfigWidget::setIcon); + connect(resetIconAction, &QAction::triggered, + this, &KitManagerConfigWidget::resetIcon); connect(m_nameEdit, &QLineEdit::textChanged, this, &KitManagerConfigWidget::setDisplayName); @@ -289,19 +297,25 @@ void KitManagerConfigWidget::removeKit() void KitManagerConfigWidget::setIcon() { - const Utils::FileName path = Utils::FileName::fromString( - QFileDialog::getOpenFileName(this, tr("Select Icon"), - m_modifiedKit->iconPath().toString(), - tr("Images (*.png *.xpm *.jpg)"))); + const QString path = QFileDialog::getOpenFileName(this, tr("Select Icon"), + m_modifiedKit->iconPath().toString(), + tr("Images (*.png *.xpm *.jpg)")); if (path.isEmpty()) return; - const QIcon icon = Kit::icon(path); + const QIcon icon(path); if (icon.isNull()) return; m_iconButton->setIcon(icon); - m_modifiedKit->setIconPath(path); + m_modifiedKit->setIconPath(Utils::FileName::fromString(path)); + emit dirty(); +} + +void KitManagerConfigWidget::resetIcon() +{ + m_iconButton->setIcon(QIcon()); + m_modifiedKit->setIconPath(Utils::FileName()); emit dirty(); } diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.h b/src/plugins/projectexplorer/kitmanagerconfigwidget.h index 2054304a5b1..69da6776bc7 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.h +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.h @@ -75,6 +75,7 @@ signals: private: void setIcon(); + void resetIcon(); void setDisplayName(); void setFileSystemFriendlyName(); void workingCopyWasUpdated(ProjectExplorer::Kit *k); diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index b5f0cb31908..7be8911395e 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -226,7 +226,6 @@ const char DEFAULT_WORKING_DIR_ALTERNATE[] = "%{sourceDir}"; // Desktop Device related ids: const char DESKTOP_DEVICE_ID[] = "Desktop Device"; const char DESKTOP_DEVICE_TYPE[] = "Desktop"; -const char DESKTOP_DEVICE_ICON[] = ":///DESKTOP///"; const int DESKTOP_PORT_START = 30000; const int DESKTOP_PORT_END = 31000; diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index f0c0167a0ad..cb0381ba580 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -2087,12 +2087,14 @@ QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map) const QVariantMap &bc = buildIt.value(); Kit *tmpKit = rawKit; + const auto desktopDeviceIcon = FileName::fromLatin1(":///DESKTOP///"); + if (oldTargetId == QLatin1String("Qt4ProjectManager.Target.AndroidDeviceTarget")) { tmpKit->setIconPath(FileName::fromLatin1(":/android/images/QtAndroid.png")); tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); tmpKit->setValue("PE.Profile.Device", QString()); } else if (oldTargetId == QLatin1String("RemoteLinux.EmbeddedLinuxTarget")) { - tmpKit->setIconPath(FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON)); + tmpKit->setIconPath(desktopDeviceIcon); tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("GenericLinuxOsType")); tmpKit->setValue("PE.Profile.Device", QString()); } else if (oldTargetId == QLatin1String("Qt4ProjectManager.Target.HarmattanDeviceTarget")) { @@ -2116,7 +2118,7 @@ QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map) tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); } else { - tmpKit->setIconPath(FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON)); + tmpKit->setIconPath(desktopDeviceIcon); tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); }