diff options
author | Christian Kandeler <[email protected]> | 2024-11-12 14:55:24 +0100 |
---|---|---|
committer | Christian Kandeler <[email protected]> | 2024-11-18 12:24:13 +0000 |
commit | ba8cef149f7730d8a6299557dd5e761c9700a65f (patch) | |
tree | 3eecb8359fde2a65343600b7bbcbf9cc0d2774c6 | |
parent | 22756645d389f83a14fd46ddc50dba1536dcbc41 (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.cpp | 5 | ||||
-rw-r--r-- | src/plugins/docker/dockerdevice.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/desktopdevice.cpp | 5 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/desktopdevice.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/devicekitaspects.cpp | 276 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/devicekitaspects.h | 8 | ||||
-rw-r--r-- | src/plugins/projectexplorer/devicesupport/idevice.h | 2 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.cpp | 5 | ||||
-rw-r--r-- | src/plugins/remotelinux/linuxdevice.h | 1 |
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; |