forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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();
|
||||
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
@@ -75,6 +75,7 @@ signals:
|
||||
|
||||
private:
|
||||
void setIcon();
|
||||
void resetIcon();
|
||||
void setDisplayName();
|
||||
void setFileSystemFriendlyName();
|
||||
void workingCopyWasUpdated(ProjectExplorer::Kit *k);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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"));
|
||||
}
|
||||
|
Reference in New Issue
Block a user