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) {
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);

View File

@@ -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)

View File

@@ -31,6 +31,7 @@
#include <projectexplorer/devicesupport/devicemanager.h>
#include <projectexplorer/kitinformation.h>
#include <coreplugin/helpmanager.h>
#include <utils/icon.h>
#include <utils/portlist.h>
#include <QCoreApplication>
@@ -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)

View File

@@ -34,6 +34,8 @@
#include "../runnables.h"
#include <ssh/sshconnection.h>
#include <utils/algorithm.h>
#include <utils/icon.h>
#include <utils/portlist.h>
#include <utils/qtcassert.h>
@@ -154,6 +156,8 @@ public:
QSsh::SshConnectionParameters sshParameters;
Utils::PortList freePorts;
QString debugServerPath;
QList<Utils::Icon> deviceIcons;
};
} // 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
{
return d->sshParameters;

View File

@@ -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<Utils::Icon> &deviceIcon);
QIcon deviceIcon() const;
virtual void fromMap(const QVariantMap &map);
virtual QVariantMap toMap() const;
virtual Ptr clone() const = 0;

View File

@@ -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<Id, QVariant> 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)
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;
}
}
d->m_cachedIcon = creatorTheme()->flag(Theme::FlatSideBarIcons)
? Icon::combinedIcon({Icons::DESKTOP_DEVICE.icon(),
Icons::DESKTOP_DEVICE_SMALL.icon()})
: QApplication::style()->standardIcon(QStyle::SP_ComputerIcon);
QFileInfo fi = path.toFileInfo();
if (fi.isFile() && fi.isReadable())
return QIcon(path.toString());
return QIcon();
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;
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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"),
const QString path = QFileDialog::getOpenFileName(this, tr("Select Icon"),
m_modifiedKit->iconPath().toString(),
tr("Images (*.png *.xpm *.jpg)")));
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();
}

View File

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

View File

@@ -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;

View File

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