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")); }