McuSupport: Restructure UI to reflect the data hierarchy

1) User selects the Qt for MCUs sdk dir
2) User chooses which board to configure
3) User provides paths for dependencies
4) User creates Kit

Change-Id: Ia30ca7e245e2500c7650d12ea6768ab6e60d99c7
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Alessandro Portale
2020-03-04 19:59:50 +01:00
parent 9d4a6092d2
commit 8652188ac9
2 changed files with 61 additions and 35 deletions

View File

@@ -462,11 +462,10 @@ McuSupportOptions::McuSupportOptions(QObject *parent)
McuPackage* seggerJLinkPackage = createSeggerJLinkPackage(); McuPackage* seggerJLinkPackage = createSeggerJLinkPackage();
QVector<McuPackage*> stmEvalPackages = { QVector<McuPackage*> stmEvalPackages = {
armGccPackage, stm32CubeProgrammerPackage, qtForMCUsSdkPackage}; armGccPackage, stm32CubeProgrammerPackage};
QVector<McuPackage*> nxpEvalPackages = { QVector<McuPackage*> nxpEvalPackages = {
armGccPackage, seggerJLinkPackage, qtForMCUsSdkPackage}; armGccPackage, seggerJLinkPackage};
QVector<McuPackage*> desktopPackages = { QVector<McuPackage*> desktopPackages = {};
qtForMCUsSdkPackage};
packages = { packages = {
armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage,
seggerJLinkPackage, qtForMCUsSdkPackage}; seggerJLinkPackage, qtForMCUsSdkPackage};
@@ -564,13 +563,20 @@ static void setKitDevice(ProjectExplorer::Kit *k)
ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE); ProjectExplorer::DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE);
} }
static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarget) static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarget,
McuPackage *qtForMCUsSdkPackage)
{ {
using namespace ProjectExplorer; using namespace ProjectExplorer;
Utils::EnvironmentItems changes; Utils::EnvironmentItems changes;
QStringList pathAdditions; QStringList pathAdditions;
for (auto package : mcuTarget->packages()) {
QVector<McuPackage *> packagesIncludingSdk;
packagesIncludingSdk.reserve(mcuTarget->packages().size() + 1);
packagesIncludingSdk.append(mcuTarget->packages());
packagesIncludingSdk.append(qtForMCUsSdkPackage);
for (auto package : packagesIncludingSdk) {
if (package->addToPath()) if (package->addToPath())
pathAdditions.append(QDir::toNativeSeparators(package->path())); pathAdditions.append(QDir::toNativeSeparators(package->path()));
if (!package->environmentVariableName().isEmpty()) if (!package->environmentVariableName().isEmpty())
@@ -646,7 +652,7 @@ ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget)
setKitDebugger(k, mcuTarget->toolChainPackage()); setKitDebugger(k, mcuTarget->toolChainPackage());
setKitDevice(k); setKitDevice(k);
} }
setKitEnvironment(k, mcuTarget); setKitEnvironment(k, mcuTarget, qtForMCUsSdkPackage);
setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path()); setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path());
k->setup(); k->setup();

View File

@@ -74,48 +74,62 @@ private:
QMap <McuPackage*, QWidget*> m_packageWidgets; QMap <McuPackage*, QWidget*> m_packageWidgets;
QMap <McuTarget*, QWidget*> m_mcuTargetPacketWidgets; QMap <McuTarget*, QWidget*> m_mcuTargetPacketWidgets;
QFormLayout *m_packagesLayout = nullptr; QFormLayout *m_packagesLayout = nullptr;
Utils::InfoLabel *m_infoLabel = nullptr; QGroupBox *m_qtForMCUsSdkGroupBox = nullptr;
QComboBox *m_mcuTargetComboBox = nullptr; QGroupBox *m_packagesGroupBox = nullptr;
QGroupBox *m_mcuTargetsGroupBox = nullptr;
QComboBox *m_mcuTargetsComboBox = nullptr;
QGroupBox *m_kitCreationGroupBox = nullptr;
Utils::InfoLabel *m_kitCreationInfoLabel = nullptr;
}; };
McuSupportOptionsWidget::McuSupportOptionsWidget() McuSupportOptionsWidget::McuSupportOptionsWidget()
{ {
auto mainLayout = new QVBoxLayout(this); auto mainLayout = new QVBoxLayout(this);
auto mcuTargetChooserlayout = new QHBoxLayout; m_qtForMCUsSdkGroupBox = new QGroupBox(m_options.qtForMCUsSdkPackage->label());
auto mcuTargetChooserLabel = new QLabel(tr("Target:")); m_qtForMCUsSdkGroupBox->setFlat(true);
mcuTargetChooserlayout->addWidget(mcuTargetChooserLabel); auto qtForMCUsSdkGroupBoxLayout = new QVBoxLayout(m_qtForMCUsSdkGroupBox);
m_mcuTargetComboBox = new QComboBox; qtForMCUsSdkGroupBoxLayout->addWidget(m_options.qtForMCUsSdkPackage->widget());
mcuTargetChooserLabel->setBuddy(m_mcuTargetComboBox); mainLayout->addWidget(m_qtForMCUsSdkGroupBox);
mcuTargetChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
m_mcuTargetComboBox->addItems( m_mcuTargetsGroupBox = new QGroupBox(tr("Targets supported by the %1")
.arg(m_qtForMCUsSdkGroupBox->title()));
m_mcuTargetsGroupBox->setFlat(true);
mainLayout->addWidget(m_mcuTargetsGroupBox);
auto qtForMCUsTargetsGroupBoxLayout = new QVBoxLayout(m_mcuTargetsGroupBox);
m_mcuTargetsComboBox = new QComboBox;
m_mcuTargetsComboBox->addItems(
Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){ Utils::transform<QStringList>(m_options.mcuTargets, [this](McuTarget *t){
return m_options.kitName(t); return m_options.kitName(t);
})); }));
mcuTargetChooserlayout->addWidget(m_mcuTargetComboBox); qtForMCUsTargetsGroupBoxLayout->addWidget(m_mcuTargetsComboBox);
mainLayout->addLayout(mcuTargetChooserlayout);
auto m_packagesGroupBox = new QGroupBox(tr("Packages")); m_packagesGroupBox = new QGroupBox(tr("Requirements"));
m_packagesGroupBox->setFlat(true);
mainLayout->addWidget(m_packagesGroupBox); mainLayout->addWidget(m_packagesGroupBox);
m_packagesLayout = new QFormLayout; m_packagesLayout = new QFormLayout;
m_packagesGroupBox->setLayout(m_packagesLayout); m_packagesGroupBox->setLayout(m_packagesLayout);
m_kitCreationGroupBox = new QGroupBox(tr("Create a Kit"));
m_kitCreationGroupBox->setFlat(true);
mainLayout->addWidget(m_kitCreationGroupBox);
auto kitCreationGroupBoxLayout = new QVBoxLayout(m_kitCreationGroupBox);
m_kitCreationInfoLabel = new Utils::InfoLabel;
m_kitCreationInfoLabel->setOpenExternalLinks(false);
m_kitCreationInfoLabel->setElideMode(Qt::ElideNone);
m_kitCreationInfoLabel->setWordWrap(true);
kitCreationGroupBoxLayout->addWidget(m_kitCreationInfoLabel);
mainLayout->addStretch(); mainLayout->addStretch();
m_infoLabel = new Utils::InfoLabel;
m_infoLabel->setOpenExternalLinks(false);
m_infoLabel->setElideMode(Qt::ElideNone);
m_infoLabel->setWordWrap(true);
mainLayout->addWidget(m_infoLabel);
connect(&m_options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus); connect(&m_options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus);
connect(m_mcuTargetComboBox, &QComboBox::currentTextChanged, connect(m_mcuTargetsComboBox, &QComboBox::currentTextChanged,
this, &McuSupportOptionsWidget::showMcuTargetPackages); this, &McuSupportOptionsWidget::showMcuTargetPackages);
connect(m_infoLabel, &QLabel::linkActivated, this, []{ connect(m_kitCreationInfoLabel, &QLabel::linkActivated, this, []{
Core::ICore::showOptionsDialog( Core::ICore::showOptionsDialog(
CMakeProjectManager::Constants::CMAKE_SETTINGSPAGE_ID, CMakeProjectManager::Constants::CMAKE_SETTINGSPAGE_ID,
Core::ICore::mainWindow()); Core::ICore::mainWindow());
}); });
showMcuTargetPackages(); showMcuTargetPackages();
} }
@@ -126,8 +140,13 @@ void McuSupportOptionsWidget::updateStatus()
if (!mcuTarget) if (!mcuTarget)
return; return;
m_infoLabel->setType(cMakeAvailable() && mcuTarget->isValid() m_kitCreationInfoLabel->setType(cMakeAvailable() && mcuTarget->isValid()
? Utils::InfoLabel::Ok : Utils::InfoLabel::NotOk); ? Utils::InfoLabel::Ok : Utils::InfoLabel::NotOk);
const bool sdkValid = m_options.qtForMCUsSdkPackage->status() == McuPackage::ValidPackage;
m_mcuTargetsGroupBox->setVisible(sdkValid);
m_packagesGroupBox->setVisible(sdkValid && !mcuTarget->packages().isEmpty());
m_kitCreationGroupBox->setVisible(sdkValid);
QStringList errorStrings; QStringList errorStrings;
if (!mcuTarget->isValid()) if (!mcuTarget->isValid())
@@ -136,7 +155,8 @@ void McuSupportOptionsWidget::updateStatus()
errorStrings << "No CMake tool was detected. Add a CMake tool in the " errorStrings << "No CMake tool was detected. Add a CMake tool in the "
"<a href=\"cmake\">CMake options</a> and press Apply."; "<a href=\"cmake\">CMake options</a> and press Apply.";
m_infoLabel->setText(errorStrings.isEmpty() m_kitCreationInfoLabel->setText(
errorStrings.isEmpty()
? QString::fromLatin1("A kit <b>%1</b> for the selected target can be generated. " ? QString::fromLatin1("A kit <b>%1</b> for the selected target can be generated. "
"Press Apply to generate it.").arg(m_options.kitName( "Press Apply to generate it.").arg(m_options.kitName(
mcuTarget)) mcuTarget))
@@ -168,7 +188,7 @@ void McuSupportOptionsWidget::showMcuTargetPackages()
McuTarget *McuSupportOptionsWidget::currentMcuTarget() const McuTarget *McuSupportOptionsWidget::currentMcuTarget() const
{ {
const int mcuTargetIndex = m_mcuTargetComboBox->currentIndex(); const int mcuTargetIndex = m_mcuTargetsComboBox->currentIndex();
return m_options.mcuTargets.isEmpty() ? nullptr : m_options.mcuTargets.at(mcuTargetIndex); return m_options.mcuTargets.isEmpty() ? nullptr : m_options.mcuTargets.at(mcuTargetIndex);
} }