CMake: Use radio buttons to select build targets

Use radio buttons to select build targets in CMakeBuildStep.

CMake only allows for one target to be built at one time, so checkboxes
are confusing.

Task-number: QTCREATORBUG-20764
Change-Id: I1171abd1753817595562526456c3ce613a22667c
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Tobias Hunger
2018-07-20 12:17:36 +02:00
parent 900ef05d37
commit 22ecd6b7ef
2 changed files with 50 additions and 17 deletions

View File

@@ -57,6 +57,7 @@
#include <QGroupBox>
#include <QLineEdit>
#include <QListWidget>
#include <QRadioButton>
using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal;
@@ -435,11 +436,20 @@ CMakeBuildStepConfigWidget::CMakeBuildStepConfigWidget(CMakeBuildStep *buildStep
connect(ProjectExplorerPlugin::instance(), &ProjectExplorerPlugin::settingsChanged,
this, &CMakeBuildStepConfigWidget::updateDetails);
connect(m_buildStep, &CMakeBuildStep::buildTargetsChanged, this, &CMakeBuildStepConfigWidget::buildTargetsChanged);
connect(m_buildStep, &CMakeBuildStep::targetToBuildChanged, this, &CMakeBuildStepConfigWidget::selectedBuildTargetsChanged);
connect(m_buildStep,
&CMakeBuildStep::buildTargetsChanged,
this,
&CMakeBuildStepConfigWidget::buildTargetsChanged);
connect(m_buildStep->buildConfiguration(), &BuildConfiguration::environmentChanged,
this, &CMakeBuildStepConfigWidget::updateDetails);
connect(m_buildStep,
&CMakeBuildStep::targetToBuildChanged,
this,
&CMakeBuildStepConfigWidget::updateBuildTarget);
connect(m_buildStep->buildConfiguration(),
&BuildConfiguration::environmentChanged,
this,
&CMakeBuildStepConfigWidget::updateDetails);
}
void CMakeBuildStepConfigWidget::toolArgumentsEdited()
@@ -459,6 +469,19 @@ void CMakeBuildStepConfigWidget::itemChanged(QListWidgetItem *item)
void CMakeBuildStepConfigWidget::buildTargetsChanged()
{
{
auto addItem = [this](const QString &buildTarget,
const QString &displayName) {
auto item = new QListWidgetItem(m_buildTargetsList);
auto button = new QRadioButton(displayName);
connect(button, &QRadioButton::toggled, this, [this, buildTarget](bool toggled) {
if (toggled) {
m_buildStep->setBuildTarget(buildTarget);
}
});
m_buildTargetsList->setItemWidget(item, button);
item->setData(Qt::UserRole, buildTarget);
};
QSignalBlocker blocker(m_buildTargetsList);
m_buildTargetsList->clear();
@@ -468,42 +491,49 @@ void CMakeBuildStepConfigWidget::buildTargetsChanged()
QFont italics;
italics.setItalic(true);
auto exeItem = new QListWidgetItem(tr(ADD_RUNCONFIGURATION_TEXT), m_buildTargetsList);
exeItem->setData(Qt::UserRole, ADD_RUNCONFIGURATION_TEXT);
addItem(ADD_RUNCONFIGURATION_TEXT, tr(ADD_RUNCONFIGURATION_TEXT));
foreach (const QString &buildTarget, targetList) {
auto item = new QListWidgetItem(buildTarget, m_buildTargetsList);
item->setData(Qt::UserRole, buildTarget);
}
foreach (const QString &buildTarget, targetList)
addItem(buildTarget, buildTarget);
for (int i = 0; i < m_buildTargetsList->count(); ++i) {
QListWidgetItem *item = m_buildTargetsList->item(i);
const QString title = item->data(Qt::UserRole).toString();
QRadioButton *radio = itemWidget(item);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
item->setCheckState(m_buildStep->buildsBuildTarget(title) ? Qt::Checked : Qt::Unchecked);
radio->setChecked(m_buildStep->buildsBuildTarget(title));
// Print utility targets in italics:
if (CMakeBuildStep::specialTargets().contains(title) || title == ADD_RUNCONFIGURATION_TEXT)
item->setFont(italics);
radio->setFont(italics);
}
}
updateDetails();
}
void CMakeBuildStepConfigWidget::selectedBuildTargetsChanged()
void CMakeBuildStepConfigWidget::updateBuildTarget()
{
const QString buildTarget = m_buildStep->buildTarget();
{
QSignalBlocker blocker(m_buildTargetsList);
for (int y = 0; y < m_buildTargetsList->count(); ++y) {
QListWidgetItem *item = m_buildTargetsList->item(y);
item->setCheckState(m_buildStep->buildsBuildTarget(item->data(Qt::UserRole).toString())
? Qt::Checked : Qt::Unchecked);
const QString itemTarget = item->data(Qt::UserRole).toString();
if (itemTarget == buildTarget) {
QRadioButton *radio = itemWidget(item);
radio->setChecked(true);
}
}
}
updateDetails();
}
QRadioButton *CMakeBuildStepConfigWidget::itemWidget(QListWidgetItem *item)
{
return static_cast<QRadioButton *>(m_buildTargetsList->itemWidget(item));
}
void CMakeBuildStepConfigWidget::updateDetails()
{
BuildConfiguration *bc = m_buildStep->buildConfiguration();