diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 91d69ceb8d6..916b8894879 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -90,11 +90,6 @@ QWidget *PackageOptions::widget() m_widget = new QWidget; m_fileChooser = new Utils::PathChooser; - QObject::connect(m_fileChooser, &Utils::PathChooser::pathChanged, - [this](){ - updateStatus(); - emit changed(); - }); auto layout = new QGridLayout(m_widget); layout->setContentsMargins(0, 0, 0, 0); @@ -119,7 +114,15 @@ QWidget *PackageOptions::widget() layout->addWidget(m_statusIcon, 1, 0); layout->addWidget(m_statusLabel, 1, 1, 1, -1); - m_fileChooser->setPath(m_path); // Triggers updateStatus() call + m_fileChooser->setPath(m_path); + + QObject::connect(m_fileChooser, &Utils::PathChooser::pathChanged, + [this](){ + updateStatus(); + emit changed(); + }); + + updateStatus(); return m_widget; } @@ -229,6 +232,13 @@ QVector BoardOptions::packages() const return m_packages; } +bool BoardOptions::isValid() const +{ + return !Utils::anyOf(packages(), [](PackageOptions *package) { + return package->status() != PackageOptions::ValidPackage; + }); +} + QString BoardOptions::vendor() const { return m_vendor; @@ -404,14 +414,6 @@ McuSupportOptions::~McuSupportOptions() boards.clear(); } -QVector McuSupportOptions::validBoards() const -{ - return Utils::filtered(boards, [](BoardOptions *board){ - return !Utils::anyOf(board->packages(), [](PackageOptions *package){ - return package->status() != PackageOptions::ValidPackage;}); - }); -} - static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, Core::Id language) { using namespace ProjectExplorer; @@ -451,7 +453,8 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, k->setUnexpandedDisplayName(kitName); k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); - k->setAutoDetected(false); + k->setAutoDetected(true); + k->makeSticky(); if (!isDesktop(board)) { k->setIrrelevantAspects({SysRootKitAspect::id(), "QtSupport.QtInformation" // QtKitAspect::id() @@ -552,34 +555,38 @@ QString McuSupportOptions::kitName(const BoardOptions *board) const return QString::fromLatin1("QtMCU - %1 %2").arg(board->vendor(), board->model()); } -ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) +QList McuSupportOptions::existingKits(const BoardOptions *board) +{ + using namespace ProjectExplorer; + const QString boardKitName = kitName(board); + return Utils::filtered(KitManager::kits(), [&boardKitName](Kit *kit) { + return kit->isAutoDetected() && kit->unexpandedDisplayName() == boardKitName; + }); +} + +ProjectExplorer::Kit *McuSupportOptions::newKit(const BoardOptions* board) { using namespace ProjectExplorer; - Kit *kit = KitManager::kit([board](const Kit *k){ - return board->model() == k->value(Constants::KIT_BOARD_MODEL_KEY).toString(); - }); - if (!kit) { - const QString armGccPath = toolchainPackage->path(); - const QString qulDir = qulSdkPackage->path(); - const auto init = [this, board](Kit *k) { - KitGuard kitGuard(k); + const QString armGccPath = toolchainPackage->path(); + const QString qulDir = qulSdkPackage->path(); + const auto init = [this, board](Kit *k) { + KitGuard kitGuard(k); - setKitProperties(kitName(board), k, board); - if (!isDesktop(board)) { - setKitToolchains(k, toolchainPackage->path()); - setKitDebugger(k, toolchainPackage->path()); - setKitDevice(k); - } - setKitEnvironment(k, board); - setKitCMakeOptions(k, board, qulSdkPackage->path()); + setKitProperties(kitName(board), k, board); + if (!isDesktop(board)) { + setKitToolchains(k, toolchainPackage->path()); + setKitDebugger(k, toolchainPackage->path()); + setKitDevice(k); + } + setKitEnvironment(k, board); + setKitCMakeOptions(k, board, qulSdkPackage->path()); - k->setup(); - k->fix(); - }; - kit = KitManager::registerKit(init); - } - return kit; + k->setup(); + k->fix(); + }; + + return KitManager::registerKit(init); } } // Internal diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index c5d64171a9e..2cf4bd61a17 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -109,6 +109,7 @@ public: QString toolChainFile() const; QString qulPlatform() const; QVector packages() const; + bool isValid() const; private: const QString m_vendor; @@ -126,8 +127,6 @@ public: McuSupportOptions(QObject *parent = nullptr); ~McuSupportOptions() override; - QVector validBoards() const; - QVector packages; QVector boards; PackageOptions *toolchainPackage = nullptr; @@ -135,7 +134,8 @@ public: QString kitName(const BoardOptions* board) const; - ProjectExplorer::Kit *kit(const BoardOptions* board); + QList existingKits(const BoardOptions* board); + ProjectExplorer::Kit *newKit(const BoardOptions* board); signals: void changed(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 3ddf08fd2ab..73f39cb42ba 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -28,6 +28,7 @@ #include "mcusupportoptions.h" #include +#include #include #include #include @@ -49,16 +50,17 @@ public: McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent = nullptr); void updateStatus(); - void showBoardPackages(int boardIndex); + void showBoardPackages(); + BoardOptions *currentBoard() const; private: QString m_armGccPath; const McuSupportOptions *m_options; - int m_currentBoardIndex = 0; QMap m_packageWidgets; QMap m_boardPacketWidgets; QFormLayout *m_packagesLayout = nullptr; QLabel *m_statusLabel = nullptr; + QComboBox *m_boardComboBox = nullptr; }; McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent) @@ -70,14 +72,14 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option auto boardChooserlayout = new QHBoxLayout; auto boardChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:")); boardChooserlayout->addWidget(boardChooserLabel); - auto boardComboBox = new QComboBox; - boardChooserLabel->setBuddy(boardComboBox); + m_boardComboBox = new QComboBox; + boardChooserLabel->setBuddy(m_boardComboBox); boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - boardComboBox->addItems( + m_boardComboBox->addItems( Utils::transform(m_options->boards, [this](BoardOptions *b){ return m_options->kitName(b); })); - boardChooserlayout->addWidget(boardComboBox); + boardChooserlayout->addWidget(m_boardComboBox); mainLayout->addLayout(boardChooserlayout); auto m_packagesGroupBox = new QGroupBox(McuSupportOptionsPage::tr("Packages")); @@ -85,56 +87,59 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option m_packagesLayout = new QFormLayout; m_packagesGroupBox->setLayout(m_packagesLayout); - mainLayout->addStretch(1); - m_statusLabel = new QLabel; - mainLayout->addWidget(m_statusLabel); - m_statusLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mainLayout->addWidget(m_statusLabel, 2); m_statusLabel->setWordWrap(true); - m_statusLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); + m_statusLabel->setAlignment(Qt::AlignBottom | Qt::AlignLeft); connect(options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus); - connect(boardComboBox, QOverload::of(&QComboBox::currentIndexChanged), + connect(m_boardComboBox, &QComboBox::currentTextChanged, this, &McuSupportOptionsWidget::showBoardPackages); - showBoardPackages(m_currentBoardIndex); + showBoardPackages(); + updateStatus(); } void McuSupportOptionsWidget::updateStatus() { - const QVector validBoards = m_options->validBoards(); + const BoardOptions *board = currentBoard(); + if (!board) + return; - QString list("
    "); - for (auto board : validBoards) - list.append("
  • " + m_options->kitName(board) + "
  • "); - list.append("
"); - - m_statusLabel->setText( - validBoards.isEmpty() - ? QString::fromLatin1("No kits can currently be generated. " - "Select a target and provide the package paths. " - "Afterwards, press Apply to generate a kit for your target.") - : QString::fromLatin1("The following Kits can be generated: %1 " - "Press Apply to generate a kit for your target.").arg(list)); + m_statusLabel->setText(board->isValid() + ? QString::fromLatin1("A kit %1 for the selected target can be generated. " + "Press Apply to generate it.").arg(m_options->kitName(board)) + : QString::fromLatin1("Provide the package paths in order to create a kit for " + "your target.")); } -void McuSupportOptionsWidget::showBoardPackages(int boardIndex) +void McuSupportOptionsWidget::showBoardPackages() { + const BoardOptions *board = currentBoard(); + if (!board) + return; + while (m_packagesLayout->rowCount() > 0) { QFormLayout::TakeRowResult row = m_packagesLayout->takeRow(0); row.labelItem->widget()->hide(); row.fieldItem->widget()->hide(); } - const BoardOptions *currentBoard = m_options->boards.at(boardIndex); - for (auto package : m_options->packages) { QWidget *packageWidget = package->widget(); - if (!currentBoard->packages().contains(package)) + if (!board->packages().contains(package)) continue; m_packagesLayout->addRow(package->label(), packageWidget); packageWidget->show(); } + + updateStatus(); +} + +BoardOptions *McuSupportOptionsWidget::currentBoard() const +{ + const int boardIndex = m_boardComboBox->currentIndex(); + return m_options->boards.isEmpty() ? nullptr : m_options->boards.at(boardIndex); } McuSupportOptionsPage::McuSupportOptionsPage(QObject* parent) @@ -162,12 +167,15 @@ void McuSupportOptionsPage::apply() QTC_ASSERT(m_options->toolchainPackage, return); QTC_ASSERT(m_options->qulSdkPackage, return); - const QVector validBoards = m_options->validBoards(); + const BoardOptions *board = m_widget->currentBoard(); + if (!board) + return; using namespace ProjectExplorer; - for (auto board : validBoards) - m_options->kit(board); + for (auto existingKit : m_options->existingKits(board)) + ProjectExplorer::KitManager::deregisterKit(existingKit); + m_options->newKit(board); } void McuSupportOptionsPage::finish()