aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <[email protected]>2024-11-12 14:55:24 +0100
committerChristian Kandeler <[email protected]>2024-11-18 12:24:13 +0000
commitba8cef149f7730d8a6299557dd5e761c9700a65f (patch)
tree3eecb8359fde2a65343600b7bbcbf9cc0d2774c6
parent22756645d389f83a14fd46ddc50dba1536dcbc41 (diff)
ProjectExplorer: Add BuildDeviceTypeKitAspect
For symmetry between build and run devices. Change-Id: I2cb7bdbe0264e42b3e4e7c2fad88cdc34ba43fde Reviewed-by: hjk <[email protected]>
-rw-r--r--src/plugins/docker/dockerdevice.cpp5
-rw-r--r--src/plugins/docker/dockerdevice.h1
-rw-r--r--src/plugins/projectexplorer/devicesupport/desktopdevice.cpp5
-rw-r--r--src/plugins/projectexplorer/devicesupport/desktopdevice.h1
-rw-r--r--src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp276
-rw-r--r--src/plugins/projectexplorer/devicesupport/devicekitaspects.h8
-rw-r--r--src/plugins/projectexplorer/devicesupport/idevice.h2
-rw-r--r--src/plugins/remotelinux/linuxdevice.cpp5
-rw-r--r--src/plugins/remotelinux/linuxdevice.h1
9 files changed, 152 insertions, 152 deletions
diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp
index 4882325cb1b..ffe0cb84e33 100644
--- a/src/plugins/docker/dockerdevice.cpp
+++ b/src/plugins/docker/dockerdevice.cpp
@@ -1071,11 +1071,6 @@ DeviceTester *DockerDevice::createDeviceTester()
return nullptr;
}
-bool DockerDevice::usableAsBuildDevice() const
-{
- return true;
-}
-
FilePath DockerDevice::filePath(const QString &pathOnDevice) const
{
return FilePath::fromParts(Constants::DOCKER_DEVICE_SCHEME,
diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h
index 0754819af43..b738ac41b05 100644
--- a/src/plugins/docker/dockerdevice.h
+++ b/src/plugins/docker/dockerdevice.h
@@ -35,7 +35,6 @@ public:
bool canCreateProcessModel() const override { return true; }
bool hasDeviceTester() const override { return false; }
ProjectExplorer::DeviceTester *createDeviceTester() override;
- bool usableAsBuildDevice() const override;
Utils::FilePath rootPath() const override;
Utils::FilePath filePath(const QString &pathOnDevice) const override;
diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp
index 548e20625e6..b055cb399a4 100644
--- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp
+++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp
@@ -103,11 +103,6 @@ QUrl DesktopDevice::toolControlChannel(const ControlChannelHint &) const
return url;
}
-bool DesktopDevice::usableAsBuildDevice() const
-{
- return true;
-}
-
bool DesktopDevice::handlesFile(const FilePath &filePath) const
{
return !filePath.needsDevice();
diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.h b/src/plugins/projectexplorer/devicesupport/desktopdevice.h
index 437a4f8c074..4d03ed472e3 100644
--- a/src/plugins/projectexplorer/devicesupport/desktopdevice.h
+++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.h
@@ -28,7 +28,6 @@ public:
bool canCreateProcessModel() const override;
DeviceProcessSignalOperation::Ptr signalOperation() const override;
QUrl toolControlChannel(const ControlChannelHint &) const override;
- bool usableAsBuildDevice() const override;
bool handlesFile(const Utils::FilePath &filePath) const override;
Utils::expected_str<Utils::Environment> systemEnvironmentWithError() const override;
diff --git a/src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp b/src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp
index 1cfc074cfb5..e3c6d03d910 100644
--- a/src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp
+++ b/src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp
@@ -29,15 +29,12 @@
using namespace Utils;
namespace ProjectExplorer {
-
-// --------------------------------------------------------------------------
-// RunDeviceTypeKitAspect:
-// --------------------------------------------------------------------------
namespace Internal {
-class RunDeviceTypeKitAspectImpl final : public KitAspect
+
+template <typename Aspect> class DeviceTypeKitAspectImpl final : public KitAspect
{
public:
- RunDeviceTypeKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory)
+ DeviceTypeKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory)
: KitAspect(workingCopy, factory)
{
using ItemData = std::tuple<QString, Id, QIcon>;
@@ -53,9 +50,9 @@ public:
return std::get<2>(d);
return {};
});
- auto getter = [](const Kit &k) { return RunDeviceTypeKitAspect::deviceTypeId(&k).toSetting(); };
+ auto getter = [](const Kit &k) { return Aspect::deviceTypeId(&k).toSetting(); };
auto setter = [](Kit &k, const QVariant &type) {
- RunDeviceTypeKitAspect::setDeviceTypeId(&k, Id::fromSetting(type));
+ Aspect::setDeviceTypeId(&k, Id::fromSetting(type));
};
auto resetModel = [model] {
model->clear();
@@ -69,122 +66,34 @@ public:
}
};
-class RunDeviceTypeKitAspectFactory : public KitAspectFactory
-{
-public:
- RunDeviceTypeKitAspectFactory();
-
- void setup(Kit *k) override;
- Tasks validate(const Kit *k) const override;
- KitAspect *createKitAspect(Kit *k) const override;
- ItemList toUserOutput(const Kit *k) const override;
-
- QSet<Id> supportedPlatforms(const Kit *k) const override;
- QSet<Id> availableFeatures(const Kit *k) const override;
-};
-
-RunDeviceTypeKitAspectFactory::RunDeviceTypeKitAspectFactory()
-{
- setId(RunDeviceTypeKitAspect::id());
- setDisplayName(Tr::tr("Run device type"));
- setDescription(Tr::tr("The type of device to run applications on."));
- setPriority(33000);
- makeEssential();
-}
-
-void RunDeviceTypeKitAspectFactory::setup(Kit *k)
-{
- if (k && !k->hasValue(id()))
- k->setValue(id(), QByteArray(Constants::DESKTOP_DEVICE_TYPE));
-}
-
-Tasks RunDeviceTypeKitAspectFactory::validate(const Kit *k) const
-{
- Q_UNUSED(k)
- return {};
-}
-
-KitAspect *RunDeviceTypeKitAspectFactory::createKitAspect(Kit *k) const
-{
- QTC_ASSERT(k, return nullptr);
- return new Internal::RunDeviceTypeKitAspectImpl(k, this);
-}
-
-KitAspectFactory::ItemList RunDeviceTypeKitAspectFactory::toUserOutput(const Kit *k) const
-{
- QTC_ASSERT(k, return {});
- Id type = RunDeviceTypeKitAspect::deviceTypeId(k);
- QString typeDisplayName = Tr::tr("Unknown device type");
- if (type.isValid()) {
- if (IDeviceFactory *factory = IDeviceFactory::find(type))
- typeDisplayName = factory->displayName();
- }
- return {{Tr::tr("Device type"), typeDisplayName}};
-}
-
-QSet<Id> RunDeviceTypeKitAspectFactory::supportedPlatforms(const Kit *k) const
-{
- return {RunDeviceTypeKitAspect::deviceTypeId(k)};
-}
-
-QSet<Id> RunDeviceTypeKitAspectFactory::availableFeatures(const Kit *k) const
-{
- Id id = RunDeviceTypeKitAspect::deviceTypeId(k);
- if (id.isValid())
- return {id.withPrefix("DeviceType.")};
- return {};
-}
-
-const RunDeviceTypeKitAspectFactory theDeviceTypeKitAspectFactory;
-} // namespace Internal
-
-const Id RunDeviceTypeKitAspect::id()
-{
- return "PE.Profile.DeviceType";
-}
-
-const Id RunDeviceTypeKitAspect::deviceTypeId(const Kit *k)
-{
- return k ? Id::fromSetting(k->value(RunDeviceTypeKitAspect::id())) : Id();
-}
-
-void RunDeviceTypeKitAspect::setDeviceTypeId(Kit *k, Id type)
-{
- QTC_ASSERT(k, return);
- k->setValue(RunDeviceTypeKitAspect::id(), type.toSetting());
-}
-
-// --------------------------------------------------------------------------
-// RunDeviceKitAspect:
-// --------------------------------------------------------------------------
-namespace Internal {
-class RunDeviceKitAspectImpl final : public KitAspect
+template <typename TypeAspect, typename DeviceAspect>
+class DeviceKitAspectImpl final : public KitAspect
{
public:
- RunDeviceKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory)
+ DeviceKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory)
: KitAspect(workingCopy, factory)
{
setManagingPage(Constants::DEVICE_SETTINGS_PAGE_ID);
const auto model = new DeviceManagerModel(DeviceManager::instance(), this);
auto getter = [](const Kit &k) {
- auto device = RunDeviceKitAspect::device(&k);
+ auto device = DeviceAspect::device(&k);
return device ? device->id().toSetting() : QVariant{};
};
auto setter = [](Kit &k, const QVariant &id) {
- RunDeviceKitAspect::setDeviceId(&k, Id::fromSetting(id));
+ DeviceAspect::setDeviceId(&k, Id::fromSetting(id));
};
auto resetModel = [this, model] {
- model->setTypeFilter(RunDeviceTypeKitAspect::deviceTypeId(kit()));
+ model->setTypeFilter(TypeAspect::deviceTypeId(kit()));
};
addListAspectSpec({model, std::move(getter), std::move(setter), std::move(resetModel)});
connect(DeviceManager::instance(), &DeviceManager::updated,
- this, &RunDeviceKitAspectImpl::refresh);
+ this, &DeviceKitAspectImpl::refresh);
}
private:
- Id settingsPageItemToPreselect() const override { return RunDeviceKitAspect::deviceId(kit()); }
+ Id settingsPageItemToPreselect() const override { return DeviceAspect::deviceId(kit()); }
void addToInnerLayout(Layouting::Layout &parentItem) override
{
@@ -204,6 +113,94 @@ private:
}
};
+template <typename DeviceTypeKitAspect>
+class DeviceTypeKitAspectFactory : public KitAspectFactory
+{
+public:
+ DeviceTypeKitAspectFactory()
+ {
+ setId(DeviceTypeKitAspect::id());
+ makeEssential();
+ }
+
+ void setup(Kit *k) override
+ {
+ if (k && !k->hasValue(id()))
+ k->setValue(id(), QByteArray(Constants::DESKTOP_DEVICE_TYPE));
+ }
+
+ KitAspect *createKitAspect(Kit *k) const override
+ {
+ QTC_ASSERT(k, return nullptr);
+ return new DeviceTypeKitAspectImpl<DeviceTypeKitAspect>(k, this);
+ }
+
+ ItemList toUserOutput(const Kit *k) const override
+ {
+ QTC_ASSERT(k, return {});
+ const Id type = DeviceTypeKitAspect::deviceTypeId(k);
+ QString typeDisplayName = Tr::tr("Unknown device type");
+ if (type.isValid()) {
+ if (IDeviceFactory *factory = IDeviceFactory::find(type))
+ typeDisplayName = factory->displayName();
+ }
+ return {{Tr::tr("Device type"), typeDisplayName}};
+ }
+
+ QSet<Id> availableFeatures(const Kit *k) const override
+ {
+ if (const Id id = DeviceTypeKitAspect::deviceTypeId(k); id.isValid())
+ return {id.withPrefix("DeviceType.")};
+ return {};
+ }
+
+ QSet<Id> supportedPlatforms(const Kit *k) const override
+ {
+ return {DeviceTypeKitAspect::deviceTypeId(k)};
+ }
+
+ Tasks validate(const Kit *) const override { return {}; }
+};
+
+// --------------------------------------------------------------------------
+// RunDeviceTypeKitAspect:
+// --------------------------------------------------------------------------
+class RunDeviceTypeKitAspectFactory : public DeviceTypeKitAspectFactory<RunDeviceTypeKitAspect>
+{
+public:
+ RunDeviceTypeKitAspectFactory()
+ {
+ setPriority(33000);
+ setDisplayName(Tr::tr("Run device type"));
+ setDescription(Tr::tr("The type of device to run applications on."));
+ }
+};
+
+const RunDeviceTypeKitAspectFactory theRunDeviceTypeKitAspectFactory;
+
+} // namespace Internal
+
+const Id RunDeviceTypeKitAspect::id()
+{
+ return "PE.Profile.DeviceType";
+}
+
+const Id RunDeviceTypeKitAspect::deviceTypeId(const Kit *k)
+{
+ return k ? Id::fromSetting(k->value(RunDeviceTypeKitAspect::id())) : Id();
+}
+
+void RunDeviceTypeKitAspect::setDeviceTypeId(Kit *k, Id type)
+{
+ QTC_ASSERT(k, return);
+ k->setValue(RunDeviceTypeKitAspect::id(), type.toSetting());
+}
+
+// --------------------------------------------------------------------------
+// RunDeviceKitAspect:
+// --------------------------------------------------------------------------
+namespace Internal {
+
class RunDeviceKitAspectFactory : public KitAspectFactory
{
public:
@@ -294,7 +291,7 @@ void RunDeviceKitAspectFactory::setup(Kit *k)
KitAspect *RunDeviceKitAspectFactory::createKitAspect(Kit *k) const
{
QTC_ASSERT(k, return nullptr);
- return new Internal::RunDeviceKitAspectImpl(k, this);
+ return new Internal::DeviceKitAspectImpl<RunDeviceTypeKitAspect, RunDeviceKitAspect>(k, this);
}
QString RunDeviceKitAspectFactory::displayNamePostfix(const Kit *k) const
@@ -414,41 +411,55 @@ FilePath RunDeviceKitAspect::deviceFilePath(const Kit *k, const QString &pathOnD
}
// --------------------------------------------------------------------------
-// BuildDeviceKitAspect:
+// BuildDeviceTypeKitAspect:
// --------------------------------------------------------------------------
namespace Internal {
-class BuildDeviceKitAspectImpl final : public KitAspect
+
+class BuildDeviceTypeKitAspectFactory : public DeviceTypeKitAspectFactory<BuildDeviceTypeKitAspect>
{
public:
- BuildDeviceKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory)
- : KitAspect(workingCopy, factory)
+ BuildDeviceTypeKitAspectFactory()
{
- setManagingPage(Constants::DEVICE_SETTINGS_PAGE_ID);
-
- const auto model = new DeviceManagerModel(DeviceManager::instance(), this);
- auto getter = [](const Kit &k) {
- return BuildDeviceKitAspect::device(&k)->id().toSetting();
- };
- auto setter = [](Kit &k, const QVariant &id) {
- BuildDeviceKitAspect::setDeviceId(&k, Id::fromSetting(id));
- };
- auto resetModel = [model] {
- QList<Id> blackList;
- const DeviceManager *dm = DeviceManager::instance();
- for (int i = 0; i < dm->deviceCount(); ++i) {
- IDevice::ConstPtr device = dm->deviceAt(i);
- if (!device->usableAsBuildDevice())
- blackList.append(device->id());
- }
- model->setFilter(blackList);
- };
- addListAspectSpec({model, std::move(getter), std::move(setter), std::move(resetModel)});
+ setDisplayName(Tr::tr("Build device type"));
+ setDescription(Tr::tr("The type of device to build on."));
+ setPriority(31899);
+ }
- connect(DeviceManager::instance(), &DeviceManager::updated,
- this, &BuildDeviceKitAspectImpl::refresh);
+private:
+ // QtC < 16 did not have a build device type, but the user might have set the build device.
+ void upgrade(Kit *k)
+ {
+ if (!BuildDeviceTypeKitAspect::deviceTypeId(k).isValid()) {
+ if (const IDevice::ConstPtr dev = BuildDeviceKitAspect::device(k))
+ BuildDeviceTypeKitAspect::setDeviceTypeId(k, dev->type());
+ }
}
};
+const BuildDeviceTypeKitAspectFactory theBuildDeviceTypeKitAspectFactory;
+
+} // namespace Internal
+
+Id BuildDeviceTypeKitAspect::id()
+{
+ return "PE.Profile.BuildDeviceType";
+}
+
+Id BuildDeviceTypeKitAspect::deviceTypeId(const Kit *k)
+{
+ return k ? Id::fromSetting(k->value(BuildDeviceTypeKitAspect::id())) : Id();
+}
+
+void BuildDeviceTypeKitAspect::setDeviceTypeId(Kit *k, Utils::Id type)
+{
+ QTC_ASSERT(k, return);
+ k->setValue(BuildDeviceTypeKitAspect::id(), type.toSetting());
+}
+
+// --------------------------------------------------------------------------
+// BuildDeviceKitAspect:
+// --------------------------------------------------------------------------
+namespace Internal {
class BuildDeviceKitAspectFactory : public KitAspectFactory
{
public:
@@ -479,6 +490,7 @@ BuildDeviceKitAspectFactory::BuildDeviceKitAspectFactory()
setDisplayName(Tr::tr("Build device"));
setDescription(Tr::tr("The device used to build applications on."));
setPriority(31900);
+ setEmbeddableAspects({BuildDeviceTypeKitAspect::id()});
}
static IDeviceConstPtr defaultDevice()
@@ -510,7 +522,7 @@ Tasks BuildDeviceKitAspectFactory::validate(const Kit *k) const
KitAspect *BuildDeviceKitAspectFactory::createKitAspect(Kit *k) const
{
QTC_ASSERT(k, return nullptr);
- return new Internal::BuildDeviceKitAspectImpl(k, this);
+ return new Internal::DeviceKitAspectImpl<BuildDeviceTypeKitAspect, BuildDeviceKitAspect>(k, this);
}
QString BuildDeviceKitAspectFactory::displayNamePostfix(const Kit *k) const
diff --git a/src/plugins/projectexplorer/devicesupport/devicekitaspects.h b/src/plugins/projectexplorer/devicesupport/devicekitaspects.h
index 1f57aaeac92..e99bb14010a 100644
--- a/src/plugins/projectexplorer/devicesupport/devicekitaspects.h
+++ b/src/plugins/projectexplorer/devicesupport/devicekitaspects.h
@@ -32,6 +32,14 @@ public:
static Utils::FilePath deviceFilePath(const Kit *k, const QString &pathOnDevice);
};
+class PROJECTEXPLORER_EXPORT BuildDeviceTypeKitAspect
+{
+public:
+ static Utils::Id id();
+ static Utils::Id deviceTypeId(const Kit *k);
+ static void setDeviceTypeId(Kit *k, Utils::Id type);
+};
+
class PROJECTEXPLORER_EXPORT BuildDeviceKitAspect
{
public:
diff --git a/src/plugins/projectexplorer/devicesupport/idevice.h b/src/plugins/projectexplorer/devicesupport/idevice.h
index 048a87fbf70..fb1fd2b1196 100644
--- a/src/plugins/projectexplorer/devicesupport/idevice.h
+++ b/src/plugins/projectexplorer/devicesupport/idevice.h
@@ -128,8 +128,6 @@ public:
virtual bool isCompatibleWith(const Kit *k) const;
virtual QList<Task> validate() const;
- virtual bool usableAsBuildDevice() const { return false; }
-
QString displayType() const;
Utils::OsType osType() const;
diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp
index bf5f86c2f96..82821747682 100644
--- a/src/plugins/remotelinux/linuxdevice.cpp
+++ b/src/plugins/remotelinux/linuxdevice.cpp
@@ -1099,11 +1099,6 @@ DeviceProcessSignalOperation::Ptr LinuxDevice::signalOperation() const
return DeviceProcessSignalOperation::Ptr(new RemoteLinuxSignalOperation(shared_from_this()));
}
-bool LinuxDevice::usableAsBuildDevice() const
-{
- return true;
-}
-
QString LinuxDevice::userAtHost() const
{
return sshParameters().userAtHost();
diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h
index dd84a77ff95..d2a67c03c64 100644
--- a/src/plugins/remotelinux/linuxdevice.h
+++ b/src/plugins/remotelinux/linuxdevice.h
@@ -26,7 +26,6 @@ public:
bool hasDeviceTester() const override { return true; }
ProjectExplorer::DeviceTester *createDeviceTester() override;
ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const override;
- bool usableAsBuildDevice() const override;
QString userAtHost() const;
QString userAtHostAndPort() const;