diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 8f923146f5b..7a59abea961 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -663,34 +663,33 @@ AndroidDeviceManager::AndroidDeviceManager(QObject *parent) } // Factory + AndroidDeviceFactory::AndroidDeviceFactory() - : ProjectExplorer::IDeviceFactory(Constants::ANDROID_DEVICE_TYPE), + : IDeviceFactory(Constants::ANDROID_DEVICE_TYPE), m_androidConfig(AndroidConfigurations::currentConfig()) { setDisplayName(AndroidDevice::tr("Android Device")); setCombinedIcon(":/android/images/androiddevicesmall.png", ":/android/images/androiddevice.png"); + setConstructionFunction(&AndroidDevice::create); setCanCreate(m_androidConfig.sdkToolsOk()); -} + setCreator([this] { + AvdDialog dialog = AvdDialog(m_androidConfig, Core::ICore::dialogParent()); + if (dialog.exec() != QDialog::Accepted) + return IDevice::Ptr(); -IDevice::Ptr AndroidDeviceFactory::create() const -{ - AvdDialog dialog = AvdDialog(m_androidConfig, Core::ICore::dialogParent()); - if (dialog.exec() != QDialog::Accepted) - return ProjectExplorer::IDevice::Ptr(); + const IDevice::Ptr dev = dialog.device(); + if (const auto androidDev = static_cast(dev.data())) { + qCDebug(androidDeviceLog, "Created new Android AVD id \"%s\".", + qPrintable(androidDev->avdName())); + } else { + AndroidDeviceWidget::criticalDialog( + AndroidDevice::tr("The device info returned from AvdDialog is invalid.")); + } - const ProjectExplorer::IDevice::Ptr dev = dialog.device(); - const AndroidDevice *androidDev = static_cast(dev.data()); - if (androidDev) { - qCDebug(androidDeviceLog, "Created new Android AVD id \"%s\".", - qPrintable(androidDev->avdName())); - } else { - AndroidDeviceWidget::criticalDialog( - QObject::tr("The device info returned from AvdDialog is invalid.")); - } - - return IDevice::Ptr(dev); + return IDevice::Ptr(dev); + }); } } // namespace Internal diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index e98d4c003bb..3d08f09315c 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -88,7 +88,6 @@ class AndroidDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: AndroidDeviceFactory(); - ProjectExplorer::IDevice::Ptr create() const override; private: const AndroidConfig &m_androidConfig; diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index cf06c500ab0..c5679898c84 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -125,16 +125,14 @@ BareMetalDeviceFactory::BareMetalDeviceFactory() setDisplayName(BareMetalDevice::tr("Bare Metal Device")); setCombinedIcon(":/baremetal/images/baremetaldevicesmall.png", ":/baremetal/images/baremetaldevice.png"); - setCanCreate(true); setConstructionFunction(&BareMetalDevice::create); -} - -IDevice::Ptr BareMetalDeviceFactory::create() const -{ - BareMetalDeviceConfigurationWizard wizard; - if (wizard.exec() != QDialog::Accepted) - return {}; - return wizard.device(); + setCanCreate(true); + setCreator([] { + BareMetalDeviceConfigurationWizard wizard; + if (wizard.exec() != QDialog::Accepted) + return IDevice::Ptr(); + return wizard.device(); + }); } } //namespace Internal diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index f10af5d4c5c..bfa3755885a 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -71,9 +71,7 @@ private: class BareMetalDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: - explicit BareMetalDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const final; + BareMetalDeviceFactory(); }; } //namespace Internal diff --git a/src/plugins/boot2qt/qdbdevice.cpp b/src/plugins/boot2qt/qdbdevice.cpp index 045ac410b65..e372c92b622 100644 --- a/src/plugins/boot2qt/qdbdevice.cpp +++ b/src/plugins/boot2qt/qdbdevice.cpp @@ -286,17 +286,14 @@ QdbLinuxDeviceFactory::QdbLinuxDeviceFactory() { setDisplayName(QdbDevice::tr("Boot2Qt Device")); setCombinedIcon(":/qdb/images/qdbdevicesmall.png", ":/qdb/images/qdbdevice.png"); - setCanCreate(true); setConstructionFunction(&QdbDevice::create); -} - -IDevice::Ptr QdbLinuxDeviceFactory::create() const -{ - QdbDeviceWizard wizard(Core::ICore::dialogParent()); - - if (wizard.exec() != QDialog::Accepted) - return IDevice::Ptr(); - return wizard.device(); + setCanCreate(true); + setCreator([] { + QdbDeviceWizard wizard(Core::ICore::dialogParent()); + if (wizard.exec() != QDialog::Accepted) + return IDevice::Ptr(); + return wizard.device(); + }); } } // namespace Internal diff --git a/src/plugins/boot2qt/qdbdevice.h b/src/plugins/boot2qt/qdbdevice.h index 30d66e4cec9..191a410633d 100644 --- a/src/plugins/boot2qt/qdbdevice.h +++ b/src/plugins/boot2qt/qdbdevice.h @@ -65,9 +65,6 @@ class QdbLinuxDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: QdbLinuxDeviceFactory(); - -private: - ProjectExplorer::IDevice::Ptr create() const final; }; } // namespace Internal diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 26cbaf73e30..6c03d718055 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -1803,15 +1803,6 @@ QString DockerDevicePrivate::outputForRunInShell(const CommandLine &cmd) const // Factory -DockerDeviceFactory::DockerDeviceFactory() - : IDeviceFactory(Constants::DOCKER_DEVICE_TYPE) -{ - setDisplayName(DockerDevice::tr("Docker Device")); - setIcon(QIcon()); - setCanCreate(true); - setConstructionFunction([] { return DockerDevice::create({}); }); -} - class DockerImageItem final : public TreeItem, public DockerDeviceData { public: @@ -1915,7 +1906,7 @@ public: m_process->start(); } - DockerDevice::Ptr device() const + IDevice::Ptr device() const { const QModelIndexList selectedRows = m_view->selectionModel()->selectedRows(); QTC_ASSERT(selectedRows.size() == 1, return {}); @@ -1940,14 +1931,6 @@ public: QString m_selectedId; }; -IDevice::Ptr DockerDeviceFactory::create() const -{ - DockerDeviceSetupWizard wizard; - if (wizard.exec() != QDialog::Accepted) - return IDevice::Ptr(); - return wizard.device(); -} - void DockerDeviceWidget::updateDaemonStateTexts() { Utils::optional daemonState = DockerPlugin::isDaemonRunning(); @@ -1963,5 +1946,22 @@ void DockerDeviceWidget::updateDaemonStateTexts() } } +// Factory + +DockerDeviceFactory::DockerDeviceFactory() + : IDeviceFactory(Constants::DOCKER_DEVICE_TYPE) +{ + setDisplayName(DockerDevice::tr("Docker Device")); + setIcon(QIcon()); + setCanCreate(true); + setCreator([] { + DockerDeviceSetupWizard wizard; + if (wizard.exec() != QDialog::Accepted) + return IDevice::Ptr(); + return wizard.device(); + }); + setConstructionFunction([] { return DockerDevice::create({}); }); +} + } // Internal } // Docker diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 1846c4f95f0..9ead0c5c102 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -157,8 +157,6 @@ class DockerDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: DockerDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; } // Internal diff --git a/src/plugins/mcusupport/mcusupportdevice.cpp b/src/plugins/mcusupport/mcusupportdevice.cpp index a6cb55e483c..7ff559ea70a 100644 --- a/src/plugins/mcusupport/mcusupportdevice.cpp +++ b/src/plugins/mcusupport/mcusupportdevice.cpp @@ -59,13 +59,9 @@ McuSupportDeviceFactory::McuSupportDeviceFactory() setDisplayName(McuSupportDevice::tr("MCU Device")); setCombinedIcon(":/mcusupport/images/mcusupportdevicesmall.png", ":/mcusupport/images/mcusupportdevice.png"); - setCanCreate(true); setConstructionFunction(&McuSupportDevice::create); -} - -ProjectExplorer::IDevice::Ptr McuSupportDeviceFactory::create() const -{ - return McuSupportDevice::create(); + setCanCreate(true); + setCreator(&McuSupportDevice::create); } } // namespace Internal diff --git a/src/plugins/mcusupport/mcusupportdevice.h b/src/plugins/mcusupport/mcusupportdevice.h index 8aff134753c..af8c79870f0 100644 --- a/src/plugins/mcusupport/mcusupportdevice.h +++ b/src/plugins/mcusupport/mcusupportdevice.h @@ -45,8 +45,6 @@ class McuSupportDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: McuSupportDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp index 675dcebd916..c286a97f9e3 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp @@ -81,6 +81,11 @@ bool IDeviceFactory::canCreate() const return m_canCreate; } +IDevice::Ptr IDeviceFactory::create() const +{ + return m_creator ? m_creator() : IDevice::Ptr(); +} + IDevice::Ptr IDeviceFactory::construct() const { return m_constructor ? m_constructor() : IDevice::Ptr(); @@ -119,6 +124,11 @@ void IDeviceFactory::setCanCreate(bool canCreate) m_canCreate = canCreate; } +void IDeviceFactory::setCreator(const std::function &creator) +{ + m_creator = creator; +} + void IDeviceFactory::setConstructionFunction(const std::function &constructor) { m_constructor = constructor; diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.h b/src/plugins/projectexplorer/devicesupport/idevicefactory.h index 05bc2bf4934..2d44ebf162f 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.h +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.h @@ -44,8 +44,7 @@ public: QIcon icon() const { return m_icon; } bool canCreate() const; IDevice::Ptr construct() const; - - virtual IDevice::Ptr create() const { return IDevice::Ptr(); } + IDevice::Ptr create() const; virtual bool canRestore(const QVariantMap &) const { return true; } @@ -61,8 +60,10 @@ protected: void setCombinedIcon(const Utils::FilePath &small, const Utils::FilePath &large); void setCanCreate(bool canCreate); void setConstructionFunction(const std::function &constructor); + void setCreator(const std::function &creator); private: + std::function m_creator; const Utils::Id m_deviceType; QString m_displayName; QIcon m_icon; diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index 24d9db7ad18..37d29516583 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -172,22 +172,19 @@ DeviceProcessSignalOperation::Ptr QnxDevice::signalOperation() const // Factory -QnxDeviceFactory::QnxDeviceFactory() - : ProjectExplorer::IDeviceFactory(Constants::QNX_QNX_OS_TYPE) +QnxDeviceFactory::QnxDeviceFactory() : IDeviceFactory(Constants::QNX_QNX_OS_TYPE) { setDisplayName(QnxDevice::tr("QNX Device")); setCombinedIcon(":/qnx/images/qnxdevicesmall.png", ":/qnx/images/qnxdevice.png"); - setCanCreate(true); setConstructionFunction(&QnxDevice::create); -} - -ProjectExplorer::IDevice::Ptr QnxDeviceFactory::create() const -{ - QnxDeviceWizard wizard; - if (wizard.exec() != QDialog::Accepted) - return ProjectExplorer::IDevice::Ptr(); - return wizard.device(); + setCanCreate(true); + setCreator([] { + QnxDeviceWizard wizard; + if (wizard.exec() != QDialog::Accepted) + return IDevice::Ptr(); + return wizard.device(); + }); } } // namespace Internal diff --git a/src/plugins/qnx/qnxdevice.h b/src/plugins/qnx/qnxdevice.h index 68ee45356e0..7ea275c7428 100644 --- a/src/plugins/qnx/qnxdevice.h +++ b/src/plugins/qnx/qnxdevice.h @@ -70,8 +70,6 @@ class QnxDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: QnxDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; } // namespace Internal diff --git a/src/plugins/remotelinux/filesystemaccess_test.cpp b/src/plugins/remotelinux/filesystemaccess_test.cpp index 603cd1b8782..9623b6f12d2 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.cpp +++ b/src/plugins/remotelinux/filesystemaccess_test.cpp @@ -51,20 +51,18 @@ TestLinuxDeviceFactory::TestLinuxDeviceFactory() { setDisplayName("Generic Linux Device"); setIcon(QIcon()); - setCanCreate(true); setConstructionFunction(&LinuxDevice::create); -} - -IDevice::Ptr TestLinuxDeviceFactory::create() const -{ - LinuxDevice::Ptr newDev = LinuxDevice::create(); - qDebug() << "device : " << newDev->type(); - newDev->setType("test"); - QSsh::SshConnectionParameters sshParams = newDev->sshParameters(); - sshParams.setHost(TEST_IP); - sshParams.setPort(22); - newDev->setSshParameters(sshParams); - return newDev; + setCanCreate(true); + setCreator([] { + LinuxDevice::Ptr newDev = LinuxDevice::create(); + qDebug() << "device : " << newDev->type(); + newDev->setType("test"); + QSsh::SshConnectionParameters sshParams = newDev->sshParameters(); + sshParams.setHost(TEST_IP); + sshParams.setPort(22); + newDev->setSshParameters(sshParams); + return newDev; + }); } FilePath createFile(const QString &name) diff --git a/src/plugins/remotelinux/filesystemaccess_test.h b/src/plugins/remotelinux/filesystemaccess_test.h index b0c7a73f056..4b43e202d44 100644 --- a/src/plugins/remotelinux/filesystemaccess_test.h +++ b/src/plugins/remotelinux/filesystemaccess_test.h @@ -37,8 +37,6 @@ class TestLinuxDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: TestLinuxDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; class FileSystemAccessTest : public QObject diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index 5422d8d9130..9387b46b7cd 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -754,17 +754,15 @@ LinuxDeviceFactory::LinuxDeviceFactory() { setDisplayName(LinuxDevice::tr("Generic Linux Device")); setIcon(QIcon()); - setCanCreate(true); setConstructionFunction(&LinuxDevice::create); + setCanCreate(true); + setCreator([] { + GenericLinuxDeviceConfigurationWizard wizard(Core::ICore::dialogParent()); + if (wizard.exec() != QDialog::Accepted) + return IDevice::Ptr(); + return wizard.device(); + }); } -IDevice::Ptr LinuxDeviceFactory::create() const -{ - GenericLinuxDeviceConfigurationWizard wizard(Core::ICore::dialogParent()); - if (wizard.exec() != QDialog::Accepted) - return IDevice::Ptr(); - return wizard.device(); -} - -} +} // namespace Internal } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/linuxdevice.h b/src/plugins/remotelinux/linuxdevice.h index fa68624cacf..d2906b230c3 100644 --- a/src/plugins/remotelinux/linuxdevice.h +++ b/src/plugins/remotelinux/linuxdevice.h @@ -100,8 +100,6 @@ class LinuxDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: LinuxDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; } // namespace Internal diff --git a/src/plugins/webassembly/webassemblydevice.cpp b/src/plugins/webassembly/webassemblydevice.cpp index 753bd57f041..2e1eb31180d 100644 --- a/src/plugins/webassembly/webassemblydevice.cpp +++ b/src/plugins/webassembly/webassemblydevice.cpp @@ -47,10 +47,9 @@ WebAssemblyDevice::WebAssemblyDevice() setOsType(OsTypeOther); } -ProjectExplorer::IDevice::Ptr WebAssemblyDevice::create() +IDevice::Ptr WebAssemblyDevice::create() { - auto device = new WebAssemblyDevice; - return ProjectExplorer::IDevice::Ptr(device); + return IDevice::Ptr(new WebAssemblyDevice); } WebAssemblyDeviceFactory::WebAssemblyDeviceFactory() @@ -59,13 +58,9 @@ WebAssemblyDeviceFactory::WebAssemblyDeviceFactory() setDisplayName(WebAssemblyDevice::tr("WebAssembly Runtime")); setCombinedIcon(":/webassembly/images/webassemblydevicesmall.png", ":/webassembly/images/webassemblydevice.png"); - setCanCreate(true); setConstructionFunction(&WebAssemblyDevice::create); -} - -ProjectExplorer::IDevice::Ptr WebAssemblyDeviceFactory::create() const -{ - return WebAssemblyDevice::create(); + setCanCreate(true); + setCreator(&WebAssemblyDevice::create); } } // namespace Internal diff --git a/src/plugins/webassembly/webassemblydevice.h b/src/plugins/webassembly/webassemblydevice.h index 137a33aaef6..91382a05749 100644 --- a/src/plugins/webassembly/webassemblydevice.h +++ b/src/plugins/webassembly/webassemblydevice.h @@ -45,8 +45,6 @@ class WebAssemblyDeviceFactory final : public ProjectExplorer::IDeviceFactory { public: WebAssemblyDeviceFactory(); - - ProjectExplorer::IDevice::Ptr create() const override; }; } // namespace Internal