diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index be5f3071242..b707b81cc6f 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -847,7 +847,6 @@ AndroidDeviceFactory::AndroidDeviceFactory() setDisplayName(Tr::tr("Android Device")); setCombinedIcon(":/android/images/androiddevicesmall.png", ":/android/images/androiddevice.png"); - setConstructionFunction(&AndroidDevice::create); if (m_androidConfig.sdkToolsOk()) { setCreator([this] { diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index 4c8d7ea8c66..d7754ebc9a0 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -24,7 +24,6 @@ const char debugServerProviderIdKeyC[] = "IDebugServerProviderId"; BareMetalDevice::BareMetalDevice() { setDisplayType(Tr::tr("Bare Metal")); - setDefaultDisplayName(defaultDisplayName()); setOsType(Utils::OsTypeOther); } diff --git a/src/plugins/boot2qt/qdbdevice.cpp b/src/plugins/boot2qt/qdbdevice.cpp index c595645a444..c2c25b65372 100644 --- a/src/plugins/boot2qt/qdbdevice.cpp +++ b/src/plugins/boot2qt/qdbdevice.cpp @@ -104,6 +104,7 @@ private: QdbDevice::QdbDevice() { setDisplayType(Tr::tr("Boot2Qt Device")); + setType(Constants::QdbLinuxOsType); addDeviceAction({Tr::tr("Reboot Device"), [](const IDevice::Ptr &device, QWidget *) { (void) new DeviceApplicationObserver(device, {device->filePath("reboot"), {}}); @@ -247,6 +248,7 @@ QdbLinuxDeviceFactory::QdbLinuxDeviceFactory() { setDisplayName(Tr::tr("Boot2Qt Device")); setCombinedIcon(":/qdb/images/qdbdevicesmall.png", ":/qdb/images/qdbdevice.png"); + setQuickCreationAllowed(true); setConstructionFunction(&QdbDevice::create); setCreator([] { QdbDeviceWizard wizard(Core::ICore::dialogParent()); diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index d0a8c4c8e97..0745dd95238 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -383,7 +383,9 @@ DockerDevice::DockerDevice(DockerSettings *settings, const DockerDeviceData &dat setDisplayType(Tr::tr("Docker")); setOsType(OsTypeOtherUnix); setDefaultDisplayName(Tr::tr("Docker Image")); - + setupId(IDevice::ManuallyAdded); + setType(Constants::DOCKER_DEVICE_TYPE); + setMachineType(IDevice::Hardware); setDisplayName(Tr::tr("Docker Image \"%1\" (%2)").arg(data.repoAndTag()).arg(data.imageId)); setAllowEmptyCommand(true); @@ -1095,9 +1097,6 @@ public: QTC_ASSERT(item, return {}); auto device = DockerDevice::create(m_settings, *item); - device->setupId(IDevice::ManuallyAdded); - device->setType(Constants::DOCKER_DEVICE_TYPE); - device->setMachineType(IDevice::Hardware); return device; } diff --git a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp index 6de16afac00..663d1932ca3 100644 --- a/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicesettingswidget.cpp @@ -101,14 +101,31 @@ void DeviceSettingsWidget::initGui() m_deviceStateTextLabel = new QLabel; m_osSpecificGroupBox = new QGroupBox(Tr::tr("Type Specific")); m_osSpecificGroupBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); - m_addConfigButton = new QPushButton(Tr::tr("&Add...")); + m_addConfigButton = new QPushButton(Tr::tr("&Start Wizard to Add Device...")); m_removeConfigButton = new QPushButton(Tr::tr("&Remove")); m_defaultDeviceButton = new QPushButton(Tr::tr("Set As Default")); - auto line = new QFrame; - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - auto customButtonsContainer = new QWidget; - m_buttonsLayout = new QVBoxLayout(customButtonsContainer); + + auto directLayout = new QVBoxLayout; + for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories()) { + if (!factory->canCreate()) + continue; + auto button = new QPushButton(Tr::tr("Add %1").arg(factory->displayName())); + directLayout->addWidget(button); + if (!factory->quickCreationAllowed()) { + button->setEnabled(false); + continue; + } + connect (button, &QPushButton::clicked, this, [factory, this] { + IDevice::Ptr device = factory->construct(); + QTC_ASSERT(device, return); + m_deviceManager->addDevice(device); + m_removeConfigButton->setEnabled(true); + m_configurationComboBox->setCurrentIndex(m_deviceManagerModel->indexOf(device)); + saveSettings(); + }); + } + + m_buttonsLayout = new QVBoxLayout; m_buttonsLayout->setContentsMargins({}); auto scrollAreaWidget = new QWidget; auto scrollArea = new QScrollArea; @@ -135,10 +152,12 @@ void DeviceSettingsWidget::initGui() }, Column { m_addConfigButton, + Space(10), + directLayout, + Space(30), m_removeConfigButton, m_defaultDeviceButton, - line, - customButtonsContainer, + m_buttonsLayout, st, }, }.attachTo(this); diff --git a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp index c33bc125bb5..c20f4776d61 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.cpp @@ -63,12 +63,24 @@ bool IDeviceFactory::canCreate() const IDevice::Ptr IDeviceFactory::create() const { - return m_creator ? m_creator() : IDevice::Ptr(); + if (m_creator) + return {}; + + IDevice::Ptr device = m_constructor(); + QTC_ASSERT(device, return {}); + device->setDefaultDisplayName(displayName()); + return device; } IDevice::Ptr IDeviceFactory::construct() const { - return m_constructor ? m_constructor() : IDevice::Ptr(); + if (!m_constructor) + return {}; + + IDevice::Ptr device = m_constructor(); + QTC_ASSERT(device, return {}); + device->setDefaultDisplayName(displayName()); + return device; } static QList g_deviceFactories; @@ -105,6 +117,16 @@ void IDeviceFactory::setCreator(const std::function &creator) m_creator = creator; } +void IDeviceFactory::setQuickCreationAllowed(bool on) +{ + m_quickCreationAllowed = on; +} + +bool IDeviceFactory::quickCreationAllowed() const +{ + return m_quickCreationAllowed; +} + 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 87a54244adb..665059f5b2c 100644 --- a/src/plugins/projectexplorer/devicesupport/idevicefactory.h +++ b/src/plugins/projectexplorer/devicesupport/idevicefactory.h @@ -26,6 +26,7 @@ public: bool canCreate() const; IDevicePtr construct() const; IDevicePtr create() const; + bool quickCreationAllowed() const; virtual bool canRestore(const QVariantMap &) const { return true; } @@ -41,6 +42,7 @@ protected: void setCombinedIcon(const Utils::FilePath &smallIcon, const Utils::FilePath &largeIcon); void setConstructionFunction(const std::function &constructor); void setCreator(const std::function &creator); + void setQuickCreationAllowed(bool on); private: std::function m_creator; @@ -48,6 +50,7 @@ private: QString m_displayName; QIcon m_icon; std::function m_constructor; + bool m_quickCreationAllowed = false; }; } // namespace ProjectExplorer diff --git a/src/plugins/qnx/qnxdevice.cpp b/src/plugins/qnx/qnxdevice.cpp index dac5c9698b3..2b6520e0025 100644 --- a/src/plugins/qnx/qnxdevice.cpp +++ b/src/plugins/qnx/qnxdevice.cpp @@ -9,9 +9,12 @@ #include "qnxdevicewizard.h" #include "qnxtr.h" +#include + #include #include +#include #include #include @@ -56,6 +59,13 @@ QnxDevice::QnxDevice() setDisplayType(Tr::tr("QNX")); setDefaultDisplayName(Tr::tr("QNX Device")); setOsType(OsTypeOtherUnix); + setupId(IDevice::ManuallyAdded); + setType(Constants::QNX_QNX_OS_TYPE); + setMachineType(IDevice::Hardware); + SshParameters sshParams; + sshParams.timeout = 10; + setSshParameters(sshParams); + setFreePorts(PortList::fromString("10000-10100")); addDeviceAction({Tr::tr("Deploy Qt libraries..."), [](const IDevice::Ptr &device, QWidget *parent) { QnxDeployQtLibrariesDialog dialog(device, parent); @@ -94,6 +104,7 @@ QnxDeviceFactory::QnxDeviceFactory() : IDeviceFactory(Constants::QNX_QNX_OS_TYPE setDisplayName(Tr::tr("QNX Device")); setCombinedIcon(":/qnx/images/qnxdevicesmall.png", ":/qnx/images/qnxdevice.png"); + setQuickCreationAllowed(true); setConstructionFunction(&QnxDevice::create); setCreator(&runDeviceWizard); } diff --git a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp index 4de31d898de..7bd047a590e 100644 --- a/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp +++ b/src/plugins/remotelinux/genericlinuxdeviceconfigurationwizard.cpp @@ -11,7 +11,6 @@ #include #include -#include #include using namespace ProjectExplorer; @@ -45,13 +44,6 @@ GenericLinuxDeviceConfigurationWizard::GenericLinuxDeviceConfigurationWizard(QWi setPage(Internal::FinalPageId, &d->finalPage); d->finalPage.setCommitPage(true); d->device = LinuxDevice::create(); - d->device->setupId(IDevice::ManuallyAdded, Utils::Id()); - d->device->setType(Constants::GenericLinuxOsType); - d->device->setMachineType(IDevice::Hardware); - d->device->setFreePorts(Utils::PortList::fromString(QLatin1String("10000-10100"))); - SshParameters sshParams; - sshParams.timeout = 10; - d->device->setSshParameters(sshParams); d->setupPage.setDevice(d->device); d->keyDeploymentPage.setDevice(d->device); } diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index aa5889516cc..da7b7aa2d18 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -887,9 +888,16 @@ LinuxDevice::LinuxDevice() { setFileAccess(&d->m_fileAccess); setDisplayType(Tr::tr("Remote Linux")); - setDefaultDisplayName(Tr::tr("Remote Linux Device")); setOsType(OsTypeLinux); + setupId(IDevice::ManuallyAdded, Utils::Id()); + setType(Constants::GenericLinuxOsType); + setMachineType(IDevice::Hardware); + setFreePorts(PortList::fromString(QLatin1String("10000-10100"))); + SshParameters sshParams; + sshParams.timeout = 10; + setSshParameters(sshParams); + addDeviceAction({Tr::tr("Deploy Public Key..."), [](const IDevice::Ptr &device, QWidget *parent) { if (auto d = PublicKeyDeploymentDialog::createDialog(device, parent)) { d->exec(); @@ -1489,6 +1497,7 @@ LinuxDeviceFactory::LinuxDeviceFactory() setDisplayName(Tr::tr("Remote Linux Device")); setIcon(QIcon()); setConstructionFunction(&LinuxDevice::create); + setQuickCreationAllowed(true); setCreator([] { GenericLinuxDeviceConfigurationWizard wizard(Core::ICore::dialogParent()); if (wizard.exec() != QDialog::Accepted)