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 <tobias.hunger@qt.io>
This commit is contained in:
Alessandro Portale
2016-09-23 00:39:50 +02:00
parent 4e3dcbd4d8
commit 59b7601c58
12 changed files with 72 additions and 35 deletions

View File

@@ -1312,7 +1312,6 @@ void AndroidConfigurations::updateAutomaticKitList()
foreach (QtSupport::BaseQtVersion *qt, qtVersions) { foreach (QtSupport::BaseQtVersion *qt, qtVersions) {
Kit *newKit = new Kit; Kit *newKit = new Kit;
newKit->setAutoDetected(true); newKit->setAutoDetected(true);
newKit->setIconPath(FileName::fromString(QLatin1String(Constants::ANDROID_SETTINGS_CATEGORY_ICON)));
DeviceTypeKitInformation::setDeviceTypeId(newKit, Core::Id(Constants::ANDROID_DEVICE_TYPE)); DeviceTypeKitInformation::setDeviceTypeId(newKit, Core::Id(Constants::ANDROID_DEVICE_TYPE));
ToolChainKitInformation::setToolChain(newKit, tc); ToolChainKitInformation::setToolChain(newKit, tc);
QtSupport::QtKitInformation::setQtVersion(newKit, qt); QtSupport::QtKitInformation::setQtVersion(newKit, qt);

View File

@@ -45,6 +45,7 @@ AndroidDevice::AndroidDevice()
{ {
setDisplayName(QCoreApplication::translate("Android::Internal::AndroidDevice", "Run on Android")); setDisplayName(QCoreApplication::translate("Android::Internal::AndroidDevice", "Run on Android"));
setDeviceState(DeviceReadyToUse); setDeviceState(DeviceReadyToUse);
setDeviceIcon({Utils::Icon(":/android/images/QtAndroid.png")});
} }
AndroidDevice::AndroidDevice(const AndroidDevice &other) AndroidDevice::AndroidDevice(const AndroidDevice &other)

View File

@@ -31,6 +31,7 @@
#include <projectexplorer/devicesupport/devicemanager.h> #include <projectexplorer/devicesupport/devicemanager.h>
#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitinformation.h>
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <utils/icon.h>
#include <utils/portlist.h> #include <utils/portlist.h>
#include <QCoreApplication> #include <QCoreApplication>
@@ -91,6 +92,7 @@ IosDevice::IosDevice()
ports.addRange(Utils::Port(Constants::IOS_DEVICE_PORT_START), ports.addRange(Utils::Port(Constants::IOS_DEVICE_PORT_START),
Utils::Port(Constants::IOS_DEVICE_PORT_END)); Utils::Port(Constants::IOS_DEVICE_PORT_END));
setFreePorts(ports); setFreePorts(ports);
setDeviceIcon({Utils::Icon(":/ios/images/iossettings.png")});
} }
IosDevice::IosDevice(const IosDevice &other) IosDevice::IosDevice(const IosDevice &other)

View File

@@ -34,6 +34,8 @@
#include "../runnables.h" #include "../runnables.h"
#include <ssh/sshconnection.h> #include <ssh/sshconnection.h>
#include <utils/algorithm.h>
#include <utils/icon.h>
#include <utils/portlist.h> #include <utils/portlist.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -154,6 +156,8 @@ public:
QSsh::SshConnectionParameters sshParameters; QSsh::SshConnectionParameters sshParameters;
Utils::PortList freePorts; Utils::PortList freePorts;
QString debugServerPath; QString debugServerPath;
QList<Utils::Icon> deviceIcons;
}; };
} // namespace Internal } // namespace Internal
@@ -398,6 +402,18 @@ QString IDevice::deviceStateToString() const
} }
} }
void IDevice::setDeviceIcon(const QList<Utils::Icon> &deviceIcon)
{
d->deviceIcons = deviceIcon;
}
QIcon IDevice::deviceIcon() const
{
const QList<QIcon> icons =
Utils::transform(d->deviceIcons, [](const Utils::Icon &icon){return icon.icon();});
return Utils::Icon::combinedIcon(icons);
}
QSsh::SshConnectionParameters IDevice::sshParameters() const QSsh::SshConnectionParameters IDevice::sshParameters() const
{ {
return d->sshParameters; return d->sshParameters;

View File

@@ -43,6 +43,7 @@ namespace QSsh { class SshConnectionParameters; }
namespace Utils { namespace Utils {
class Environment; class Environment;
class Icon;
class PortList; class PortList;
class Port; class Port;
} // Utils } // Utils
@@ -166,6 +167,9 @@ public:
void setDeviceState(const DeviceState state); void setDeviceState(const DeviceState state);
QString deviceStateToString() const; QString deviceStateToString() const;
void setDeviceIcon(const QList<Utils::Icon> &deviceIcon);
QIcon deviceIcon() const;
virtual void fromMap(const QVariantMap &map); virtual void fromMap(const QVariantMap &map);
virtual QVariantMap toMap() const; virtual QVariantMap toMap() const;
virtual Ptr clone() const = 0; virtual Ptr clone() const = 0;

View File

@@ -25,6 +25,7 @@
#include "kit.h" #include "kit.h"
#include "kitinformation.h"
#include "kitmanager.h" #include "kitmanager.h"
#include "ioutputparser.h" #include "ioutputparser.h"
#include "osparser.h" #include "osparser.h"
@@ -78,7 +79,6 @@ public:
m_id = Id::fromString(QUuid::createUuid().toString()); m_id = Id::fromString(QUuid::createUuid().toString());
m_unexpandedDisplayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed"); m_unexpandedDisplayName = QCoreApplication::translate("ProjectExplorer::Kit", "Unnamed");
m_iconPath = FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON);
m_macroExpander.setDisplayName(tr("Kit")); m_macroExpander.setDisplayName(tr("Kit"));
m_macroExpander.setAccumulating(true); m_macroExpander.setAccumulating(true);
@@ -116,7 +116,7 @@ public:
bool m_hasWarning = false; bool m_hasWarning = false;
bool m_hasValidityInfo = false; bool m_hasValidityInfo = false;
bool m_mustNotify = false; bool m_mustNotify = false;
QIcon m_icon; QIcon m_cachedIcon;
FileName m_iconPath; FileName m_iconPath;
QHash<Id, QVariant> m_data; QHash<Id, QVariant> m_data;
@@ -136,8 +136,6 @@ Kit::Kit(Id id) :
{ {
foreach (KitInformation *sti, KitManager::kitInformation()) foreach (KitInformation *sti, KitManager::kitInformation())
d->m_data.insert(sti->id(), sti->defaultValue(this)); d->m_data.insert(sti->id(), sti->defaultValue(this));
d->m_icon = icon(d->m_iconPath);
} }
Kit::Kit(const QVariantMap &data) : 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_fileSystemFriendlyName = data.value(QLatin1String(FILESYSTEMFRIENDLYNAME_KEY)).toString();
d->m_iconPath = FileName::fromString(data.value(QLatin1String(ICON_KEY), d->m_iconPath = FileName::fromString(data.value(QLatin1String(ICON_KEY),
d->m_iconPath.toString()).toString()); d->m_iconPath.toString()).toString());
d->m_icon = icon(d->m_iconPath);
QVariantMap extra = data.value(QLatin1String(DATA_KEY)).toMap(); QVariantMap extra = data.value(QLatin1String(DATA_KEY)).toMap();
d->m_data.clear(); // remove default values d->m_data.clear(); // remove default values
@@ -213,7 +210,7 @@ Kit *Kit::clone(bool keepName) const
k->d->m_data = d->m_data; k->d->m_data = d->m_data;
// Do not clone m_fileSystemFriendlyName, needs to be unique // Do not clone m_fileSystemFriendlyName, needs to be unique
k->d->m_isValid = d->m_isValid; 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_iconPath = d->m_iconPath;
k->d->m_sticky = d->m_sticky; k->d->m_sticky = d->m_sticky;
k->d->m_mutable = d->m_mutable; k->d->m_mutable = d->m_mutable;
@@ -225,7 +222,7 @@ void Kit::copyFrom(const Kit *k)
KitGuard g(this); KitGuard g(this);
d->m_data = k->d->m_data; d->m_data = k->d->m_data;
d->m_iconPath = k->d->m_iconPath; 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_autodetected = k->d->m_autodetected;
d->m_autoDetectionSource = k->d->m_autoDetectionSource; d->m_autoDetectionSource = k->d->m_autoDetectionSource;
d->m_unexpandedDisplayName = k->d->m_unexpandedDisplayName; d->m_unexpandedDisplayName = k->d->m_unexpandedDisplayName;
@@ -361,24 +358,28 @@ Id Kit::id() const
QIcon Kit::icon() 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 (d->m_iconPath.exists()) {
{ d->m_cachedIcon = QIcon(d->m_iconPath.toString());
if (path.isEmpty()) return d->m_cachedIcon;
return QIcon(); }
if (path == FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON)) const IDevice::ConstPtr kitDevice = DeviceKitInformation::device(this);
return creatorTheme()->flag(Theme::FlatSideBarIcons) if (!kitDevice.isNull()) {
? Icon::combinedIcon({Icons::DESKTOP_DEVICE.icon(), const QIcon deviceIcon = kitDevice->deviceIcon();
Icons::DESKTOP_DEVICE_SMALL.icon()}) if (!deviceIcon.isNull()) {
: QApplication::style()->standardIcon(QStyle::SP_ComputerIcon); d->m_cachedIcon = deviceIcon;
return d->m_cachedIcon;
}
}
QFileInfo fi = path.toFileInfo(); d->m_cachedIcon = creatorTheme()->flag(Theme::FlatSideBarIcons)
if (fi.isFile() && fi.isReadable()) ? Icon::combinedIcon({Icons::DESKTOP_DEVICE.icon(),
return QIcon(path.toString()); Icons::DESKTOP_DEVICE_SMALL.icon()})
return QIcon(); : QApplication::style()->standardIcon(QStyle::SP_ComputerIcon);
return d->m_cachedIcon;
} }
FileName Kit::iconPath() const FileName Kit::iconPath() const
@@ -391,7 +392,6 @@ void Kit::setIconPath(const FileName &path)
if (d->m_iconPath == path) if (d->m_iconPath == path)
return; return;
d->m_iconPath = path; d->m_iconPath = path;
d->m_icon = icon(path);
kitUpdated(); kitUpdated();
} }
@@ -661,6 +661,7 @@ void Kit::kitUpdated()
return; return;
} }
d->m_hasValidityInfo = false; d->m_hasValidityInfo = false;
d->m_cachedIcon = QIcon();
KitManager::notifyAboutUpdate(this); KitManager::notifyAboutUpdate(this);
d->m_mustNotify = false; d->m_mustNotify = false;
} }

View File

@@ -84,7 +84,6 @@ public:
Core::Id id() const; Core::Id id() const;
QIcon icon() const; QIcon icon() const;
static QIcon icon(const Utils::FileName &path);
Utils::FileName iconPath() const; Utils::FileName iconPath() const;
void setIconPath(const Utils::FileName &path); void setIconPath(const Utils::FileName &path);

View File

@@ -205,7 +205,6 @@ void KitManager::restoreKits()
defaultKit->setUnexpandedDisplayName(tr("Desktop")); defaultKit->setUnexpandedDisplayName(tr("Desktop"));
defaultKit->setSdkProvided(false); defaultKit->setSdkProvided(false);
defaultKit->setAutoDetected(false); defaultKit->setAutoDetected(false);
defaultKit->setIconPath(FileName::fromLatin1(ProjectExplorer::Constants::DESKTOP_DEVICE_ICON));
defaultKit->setup(); defaultKit->setup();

View File

@@ -95,11 +95,19 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) :
label = createLabel(tr("Name:"), toolTip); label = createLabel(tr("Name:"), toolTip);
m_layout->addWidget(label, 0, LabelColumn, alignment); m_layout->addWidget(label, 0, LabelColumn, alignment);
m_iconButton->setToolTip(toolTip); 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(); discard();
connect(m_iconButton, &QAbstractButton::clicked, connect(m_iconButton, &QAbstractButton::clicked,
this, &KitManagerConfigWidget::setIcon); this, &KitManagerConfigWidget::setIcon);
connect(setIconAction, &QAction::triggered,
this, &KitManagerConfigWidget::setIcon);
connect(resetIconAction, &QAction::triggered,
this, &KitManagerConfigWidget::resetIcon);
connect(m_nameEdit, &QLineEdit::textChanged, connect(m_nameEdit, &QLineEdit::textChanged,
this, &KitManagerConfigWidget::setDisplayName); this, &KitManagerConfigWidget::setDisplayName);
@@ -289,19 +297,25 @@ void KitManagerConfigWidget::removeKit()
void KitManagerConfigWidget::setIcon() void KitManagerConfigWidget::setIcon()
{ {
const Utils::FileName path = Utils::FileName::fromString( const QString path = QFileDialog::getOpenFileName(this, tr("Select Icon"),
QFileDialog::getOpenFileName(this, tr("Select Icon"), m_modifiedKit->iconPath().toString(),
m_modifiedKit->iconPath().toString(), tr("Images (*.png *.xpm *.jpg)"));
tr("Images (*.png *.xpm *.jpg)")));
if (path.isEmpty()) if (path.isEmpty())
return; return;
const QIcon icon = Kit::icon(path); const QIcon icon(path);
if (icon.isNull()) if (icon.isNull())
return; return;
m_iconButton->setIcon(icon); 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(); emit dirty();
} }

View File

@@ -75,6 +75,7 @@ signals:
private: private:
void setIcon(); void setIcon();
void resetIcon();
void setDisplayName(); void setDisplayName();
void setFileSystemFriendlyName(); void setFileSystemFriendlyName();
void workingCopyWasUpdated(ProjectExplorer::Kit *k); void workingCopyWasUpdated(ProjectExplorer::Kit *k);

View File

@@ -226,7 +226,6 @@ const char DEFAULT_WORKING_DIR_ALTERNATE[] = "%{sourceDir}";
// Desktop Device related ids: // Desktop Device related ids:
const char DESKTOP_DEVICE_ID[] = "Desktop Device"; const char DESKTOP_DEVICE_ID[] = "Desktop Device";
const char DESKTOP_DEVICE_TYPE[] = "Desktop"; const char DESKTOP_DEVICE_TYPE[] = "Desktop";
const char DESKTOP_DEVICE_ICON[] = ":///DESKTOP///";
const int DESKTOP_PORT_START = 30000; const int DESKTOP_PORT_START = 30000;
const int DESKTOP_PORT_END = 31000; const int DESKTOP_PORT_END = 31000;

View File

@@ -2087,12 +2087,14 @@ QVariantMap UserFileVersion11Upgrader::upgrade(const QVariantMap &map)
const QVariantMap &bc = buildIt.value(); const QVariantMap &bc = buildIt.value();
Kit *tmpKit = rawKit; Kit *tmpKit = rawKit;
const auto desktopDeviceIcon = FileName::fromLatin1(":///DESKTOP///");
if (oldTargetId == QLatin1String("Qt4ProjectManager.Target.AndroidDeviceTarget")) { if (oldTargetId == QLatin1String("Qt4ProjectManager.Target.AndroidDeviceTarget")) {
tmpKit->setIconPath(FileName::fromLatin1(":/android/images/QtAndroid.png")); tmpKit->setIconPath(FileName::fromLatin1(":/android/images/QtAndroid.png"));
tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop"));
tmpKit->setValue("PE.Profile.Device", QString()); tmpKit->setValue("PE.Profile.Device", QString());
} else if (oldTargetId == QLatin1String("RemoteLinux.EmbeddedLinuxTarget")) { } 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.DeviceType", QString::fromLatin1("GenericLinuxOsType"));
tmpKit->setValue("PE.Profile.Device", QString()); tmpKit->setValue("PE.Profile.Device", QString());
} else if (oldTargetId == QLatin1String("Qt4ProjectManager.Target.HarmattanDeviceTarget")) { } 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.DeviceType", QString::fromLatin1("Desktop"));
tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device"));
} else { } else {
tmpKit->setIconPath(FileName::fromLatin1(Constants::DESKTOP_DEVICE_ICON)); tmpKit->setIconPath(desktopDeviceIcon);
tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop")); tmpKit->setValue("PE.Profile.DeviceType", QString::fromLatin1("Desktop"));
tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device")); tmpKit->setValue("PE.Profile.Device", QString::fromLatin1("Desktop Device"));
} }