Utils: Consolidate LayoutBuilder interface a bit

- the var args template for addItems was overkill creating a lot of
  instantiations. Use a temporary list instead.
- allow default constructed LayoutItems to be used for an empty cell,
  avoiding the use of a QLabel with empty text
- add an addRow({...}) overload as convenience shortcut for
  .startNewRow().addItems({...}
- rename startNewRow() to finishRow()

Change-Id: I6d49dacbac3d7acf140ca526884ba1ceeeca2e0d
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2020-09-18 04:54:41 +02:00
parent 7bba76d0ff
commit 2cabd2ceb5
20 changed files with 51 additions and 46 deletions

View File

@@ -414,7 +414,7 @@ void StringAspect::addToLayout(LayoutBuilder &builder)
if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Top) { if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Top) {
d->m_checker->addToLayout(builder); d->m_checker->addToLayout(builder);
builder.startNewRow(); builder.finishRow();
} }
d->m_label = new QLabel; d->m_label = new QLabel;
@@ -660,7 +660,7 @@ void SelectionAspect::addToLayout(LayoutBuilder &builder)
auto button = new QRadioButton(option.displayName); auto button = new QRadioButton(option.displayName);
button->setChecked(i == d->m_value); button->setChecked(i == d->m_value);
button->setToolTip(option.tooltip); button->setToolTip(option.tooltip);
builder.addItems(QString(), button); builder.addItems({{}, button});
d->m_buttons.append(button); d->m_buttons.append(button);
d->m_buttonGroup->addButton(button); d->m_buttonGroup->addButton(button);
connect(button, &QAbstractButton::clicked, this, [this, i] { connect(button, &QAbstractButton::clicked, this, [this, i] {
@@ -679,7 +679,7 @@ void SelectionAspect::addToLayout(LayoutBuilder &builder)
connect(d->m_comboBox.data(), QOverload<int>::of(&QComboBox::activated), this, connect(d->m_comboBox.data(), QOverload<int>::of(&QComboBox::activated), this,
[this](int index) { d->m_value = index; emit changed(); }); [this](int index) { d->m_value = index; emit changed(); });
d->m_comboBox->setCurrentIndex(d->m_value); d->m_comboBox->setCurrentIndex(d->m_value);
builder.addItems(d->m_label.data(), d->m_comboBox.data()); builder.addItems({d->m_label.data(), d->m_comboBox.data()});
break; break;
} }
} }
@@ -779,7 +779,7 @@ void IntegerAspect::addToLayout(LayoutBuilder &builder)
d->m_spinBox->setRange(int(d->m_minimumValue.toLongLong() / d->m_displayScaleFactor), d->m_spinBox->setRange(int(d->m_minimumValue.toLongLong() / d->m_displayScaleFactor),
int(d->m_maximumValue.toLongLong() / d->m_displayScaleFactor)); int(d->m_maximumValue.toLongLong() / d->m_displayScaleFactor));
builder.addItems(d->m_label.data(), d->m_spinBox.data()); builder.addItems({d->m_label.data(), d->m_spinBox.data()});
connect(d->m_spinBox.data(), QOverload<int>::of(&QSpinBox::valueChanged), connect(d->m_spinBox.data(), QOverload<int>::of(&QSpinBox::valueChanged),
this, [this](int value) { this, [this](int value) {
d->m_value = value * d->m_displayScaleFactor; d->m_value = value * d->m_displayScaleFactor;

View File

@@ -64,7 +64,7 @@ LayoutBuilder::~LayoutBuilder()
flushPendingFormItems(); flushPendingFormItems();
} }
LayoutBuilder &LayoutBuilder::startNewRow() LayoutBuilder &LayoutBuilder::finishRow()
{ {
if (m_formLayout) if (m_formLayout)
flushPendingFormItems(); flushPendingFormItems();
@@ -79,9 +79,12 @@ LayoutBuilder &LayoutBuilder::startNewRow()
LayoutBuilder &LayoutBuilder::addRow(const LayoutItem &item) LayoutBuilder &LayoutBuilder::addRow(const LayoutItem &item)
{ {
startNewRow(); return finishRow().addItem(item);
addItem(item); }
return *this;
LayoutBuilder &LayoutBuilder::addRow(const QList<LayoutBuilder::LayoutItem> &items)
{
return finishRow().addItems(items);
} }
void LayoutBuilder::flushPendingFormItems() void LayoutBuilder::flushPendingFormItems()
@@ -139,7 +142,7 @@ QLayout *LayoutBuilder::layout() const
return m_gridLayout; return m_gridLayout;
} }
LayoutBuilder &LayoutBuilder::addItem(LayoutItem item) LayoutBuilder &LayoutBuilder::addItem(const LayoutItem &item)
{ {
if (item.widget && !item.widget->parent()) if (item.widget && !item.widget->parent())
item.widget->setParent(layout()->parentWidget()); item.widget->setParent(layout()->parentWidget());
@@ -158,4 +161,11 @@ LayoutBuilder &LayoutBuilder::addItem(LayoutItem item)
return *this; return *this;
} }
LayoutBuilder &LayoutBuilder::addItems(const QList<LayoutBuilder::LayoutItem> &items)
{
for (const LayoutItem &item : items)
addItem(item);
return *this;
}
} // Utils } // Utils

View File

@@ -53,6 +53,7 @@ public:
class LayoutItem class LayoutItem
{ {
public: public:
LayoutItem() {} // For empty cells.
LayoutItem(QLayout *layout, int span = 1) : layout(layout), span(span) {} LayoutItem(QLayout *layout, int span = 1) : layout(layout), span(span) {}
LayoutItem(QWidget *widget, int span = 1, Qt::Alignment align = {}) LayoutItem(QWidget *widget, int span = 1, Qt::Alignment align = {})
: widget(widget), span(span), align(align) {} : widget(widget), span(span), align(align) {}
@@ -67,15 +68,12 @@ public:
Qt::Alignment align; Qt::Alignment align;
}; };
template<typename ...Items> LayoutBuilder &addItem(const LayoutItem &item);
LayoutBuilder &addItems(LayoutItem first, Items... rest) { LayoutBuilder &addItems(const QList<LayoutItem> &items);
return addItem(first).addItems(rest...);
}
LayoutBuilder &addItems() { return *this; }
LayoutBuilder &addItem(LayoutItem item);
LayoutBuilder &startNewRow(); LayoutBuilder &finishRow();
LayoutBuilder &addRow(const LayoutItem &item); LayoutBuilder &addRow(const LayoutItem &item);
LayoutBuilder &addRow(const QList<LayoutItem> &items);
QLayout *layout() const; QLayout *layout() const;

View File

@@ -109,7 +109,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
auto aspectWidget = new QWidget; auto aspectWidget = new QWidget;
LayoutBuilder aspectWidgetBuilder(aspectWidget); LayoutBuilder aspectWidgetBuilder(aspectWidget);
buildDirAspect->addToLayout(aspectWidgetBuilder); buildDirAspect->addToLayout(aspectWidgetBuilder);
aspectWidgetBuilder.startNewRow(); aspectWidgetBuilder.finishRow();
initialCMakeAspect->addToLayout(aspectWidgetBuilder); initialCMakeAspect->addToLayout(aspectWidgetBuilder);
mainLayout->addWidget(aspectWidget, row, 0, 1, -1); mainLayout->addWidget(aspectWidget, row, 0, 1, -1);
++row; ++row;

View File

@@ -458,7 +458,7 @@ BuildStepConfigWidget *CMakeBuildStep::createConfigWidget()
auto frame = ItemViewFind::createSearchableWrapper(buildTargetsView, auto frame = ItemViewFind::createSearchableWrapper(buildTargetsView,
ItemViewFind::LightColored); ItemViewFind::LightColored);
builder.startNewRow().addItems(tr("Targets:"), frame); builder.addRow({new QLabel(tr("Targets:")), frame});
updateDetails(); updateDetails();

View File

@@ -175,9 +175,9 @@ void CommandBuilderAspect::addToLayout(LayoutBuilder &builder)
if (!d->m_loadedFromMap) if (!d->m_loadedFromMap)
d->tryToMigrate(); d->tryToMigrate();
builder.startNewRow().addItems(d->label.data(), d->commandBuilder.data()); builder.addRow({d->label.data(), d->commandBuilder.data()});
builder.startNewRow().addItems(tr("Make command:"), d->makePathChooser.data()); builder.addRow({tr("Make command:"), d->makePathChooser.data()});
builder.startNewRow().addItems(tr("Make arguments:"), d->makeArgumentsLineEdit.data()); builder.addRow({tr("Make arguments:"), d->makeArgumentsLineEdit.data()});
updateGui(); updateGui();
} }

View File

@@ -319,7 +319,7 @@ void IosDeviceTypeAspect::addToLayout(LayoutBuilder &builder)
m_deviceTypeLabel = new QLabel(IosRunConfiguration::tr("Device type:")); m_deviceTypeLabel = new QLabel(IosRunConfiguration::tr("Device type:"));
builder.addItems(m_deviceTypeLabel, m_deviceTypeComboBox); builder.addItems({m_deviceTypeLabel, m_deviceTypeComboBox});
updateValues(); updateValues();

View File

@@ -112,7 +112,7 @@ BuildStepConfigWidget *NimbleTaskStep::createConfigWidget()
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
builder.addRow(m_taskArgs); builder.addRow(m_taskArgs);
builder.startNewRow().addItems(tr("Tasks:"), taskList); builder.addRow({tr("Tasks:"), taskList});
auto buildSystem = dynamic_cast<NimbleBuildSystem *>(this->buildSystem()); auto buildSystem = dynamic_cast<NimbleBuildSystem *>(this->buildSystem());
QTC_ASSERT(buildSystem, return widget); QTC_ASSERT(buildSystem, return widget);

View File

@@ -102,7 +102,7 @@ void BuildDirectoryAspect::addToLayout(LayoutBuilder &builder)
StringAspect::addToLayout(builder); StringAspect::addToLayout(builder);
d->problemLabel = new InfoLabel({}, InfoLabel::Warning); d->problemLabel = new InfoLabel({}, InfoLabel::Warning);
d->problemLabel->setElideMode(Qt::ElideNone); d->problemLabel->setElideMode(Qt::ElideNone);
builder.startNewRow().addItems(QString(), d->problemLabel.data()); builder.addRow({{}, d->problemLabel.data()});
updateProblemLabel(); updateProblemLabel();
if (!d->sourceDir.isEmpty()) { if (!d->sourceDir.isEmpty()) {
connect(this, &StringAspect::checkedChanged, builder.layout(), [this] { connect(this, &StringAspect::checkedChanged, builder.layout(), [this] {

View File

@@ -309,7 +309,7 @@ NamedWidget *BuildConfiguration::createConfigWidget()
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (BaseAspect *aspect : aspects()) { for (BaseAspect *aspect : aspects()) {
if (aspect->isVisible()) if (aspect->isVisible())
aspect->addToLayout(builder.startNewRow()); aspect->addToLayout(builder.finishRow());
} }
return named; return named;

View File

@@ -161,7 +161,7 @@ BuildStepConfigWidget *BuildStep::createConfigWidget()
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (BaseAspect *aspect : qAsConst(m_aspects)) { for (BaseAspect *aspect : qAsConst(m_aspects)) {
if (aspect->isVisible()) if (aspect->isVisible())
aspect->addToLayout(builder.startNewRow()); aspect->addToLayout(builder.finishRow());
} }
} }

View File

@@ -78,7 +78,7 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) :
LayoutBuilder builder(this, LayoutBuilder::GridLayout); LayoutBuilder builder(this, LayoutBuilder::GridLayout);
QLabel *label = createLabel(tr("Name:"), tr("Kit name and icon.")); QLabel *label = createLabel(tr("Name:"), tr("Kit name and icon."));
builder.startNewRow().addItems({label, 1, alignment}, m_nameEdit, m_iconButton); builder.addRow({{label, 1, alignment}, m_nameEdit, m_iconButton});
QString toolTip = QString toolTip =
tr("<html><head/><body><p>The name of the kit suitable for generating " tr("<html><head/><body><p>The name of the kit suitable for generating "
@@ -91,7 +91,7 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) :
m_fileSystemFriendlyNameLineEdit->setValidator(new QRegularExpressionValidator(fileSystemFriendlyNameRegexp, m_fileSystemFriendlyNameLineEdit)); m_fileSystemFriendlyNameLineEdit->setValidator(new QRegularExpressionValidator(fileSystemFriendlyNameRegexp, m_fileSystemFriendlyNameLineEdit));
label = createLabel(tr("File system name:"), toolTip); label = createLabel(tr("File system name:"), toolTip);
builder.startNewRow().addItems({label, 1, alignment}, m_fileSystemFriendlyNameLineEdit); builder.addRow({{label, 1, alignment}, m_fileSystemFriendlyNameLineEdit});
connect(m_fileSystemFriendlyNameLineEdit, &QLineEdit::textChanged, connect(m_fileSystemFriendlyNameLineEdit, &QLineEdit::textChanged,
this, &KitManagerConfigWidget::setFileSystemFriendlyName); this, &KitManagerConfigWidget::setFileSystemFriendlyName);
@@ -244,7 +244,7 @@ void KitManagerConfigWidget::addAspectToWorkingCopy(KitAspect *aspect)
QLabel *label = createLabel(name, toolTip); QLabel *label = createLabel(name, toolTip);
LayoutBuilder builder(layout()); LayoutBuilder builder(layout());
builder.startNewRow().addItems({label, 1, alignment}, widget->mainWidget(), widget->buttonWidget()); builder.addRow({{label, 1, alignment}, widget->mainWidget(), widget->buttonWidget()});
m_widgets.append(widget); m_widgets.append(widget);
m_labels.append(label); m_labels.append(label);
} }

View File

@@ -360,8 +360,8 @@ BuildStepConfigWidget *MakeStep::createConfigWidget()
builder.addRow(m_makeCommandAspect); builder.addRow(m_makeCommandAspect);
builder.addRow(m_userArgumentsAspect); builder.addRow(m_userArgumentsAspect);
builder.addRow(m_jobCountContainer); builder.addRow(m_jobCountContainer);
builder.startNewRow().addItems(disableInSubDirsLabel, disableInSubDirsCheckBox); builder.addRow({disableInSubDirsLabel, disableInSubDirsCheckBox});
builder.startNewRow().addItems(targetsLabel, targetsList); builder.addRow({targetsLabel, targetsList});
if (!m_disablingForSubDirsSupported) { if (!m_disablingForSubDirsSupported) {
disableInSubDirsLabel->hide(); disableInSubDirsLabel->hide();

View File

@@ -226,7 +226,7 @@ QWidget *RunConfiguration::createConfigurationWidget()
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (BaseAspect *aspect : qAsConst(m_aspects)) { for (BaseAspect *aspect : qAsConst(m_aspects)) {
if (aspect->isVisible()) if (aspect->isVisible())
aspect->addToLayout(builder.startNewRow()); aspect->addToLayout(builder.finishRow());
} }
} }

View File

@@ -69,7 +69,7 @@ void TerminalAspect::addToLayout(LayoutBuilder &builder)
QTC_CHECK(!m_checkBox); QTC_CHECK(!m_checkBox);
m_checkBox = new QCheckBox(tr("Run in terminal")); m_checkBox = new QCheckBox(tr("Run in terminal"));
m_checkBox->setChecked(m_useTerminal); m_checkBox->setChecked(m_useTerminal);
builder.addItems(QString(), m_checkBox.data()); builder.addItems({{}, m_checkBox.data()});
connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] { connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] {
m_userSet = true; m_userSet = true;
m_useTerminal = m_checkBox->isChecked(); m_useTerminal = m_checkBox->isChecked();
@@ -169,7 +169,7 @@ void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder)
m_chooser->setEnvironment(m_envAspect->environment()); m_chooser->setEnvironment(m_envAspect->environment());
} }
builder.addItems(tr("Working directory:"), m_chooser.data(), m_resetButton.data()); builder.addItems({tr("Working directory:"), m_chooser.data(), m_resetButton.data()});
} }
void WorkingDirectoryAspect::acquaintSiblings(const BaseAspects &siblings) void WorkingDirectoryAspect::acquaintSiblings(const BaseAspects &siblings)
@@ -478,7 +478,7 @@ void ExecutableAspect::addToLayout(LayoutBuilder &builder)
{ {
m_executable.addToLayout(builder); m_executable.addToLayout(builder);
if (m_alternativeExecutable) if (m_alternativeExecutable)
m_alternativeExecutable->addToLayout(builder.startNewRow()); m_alternativeExecutable->addToLayout(builder.finishRow());
} }
void ExecutableAspect::setLabelText(const QString &labelText) void ExecutableAspect::setLabelText(const QString &labelText)

View File

@@ -194,7 +194,7 @@ void InterpreterAspect::addToLayout(LayoutBuilder &builder)
Core::ICore::showOptionsDialog(Constants::C_PYTHONOPTIONS_PAGE_ID); Core::ICore::showOptionsDialog(Constants::C_PYTHONOPTIONS_PAGE_ID);
}); });
builder.addItems(tr("Interpreter"), m_comboBox.data(), manageButton); builder.addItems({tr("Interpreter"), m_comboBox.data(), manageButton});
} }
void InterpreterAspect::updateCurrentInterpreter() void InterpreterAspect::updateCurrentInterpreter()

View File

@@ -195,16 +195,13 @@ BuildStepConfigWidget *QbsInstallStep::createConfigWidget()
commandLineTextEdit->setMinimumHeight(QFontMetrics(widget->font()).height() * 8); commandLineTextEdit->setMinimumHeight(QFontMetrics(widget->font()).height() * 8);
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
builder.addItems(new QLabel(tr("Install root:")), installRootValueLabel); builder.addRow({tr("Install root:"), installRootValueLabel});
builder.addRow(tr("Flags:"));
builder.startNewRow();
builder.addItem(new QLabel(tr("Flags:")));
m_dryRun->addToLayout(builder); m_dryRun->addToLayout(builder);
m_keepGoing->addToLayout(builder); m_keepGoing->addToLayout(builder);
m_cleanInstallRoot->addToLayout(builder); m_cleanInstallRoot->addToLayout(builder);
builder.startNewRow(); builder.addRow({commandLineKeyLabel, commandLineTextEdit});
builder.addItems(commandLineKeyLabel, commandLineTextEdit);
const auto updateState = [this, commandLineTextEdit, installRootValueLabel] { const auto updateState = [this, commandLineTextEdit, installRootValueLabel] {
installRootValueLabel->setText(installRoot()); installRootValueLabel->setText(installRoot());

View File

@@ -84,7 +84,7 @@ void QmlMainFileAspect::addToLayout(Utils::LayoutBuilder &builder)
connect(m_fileListCombo, QOverload<int>::of(&QComboBox::activated), connect(m_fileListCombo, QOverload<int>::of(&QComboBox::activated),
this, &QmlMainFileAspect::setMainScript); this, &QmlMainFileAspect::setMainScript);
builder.addItems(tr("Main QML file:"), m_fileListCombo.data()); builder.addItems({tr("Main QML file:"), m_fileListCombo.data()});
} }
void QmlMainFileAspect::toMap(QVariantMap &map) const void QmlMainFileAspect::toMap(QVariantMap &map) const

View File

@@ -54,7 +54,7 @@ void QmlDebuggingAspect::addToLayout(LayoutBuilder &builder)
SelectionAspect::addToLayout(builder); SelectionAspect::addToLayout(builder);
const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning); const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning);
warningLabel->setElideMode(Qt::ElideNone); warningLabel->setElideMode(Qt::ElideNone);
builder.startNewRow().addItems(QString(), warningLabel); builder.addRow({{}, warningLabel});
const auto changeHandler = [this, warningLabel] { const auto changeHandler = [this, warningLabel] {
QString warningText; QString warningText;
const bool supported = m_kit && BaseQtVersion::isQmlDebuggingSupported(m_kit, &warningText); const bool supported = m_kit && BaseQtVersion::isQmlDebuggingSupported(m_kit, &warningText);
@@ -86,7 +86,7 @@ void QtQuickCompilerAspect::addToLayout(LayoutBuilder &builder)
SelectionAspect::addToLayout(builder); SelectionAspect::addToLayout(builder);
const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning); const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning);
warningLabel->setElideMode(Qt::ElideNone); warningLabel->setElideMode(Qt::ElideNone);
builder.startNewRow().addItems(QString(), warningLabel); builder.addRow({{}, warningLabel});
const auto changeHandler = [this, warningLabel] { const auto changeHandler = [this, warningLabel] {
QString warningText; QString warningText;
const bool supported = m_kit const bool supported = m_kit

View File

@@ -91,7 +91,7 @@ void WebBrowserSelectionAspect::addToLayout(LayoutBuilder &builder)
m_currentBrowser = selectedBrowser; m_currentBrowser = selectedBrowser;
emit changed(); emit changed();
}); });
builder.addItems(tr("Web browser:"), m_webBrowserComboBox); builder.addItems({tr("Web browser:"), m_webBrowserComboBox});
} }
void WebBrowserSelectionAspect::fromMap(const QVariantMap &map) void WebBrowserSelectionAspect::fromMap(const QVariantMap &map)