forked from qt-creator/qt-creator
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:
@@ -90,11 +90,6 @@ QWidget *PackageOptions::widget()
|
|||||||
|
|
||||||
m_widget = new QWidget;
|
m_widget = new QWidget;
|
||||||
m_fileChooser = new Utils::PathChooser;
|
m_fileChooser = new Utils::PathChooser;
|
||||||
QObject::connect(m_fileChooser, &Utils::PathChooser::pathChanged,
|
|
||||||
[this](){
|
|
||||||
updateStatus();
|
|
||||||
emit changed();
|
|
||||||
});
|
|
||||||
|
|
||||||
auto layout = new QGridLayout(m_widget);
|
auto layout = new QGridLayout(m_widget);
|
||||||
layout->setContentsMargins(0, 0, 0, 0);
|
layout->setContentsMargins(0, 0, 0, 0);
|
||||||
@@ -119,7 +114,15 @@ QWidget *PackageOptions::widget()
|
|||||||
layout->addWidget(m_statusIcon, 1, 0);
|
layout->addWidget(m_statusIcon, 1, 0);
|
||||||
layout->addWidget(m_statusLabel, 1, 1, 1, -1);
|
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;
|
return m_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,6 +232,13 @@ QVector<PackageOptions *> BoardOptions::packages() const
|
|||||||
return m_packages;
|
return m_packages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BoardOptions::isValid() const
|
||||||
|
{
|
||||||
|
return !Utils::anyOf(packages(), [](PackageOptions *package) {
|
||||||
|
return package->status() != PackageOptions::ValidPackage;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QString BoardOptions::vendor() const
|
QString BoardOptions::vendor() const
|
||||||
{
|
{
|
||||||
return m_vendor;
|
return m_vendor;
|
||||||
@@ -404,14 +414,6 @@ McuSupportOptions::~McuSupportOptions()
|
|||||||
boards.clear();
|
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)
|
static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, Core::Id language)
|
||||||
{
|
{
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
@@ -451,7 +453,8 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k,
|
|||||||
k->setUnexpandedDisplayName(kitName);
|
k->setUnexpandedDisplayName(kitName);
|
||||||
k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor());
|
k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor());
|
||||||
k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model());
|
k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model());
|
||||||
k->setAutoDetected(false);
|
k->setAutoDetected(true);
|
||||||
|
k->makeSticky();
|
||||||
if (!isDesktop(board)) {
|
if (!isDesktop(board)) {
|
||||||
k->setIrrelevantAspects({SysRootKitAspect::id(),
|
k->setIrrelevantAspects({SysRootKitAspect::id(),
|
||||||
"QtSupport.QtInformation" // QtKitAspect::id()
|
"QtSupport.QtInformation" // QtKitAspect::id()
|
||||||
@@ -552,14 +555,19 @@ QString McuSupportOptions::kitName(const BoardOptions *board) const
|
|||||||
return QString::fromLatin1("QtMCU - %1 %2").arg(board->vendor(), board->model());
|
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;
|
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 armGccPath = toolchainPackage->path();
|
||||||
const QString qulDir = qulSdkPackage->path();
|
const QString qulDir = qulSdkPackage->path();
|
||||||
const auto init = [this, board](Kit *k) {
|
const auto init = [this, board](Kit *k) {
|
||||||
@@ -577,9 +585,8 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board)
|
|||||||
k->setup();
|
k->setup();
|
||||||
k->fix();
|
k->fix();
|
||||||
};
|
};
|
||||||
kit = KitManager::registerKit(init);
|
|
||||||
}
|
return KitManager::registerKit(init);
|
||||||
return kit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Internal
|
} // Internal
|
||||||
|
@@ -109,6 +109,7 @@ public:
|
|||||||
QString toolChainFile() const;
|
QString toolChainFile() const;
|
||||||
QString qulPlatform() const;
|
QString qulPlatform() const;
|
||||||
QVector<PackageOptions *> packages() const;
|
QVector<PackageOptions *> packages() const;
|
||||||
|
bool isValid() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const QString m_vendor;
|
const QString m_vendor;
|
||||||
@@ -126,8 +127,6 @@ public:
|
|||||||
McuSupportOptions(QObject *parent = nullptr);
|
McuSupportOptions(QObject *parent = nullptr);
|
||||||
~McuSupportOptions() override;
|
~McuSupportOptions() override;
|
||||||
|
|
||||||
QVector<BoardOptions*> validBoards() const;
|
|
||||||
|
|
||||||
QVector<PackageOptions*> packages;
|
QVector<PackageOptions*> packages;
|
||||||
QVector<BoardOptions*> boards;
|
QVector<BoardOptions*> boards;
|
||||||
PackageOptions *toolchainPackage = nullptr;
|
PackageOptions *toolchainPackage = nullptr;
|
||||||
@@ -135,7 +134,8 @@ public:
|
|||||||
|
|
||||||
QString kitName(const BoardOptions* board) const;
|
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:
|
signals:
|
||||||
void changed();
|
void changed();
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include "mcusupportoptions.h"
|
#include "mcusupportoptions.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
#include <projectexplorer/kitmanager.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
@@ -49,16 +50,17 @@ public:
|
|||||||
McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent = nullptr);
|
McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent = nullptr);
|
||||||
|
|
||||||
void updateStatus();
|
void updateStatus();
|
||||||
void showBoardPackages(int boardIndex);
|
void showBoardPackages();
|
||||||
|
BoardOptions *currentBoard() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_armGccPath;
|
QString m_armGccPath;
|
||||||
const McuSupportOptions *m_options;
|
const McuSupportOptions *m_options;
|
||||||
int m_currentBoardIndex = 0;
|
|
||||||
QMap <PackageOptions*, QWidget*> m_packageWidgets;
|
QMap <PackageOptions*, QWidget*> m_packageWidgets;
|
||||||
QMap <BoardOptions*, QWidget*> m_boardPacketWidgets;
|
QMap <BoardOptions*, QWidget*> m_boardPacketWidgets;
|
||||||
QFormLayout *m_packagesLayout = nullptr;
|
QFormLayout *m_packagesLayout = nullptr;
|
||||||
QLabel *m_statusLabel = nullptr;
|
QLabel *m_statusLabel = nullptr;
|
||||||
|
QComboBox *m_boardComboBox = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent)
|
McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent)
|
||||||
@@ -70,14 +72,14 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option
|
|||||||
auto boardChooserlayout = new QHBoxLayout;
|
auto boardChooserlayout = new QHBoxLayout;
|
||||||
auto boardChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:"));
|
auto boardChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:"));
|
||||||
boardChooserlayout->addWidget(boardChooserLabel);
|
boardChooserlayout->addWidget(boardChooserLabel);
|
||||||
auto boardComboBox = new QComboBox;
|
m_boardComboBox = new QComboBox;
|
||||||
boardChooserLabel->setBuddy(boardComboBox);
|
boardChooserLabel->setBuddy(m_boardComboBox);
|
||||||
boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
|
||||||
boardComboBox->addItems(
|
m_boardComboBox->addItems(
|
||||||
Utils::transform<QStringList>(m_options->boards, [this](BoardOptions *b){
|
Utils::transform<QStringList>(m_options->boards, [this](BoardOptions *b){
|
||||||
return m_options->kitName(b);
|
return m_options->kitName(b);
|
||||||
}));
|
}));
|
||||||
boardChooserlayout->addWidget(boardComboBox);
|
boardChooserlayout->addWidget(m_boardComboBox);
|
||||||
mainLayout->addLayout(boardChooserlayout);
|
mainLayout->addLayout(boardChooserlayout);
|
||||||
|
|
||||||
auto m_packagesGroupBox = new QGroupBox(McuSupportOptionsPage::tr("Packages"));
|
auto m_packagesGroupBox = new QGroupBox(McuSupportOptionsPage::tr("Packages"));
|
||||||
@@ -85,56 +87,59 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option
|
|||||||
m_packagesLayout = new QFormLayout;
|
m_packagesLayout = new QFormLayout;
|
||||||
m_packagesGroupBox->setLayout(m_packagesLayout);
|
m_packagesGroupBox->setLayout(m_packagesLayout);
|
||||||
|
|
||||||
mainLayout->addStretch(1);
|
|
||||||
|
|
||||||
m_statusLabel = new QLabel;
|
m_statusLabel = new QLabel;
|
||||||
mainLayout->addWidget(m_statusLabel);
|
mainLayout->addWidget(m_statusLabel, 2);
|
||||||
m_statusLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
|
||||||
m_statusLabel->setWordWrap(true);
|
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(options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus);
|
||||||
connect(boardComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
connect(m_boardComboBox, &QComboBox::currentTextChanged,
|
||||||
this, &McuSupportOptionsWidget::showBoardPackages);
|
this, &McuSupportOptionsWidget::showBoardPackages);
|
||||||
|
|
||||||
showBoardPackages(m_currentBoardIndex);
|
showBoardPackages();
|
||||||
|
updateStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void McuSupportOptionsWidget::updateStatus()
|
void McuSupportOptionsWidget::updateStatus()
|
||||||
{
|
{
|
||||||
const QVector<BoardOptions*> validBoards = m_options->validBoards();
|
const BoardOptions *board = currentBoard();
|
||||||
|
if (!board)
|
||||||
|
return;
|
||||||
|
|
||||||
QString list("<ul>");
|
m_statusLabel->setText(board->isValid()
|
||||||
for (auto board : validBoards)
|
? QString::fromLatin1("A kit <b>%1</b> for the selected target can be generated. "
|
||||||
list.append("<li>" + m_options->kitName(board) + "</li>");
|
"Press Apply to generate it.").arg(m_options->kitName(board))
|
||||||
list.append("</ul>");
|
: QString::fromLatin1("Provide the package paths in order to create a kit for "
|
||||||
|
"your target."));
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void McuSupportOptionsWidget::showBoardPackages(int boardIndex)
|
void McuSupportOptionsWidget::showBoardPackages()
|
||||||
{
|
{
|
||||||
|
const BoardOptions *board = currentBoard();
|
||||||
|
if (!board)
|
||||||
|
return;
|
||||||
|
|
||||||
while (m_packagesLayout->rowCount() > 0) {
|
while (m_packagesLayout->rowCount() > 0) {
|
||||||
QFormLayout::TakeRowResult row = m_packagesLayout->takeRow(0);
|
QFormLayout::TakeRowResult row = m_packagesLayout->takeRow(0);
|
||||||
row.labelItem->widget()->hide();
|
row.labelItem->widget()->hide();
|
||||||
row.fieldItem->widget()->hide();
|
row.fieldItem->widget()->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
const BoardOptions *currentBoard = m_options->boards.at(boardIndex);
|
|
||||||
|
|
||||||
for (auto package : m_options->packages) {
|
for (auto package : m_options->packages) {
|
||||||
QWidget *packageWidget = package->widget();
|
QWidget *packageWidget = package->widget();
|
||||||
if (!currentBoard->packages().contains(package))
|
if (!board->packages().contains(package))
|
||||||
continue;
|
continue;
|
||||||
m_packagesLayout->addRow(package->label(), packageWidget);
|
m_packagesLayout->addRow(package->label(), packageWidget);
|
||||||
packageWidget->show();
|
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)
|
McuSupportOptionsPage::McuSupportOptionsPage(QObject* parent)
|
||||||
@@ -162,12 +167,15 @@ void McuSupportOptionsPage::apply()
|
|||||||
QTC_ASSERT(m_options->toolchainPackage, return);
|
QTC_ASSERT(m_options->toolchainPackage, return);
|
||||||
QTC_ASSERT(m_options->qulSdkPackage, 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;
|
using namespace ProjectExplorer;
|
||||||
|
|
||||||
for (auto board : validBoards)
|
for (auto existingKit : m_options->existingKits(board))
|
||||||
m_options->kit(board);
|
ProjectExplorer::KitManager::deregisterKit(existingKit);
|
||||||
|
m_options->newKit(board);
|
||||||
}
|
}
|
||||||
|
|
||||||
void McuSupportOptionsPage::finish()
|
void McuSupportOptionsPage::finish()
|
||||||
|
Reference in New Issue
Block a user