From 9cd5fb927da4353126e96e3561ef2891ae473bba Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Fri, 16 Oct 2020 15:10:17 +0200 Subject: [PATCH] McuSupport: generate kits automatically on plugin initialization Fixes: QTCREATORBUG-24354 Change-Id: I26587102bd24d1678707ca1d9160c84149e77c8e Reviewed-by: hjk Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportconstants.h | 1 + src/plugins/mcusupport/mcusupportoptions.cpp | 70 ++++++++++++++++--- src/plugins/mcusupport/mcusupportoptions.h | 6 ++ .../mcusupport/mcusupportoptionspage.cpp | 14 ++++ src/plugins/mcusupport/mcusupportplugin.cpp | 1 + 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 1b1aa7a135a..2e10d0ff332 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -43,6 +43,7 @@ const char KIT_MCUTARGET_OS_KEY[] = "McuSupport.McuTargetOs"; const char SETTINGS_GROUP[] = "McuSupport"; const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; const char SETTINGS_KEY_PACKAGE_QT_FOR_MCUS_SDK[] = "QtForMCUsSdk"; // Key known by SDK installer +const char SETTINGS_KEY_AUTOMATIC_KIT_CREATION[] = "AutomaticKitCreation"; } // namespace McuSupport } // namespace Constants diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 6a13de985f0..b85847d59c6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -70,14 +70,22 @@ static QString packagePathFromSettings(const QString &settingsKey, QSettings::Scope scope = QSettings::UserScope, const QString &defaultPath = {}) { - QSettings *s = Core::ICore::settings(scope); - s->beginGroup(Constants::SETTINGS_GROUP); - const QString path = s->value(QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) - + settingsKey, defaultPath).toString(); - s->endGroup(); + QSettings *settings = Core::ICore::settings(scope); + const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + + QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + settingsKey; + const QString path = settings->value(key, defaultPath).toString(); return FilePath::fromFileInfo(path).toString(); } +static bool automaticKitCreationFromSettings(QSettings::Scope scope = QSettings::UserScope) +{ + QSettings *settings = Core::ICore::settings(scope); + const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + + QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION); + bool automaticKitCreation = settings->value(key, true).toBool(); + return automaticKitCreation; +} + static bool kitNeedsQtVersion() { // Only on Windows, Qt is linked into the distributed qul Desktop libs. Also, the host tools @@ -93,11 +101,13 @@ McuPackage::McuPackage(const QString &label, const QString &defaultPath, , m_settingsKey(settingsKey) { m_path = packagePathFromSettings(settingsKey, QSettings::UserScope, m_defaultPath); + m_automaticKitCreation = automaticKitCreationFromSettings(QSettings::UserScope); } QString McuPackage::path() const { - return QFileInfo(m_fileChooser->filePath().toString() + m_relativePathModifier).absoluteFilePath(); + QString basePath = m_fileChooser != nullptr ? m_fileChooser->filePath().toString() : m_path; + return QFileInfo(basePath + m_relativePathModifier).absoluteFilePath(); } QString McuPackage::label() const @@ -187,15 +197,23 @@ bool McuPackage::addToPath() const return m_addToPath; } +void McuPackage::writeGeneralSettings() const +{ + const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + + QLatin1String(Constants::SETTINGS_KEY_AUTOMATIC_KIT_CREATION); + QSettings *settings = Core::ICore::settings(); + settings->setValue(key, m_automaticKitCreation); +} + void McuPackage::writeToSettings() const { const QString key = QLatin1String(Constants::SETTINGS_GROUP) + '/' + QLatin1String(Constants::SETTINGS_KEY_PACKAGE_PREFIX) + m_settingsKey; - QSettings *uS = Core::ICore::settings(); + QSettings *settings = Core::ICore::settings(); if (m_path == m_defaultPath) - uS->remove(key); + settings->remove(key); else - uS->setValue(key, m_path); + settings->setValue(key, m_path); } void McuPackage::setRelativePathModifier(const QString &path) @@ -203,6 +221,16 @@ void McuPackage::setRelativePathModifier(const QString &path) m_relativePathModifier = path; } +bool McuPackage::automaticKitCreationEnabled() const +{ + return m_automaticKitCreation; +} + +void McuPackage::setAutomaticKitCreationEnabled(const bool enabled) +{ + m_automaticKitCreation = enabled; +} + void McuPackage::updateStatus() { m_path = m_fileChooser->rawPath(); @@ -713,5 +741,29 @@ Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget, const McuPackage *qtF return KitManager::registerKit(init); } +void McuSupportOptions::createAutomaticKits() +{ + if (qulDirFromSettings().isEmpty()) + return; + + auto qtForMCUsPackage = Sdk::createQtForMCUsPackage(); + + if (qtForMCUsPackage->automaticKitCreationEnabled()) { + auto dir = FilePath::fromUserInput(qtForMCUsPackage->path()); + QVector packages; + QVector mcuTargets; + Sdk::targetsAndPackages(dir, &packages, &mcuTargets); + + for (auto target: qAsConst(mcuTargets)) + if (existingKits(target).isEmpty()) + newKit(target, qtForMCUsPackage); + + qDeleteAll(packages); + qDeleteAll(mcuTargets); + } + + delete qtForMCUsPackage; +} + } // Internal } // McuSupport diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index afed7dcf5e1..113b653e4ca 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -71,9 +71,13 @@ public: void setEnvironmentVariableName(const QString &name); void setAddToPath(bool addToPath); bool addToPath() const; + void writeGeneralSettings() const; void writeToSettings() const; void setRelativePathModifier(const QString &path); + bool automaticKitCreationEnabled() const; + void setAutomaticKitCreationEnabled(const bool enabled); + QWidget *widget(); QString environmentVariableName() const; @@ -98,6 +102,7 @@ private: QString m_downloadUrl; QString m_environmentVariableName; bool m_addToPath = false; + bool m_automaticKitCreation = true; Status m_status = InvalidPath; }; @@ -190,6 +195,7 @@ public: static QList outdatedKits(); static void removeOutdatedKits(); static ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget, const McuPackage *qtForMCUsSdk); + static void createAutomaticKits(); void populatePackagesAndTargets(); static void registerQchFiles(); static void registerExamples(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index ba8905e72ab..f64e7330f7e 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include #include @@ -76,6 +77,7 @@ private: QGroupBox *m_mcuTargetsGroupBox = nullptr; QComboBox *m_mcuTargetsComboBox = nullptr; QGroupBox *m_kitCreationGroupBox = nullptr; + QCheckBox *m_kitAutomaticCreationCheckBox = nullptr; Utils::InfoLabel *m_kitCreationInfoLabel = nullptr; Utils::InfoLabel *m_statusInfoLabel = nullptr; QPushButton *m_kitCreationPushButton = nullptr; @@ -126,6 +128,14 @@ McuSupportOptionsWidget::McuSupportOptionsWidget() m_packagesGroupBox->setLayout(m_packagesLayout); } + { + m_kitAutomaticCreationCheckBox = new QCheckBox(tr("Automatically create kits for all available targets on start")); + connect(m_kitAutomaticCreationCheckBox, &QCheckBox::stateChanged, this, [this] (int state) { + m_options.qtForMCUsSdkPackage->setAutomaticKitCreationEnabled(state == Qt::CheckState::Checked); + }); + mainLayout->addWidget(m_kitAutomaticCreationCheckBox); + } + { m_kitCreationGroupBox = new QGroupBox(tr("Create a Kit")); m_kitCreationGroupBox->setFlat(true); @@ -196,6 +206,9 @@ void McuSupportOptionsWidget::updateStatus() } } + // Automatic Kit creation + m_kitAutomaticCreationCheckBox->setChecked(m_options.qtForMCUsSdkPackage->automaticKitCreationEnabled()); + // Status label in the bottom { m_statusInfoLabel->setVisible(!cMakeAvailable); @@ -246,6 +259,7 @@ void McuSupportOptionsWidget::showEvent(QShowEvent *event) void McuSupportOptionsWidget::apply() { + m_options.qtForMCUsSdkPackage->writeGeneralSettings(); m_options.qtForMCUsSdkPackage->writeToSettings(); for (auto package : m_options.packages) package->writeToSettings(); diff --git a/src/plugins/mcusupport/mcusupportplugin.cpp b/src/plugins/mcusupport/mcusupportplugin.cpp index 5355790a2b6..9ecd84e75b8 100644 --- a/src/plugins/mcusupport/mcusupportplugin.cpp +++ b/src/plugins/mcusupport/mcusupportplugin.cpp @@ -95,6 +95,7 @@ void McuSupportPlugin::extensionsInitialized() connect(KitManager::instance(), &KitManager::kitsLoaded, [](){ McuSupportOptions::removeOutdatedKits(); + McuSupportOptions::createAutomaticKits(); McuSupportPlugin::askUserAboutMcuSupportKitsSetup(); }); }