McuSupport: Improve kit creation UX

Create a kit only for the currently selected target.
Kits are listed as auto-detected. Extisting, auto-detected kits with
same name get replaced with new ones.

Less text in the UI.

Change-Id: I89f952cc6ff694dc5c2750ebf9a7698d7839ec3a
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Alessandro Portale
2019-11-13 18:37:27 +01:00
parent a48497d663
commit 7f8576d49f
3 changed files with 89 additions and 74 deletions

View File

@@ -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<PackageOptions *> 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<BoardOptions *> 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<ProjectExplorer::Kit *> 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

View File

@@ -109,6 +109,7 @@ public:
QString toolChainFile() const;
QString qulPlatform() const;
QVector<PackageOptions *> packages() const;
bool isValid() const;
private:
const QString m_vendor;
@@ -126,8 +127,6 @@ public:
McuSupportOptions(QObject *parent = nullptr);
~McuSupportOptions() override;
QVector<BoardOptions*> validBoards() const;
QVector<PackageOptions*> packages;
QVector<BoardOptions*> boards;
PackageOptions *toolchainPackage = nullptr;
@@ -135,7 +134,8 @@ public:
QString kitName(const BoardOptions* board) const;
ProjectExplorer::Kit *kit(const BoardOptions* board);
QList<ProjectExplorer::Kit *> existingKits(const BoardOptions* board);
ProjectExplorer::Kit *newKit(const BoardOptions* board);
signals:
void changed();

View File

@@ -28,6 +28,7 @@
#include "mcusupportoptions.h"
#include <coreplugin/icore.h>
#include <projectexplorer/kitmanager.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <utils/algorithm.h>
#include <utils/qtcassert.h>
@@ -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 <PackageOptions*, QWidget*> m_packageWidgets;
QMap <BoardOptions*, QWidget*> 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<QStringList>(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<int>::of(&QComboBox::currentIndexChanged),
connect(m_boardComboBox, &QComboBox::currentTextChanged,
this, &McuSupportOptionsWidget::showBoardPackages);
showBoardPackages(m_currentBoardIndex);
showBoardPackages();
updateStatus();
}
void McuSupportOptionsWidget::updateStatus()
{
const QVector<BoardOptions*> validBoards = m_options->validBoards();
const BoardOptions *board = currentBoard();
if (!board)
return;
QString list("<ul>");
for (auto board : validBoards)
list.append("<li>" + m_options->kitName(board) + "</li>");
list.append("</ul>");
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 <b>%1</b> 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<BoardOptions*> 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()