From 2cabd2ceb5ffc963acf2a9e2290973d3edde7087 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 18 Sep 2020 04:54:41 +0200 Subject: [PATCH] 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 --- src/libs/utils/aspects.cpp | 8 ++++---- src/libs/utils/layoutbuilder.cpp | 20 ++++++++++++++----- src/libs/utils/layoutbuilder.h | 12 +++++------ .../cmakebuildsettingswidget.cpp | 2 +- .../cmakeprojectmanager/cmakebuildstep.cpp | 2 +- .../incredibuild/commandbuilderaspect.cpp | 6 +++--- src/plugins/ios/iosrunconfiguration.cpp | 2 +- src/plugins/nim/project/nimbletaskstep.cpp | 2 +- src/plugins/projectexplorer/buildaspects.cpp | 2 +- .../projectexplorer/buildconfiguration.cpp | 2 +- src/plugins/projectexplorer/buildstep.cpp | 2 +- .../kitmanagerconfigwidget.cpp | 6 +++--- src/plugins/projectexplorer/makestep.cpp | 4 ++-- .../projectexplorer/runconfiguration.cpp | 2 +- .../runconfigurationaspects.cpp | 6 +++--- src/plugins/python/pythonrunconfiguration.cpp | 2 +- .../qbsprojectmanager/qbsinstallstep.cpp | 9 +++------ .../qmlprojectmanager/qmlmainfileaspect.cpp | 2 +- src/plugins/qtsupport/qtbuildaspects.cpp | 4 ++-- .../webassemblyrunconfigurationaspects.cpp | 2 +- 20 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/libs/utils/aspects.cpp b/src/libs/utils/aspects.cpp index 712d92299c8..af18717fe73 100644 --- a/src/libs/utils/aspects.cpp +++ b/src/libs/utils/aspects.cpp @@ -414,7 +414,7 @@ void StringAspect::addToLayout(LayoutBuilder &builder) if (d->m_checker && d->m_checkBoxPlacement == CheckBoxPlacement::Top) { d->m_checker->addToLayout(builder); - builder.startNewRow(); + builder.finishRow(); } d->m_label = new QLabel; @@ -660,7 +660,7 @@ void SelectionAspect::addToLayout(LayoutBuilder &builder) auto button = new QRadioButton(option.displayName); button->setChecked(i == d->m_value); button->setToolTip(option.tooltip); - builder.addItems(QString(), button); + builder.addItems({{}, button}); d->m_buttons.append(button); d->m_buttonGroup->addButton(button); connect(button, &QAbstractButton::clicked, this, [this, i] { @@ -679,7 +679,7 @@ void SelectionAspect::addToLayout(LayoutBuilder &builder) connect(d->m_comboBox.data(), QOverload::of(&QComboBox::activated), this, [this](int index) { d->m_value = index; emit changed(); }); 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; } } @@ -779,7 +779,7 @@ void IntegerAspect::addToLayout(LayoutBuilder &builder) d->m_spinBox->setRange(int(d->m_minimumValue.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::of(&QSpinBox::valueChanged), this, [this](int value) { d->m_value = value * d->m_displayScaleFactor; diff --git a/src/libs/utils/layoutbuilder.cpp b/src/libs/utils/layoutbuilder.cpp index 604711da977..af26d6f1c96 100644 --- a/src/libs/utils/layoutbuilder.cpp +++ b/src/libs/utils/layoutbuilder.cpp @@ -64,7 +64,7 @@ LayoutBuilder::~LayoutBuilder() flushPendingFormItems(); } -LayoutBuilder &LayoutBuilder::startNewRow() +LayoutBuilder &LayoutBuilder::finishRow() { if (m_formLayout) flushPendingFormItems(); @@ -79,9 +79,12 @@ LayoutBuilder &LayoutBuilder::startNewRow() LayoutBuilder &LayoutBuilder::addRow(const LayoutItem &item) { - startNewRow(); - addItem(item); - return *this; + return finishRow().addItem(item); +} + +LayoutBuilder &LayoutBuilder::addRow(const QList &items) +{ + return finishRow().addItems(items); } void LayoutBuilder::flushPendingFormItems() @@ -139,7 +142,7 @@ QLayout *LayoutBuilder::layout() const return m_gridLayout; } -LayoutBuilder &LayoutBuilder::addItem(LayoutItem item) +LayoutBuilder &LayoutBuilder::addItem(const LayoutItem &item) { if (item.widget && !item.widget->parent()) item.widget->setParent(layout()->parentWidget()); @@ -158,4 +161,11 @@ LayoutBuilder &LayoutBuilder::addItem(LayoutItem item) return *this; } +LayoutBuilder &LayoutBuilder::addItems(const QList &items) +{ + for (const LayoutItem &item : items) + addItem(item); + return *this; +} + } // Utils diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h index 35db5975be1..cd0b1467b9d 100644 --- a/src/libs/utils/layoutbuilder.h +++ b/src/libs/utils/layoutbuilder.h @@ -53,6 +53,7 @@ public: class LayoutItem { public: + LayoutItem() {} // For empty cells. LayoutItem(QLayout *layout, int span = 1) : layout(layout), span(span) {} LayoutItem(QWidget *widget, int span = 1, Qt::Alignment align = {}) : widget(widget), span(span), align(align) {} @@ -67,15 +68,12 @@ public: Qt::Alignment align; }; - template - LayoutBuilder &addItems(LayoutItem first, Items... rest) { - return addItem(first).addItems(rest...); - } - LayoutBuilder &addItems() { return *this; } - LayoutBuilder &addItem(LayoutItem item); + LayoutBuilder &addItem(const LayoutItem &item); + LayoutBuilder &addItems(const QList &items); - LayoutBuilder &startNewRow(); + LayoutBuilder &finishRow(); LayoutBuilder &addRow(const LayoutItem &item); + LayoutBuilder &addRow(const QList &items); QLayout *layout() const; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp index 26316b02ea6..716de8b7ce9 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsettingswidget.cpp @@ -109,7 +109,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) auto aspectWidget = new QWidget; LayoutBuilder aspectWidgetBuilder(aspectWidget); buildDirAspect->addToLayout(aspectWidgetBuilder); - aspectWidgetBuilder.startNewRow(); + aspectWidgetBuilder.finishRow(); initialCMakeAspect->addToLayout(aspectWidgetBuilder); mainLayout->addWidget(aspectWidget, row, 0, 1, -1); ++row; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index b8056a65228..d120623e65e 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -458,7 +458,7 @@ BuildStepConfigWidget *CMakeBuildStep::createConfigWidget() auto frame = ItemViewFind::createSearchableWrapper(buildTargetsView, ItemViewFind::LightColored); - builder.startNewRow().addItems(tr("Targets:"), frame); + builder.addRow({new QLabel(tr("Targets:")), frame}); updateDetails(); diff --git a/src/plugins/incredibuild/commandbuilderaspect.cpp b/src/plugins/incredibuild/commandbuilderaspect.cpp index 724e38d2ce7..52353791a44 100644 --- a/src/plugins/incredibuild/commandbuilderaspect.cpp +++ b/src/plugins/incredibuild/commandbuilderaspect.cpp @@ -175,9 +175,9 @@ void CommandBuilderAspect::addToLayout(LayoutBuilder &builder) if (!d->m_loadedFromMap) d->tryToMigrate(); - builder.startNewRow().addItems(d->label.data(), d->commandBuilder.data()); - builder.startNewRow().addItems(tr("Make command:"), d->makePathChooser.data()); - builder.startNewRow().addItems(tr("Make arguments:"), d->makeArgumentsLineEdit.data()); + builder.addRow({d->label.data(), d->commandBuilder.data()}); + builder.addRow({tr("Make command:"), d->makePathChooser.data()}); + builder.addRow({tr("Make arguments:"), d->makeArgumentsLineEdit.data()}); updateGui(); } diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp index 36543ca2e9c..aa3abc7b765 100644 --- a/src/plugins/ios/iosrunconfiguration.cpp +++ b/src/plugins/ios/iosrunconfiguration.cpp @@ -319,7 +319,7 @@ void IosDeviceTypeAspect::addToLayout(LayoutBuilder &builder) m_deviceTypeLabel = new QLabel(IosRunConfiguration::tr("Device type:")); - builder.addItems(m_deviceTypeLabel, m_deviceTypeComboBox); + builder.addItems({m_deviceTypeLabel, m_deviceTypeComboBox}); updateValues(); diff --git a/src/plugins/nim/project/nimbletaskstep.cpp b/src/plugins/nim/project/nimbletaskstep.cpp index ca119e891d3..baf117479d5 100644 --- a/src/plugins/nim/project/nimbletaskstep.cpp +++ b/src/plugins/nim/project/nimbletaskstep.cpp @@ -112,7 +112,7 @@ BuildStepConfigWidget *NimbleTaskStep::createConfigWidget() LayoutBuilder builder(widget); builder.addRow(m_taskArgs); - builder.startNewRow().addItems(tr("Tasks:"), taskList); + builder.addRow({tr("Tasks:"), taskList}); auto buildSystem = dynamic_cast(this->buildSystem()); QTC_ASSERT(buildSystem, return widget); diff --git a/src/plugins/projectexplorer/buildaspects.cpp b/src/plugins/projectexplorer/buildaspects.cpp index 00dea18e870..3e1805cb618 100644 --- a/src/plugins/projectexplorer/buildaspects.cpp +++ b/src/plugins/projectexplorer/buildaspects.cpp @@ -102,7 +102,7 @@ void BuildDirectoryAspect::addToLayout(LayoutBuilder &builder) StringAspect::addToLayout(builder); d->problemLabel = new InfoLabel({}, InfoLabel::Warning); d->problemLabel->setElideMode(Qt::ElideNone); - builder.startNewRow().addItems(QString(), d->problemLabel.data()); + builder.addRow({{}, d->problemLabel.data()}); updateProblemLabel(); if (!d->sourceDir.isEmpty()) { connect(this, &StringAspect::checkedChanged, builder.layout(), [this] { diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index 260f05f1c81..df9ecce5e01 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -309,7 +309,7 @@ NamedWidget *BuildConfiguration::createConfigWidget() LayoutBuilder builder(widget); for (BaseAspect *aspect : aspects()) { if (aspect->isVisible()) - aspect->addToLayout(builder.startNewRow()); + aspect->addToLayout(builder.finishRow()); } return named; diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 905667411ee..6fb97aa3766 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -161,7 +161,7 @@ BuildStepConfigWidget *BuildStep::createConfigWidget() LayoutBuilder builder(widget); for (BaseAspect *aspect : qAsConst(m_aspects)) { if (aspect->isVisible()) - aspect->addToLayout(builder.startNewRow()); + aspect->addToLayout(builder.finishRow()); } } diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index dda505e7692..24fb3857edb 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -78,7 +78,7 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : LayoutBuilder builder(this, LayoutBuilder::GridLayout); 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 = tr("

The name of the kit suitable for generating " @@ -91,7 +91,7 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : m_fileSystemFriendlyNameLineEdit->setValidator(new QRegularExpressionValidator(fileSystemFriendlyNameRegexp, m_fileSystemFriendlyNameLineEdit)); 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, this, &KitManagerConfigWidget::setFileSystemFriendlyName); @@ -244,7 +244,7 @@ void KitManagerConfigWidget::addAspectToWorkingCopy(KitAspect *aspect) QLabel *label = createLabel(name, toolTip); 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_labels.append(label); } diff --git a/src/plugins/projectexplorer/makestep.cpp b/src/plugins/projectexplorer/makestep.cpp index 885af473177..5ca170186b9 100644 --- a/src/plugins/projectexplorer/makestep.cpp +++ b/src/plugins/projectexplorer/makestep.cpp @@ -360,8 +360,8 @@ BuildStepConfigWidget *MakeStep::createConfigWidget() builder.addRow(m_makeCommandAspect); builder.addRow(m_userArgumentsAspect); builder.addRow(m_jobCountContainer); - builder.startNewRow().addItems(disableInSubDirsLabel, disableInSubDirsCheckBox); - builder.startNewRow().addItems(targetsLabel, targetsList); + builder.addRow({disableInSubDirsLabel, disableInSubDirsCheckBox}); + builder.addRow({targetsLabel, targetsList}); if (!m_disablingForSubDirsSupported) { disableInSubDirsLabel->hide(); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 8f8c8346d80..01579ccfbcb 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -226,7 +226,7 @@ QWidget *RunConfiguration::createConfigurationWidget() LayoutBuilder builder(widget); for (BaseAspect *aspect : qAsConst(m_aspects)) { if (aspect->isVisible()) - aspect->addToLayout(builder.startNewRow()); + aspect->addToLayout(builder.finishRow()); } } diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 3f44fd016d2..28f82017f29 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -69,7 +69,7 @@ void TerminalAspect::addToLayout(LayoutBuilder &builder) QTC_CHECK(!m_checkBox); m_checkBox = new QCheckBox(tr("Run in terminal")); m_checkBox->setChecked(m_useTerminal); - builder.addItems(QString(), m_checkBox.data()); + builder.addItems({{}, m_checkBox.data()}); connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] { m_userSet = true; m_useTerminal = m_checkBox->isChecked(); @@ -169,7 +169,7 @@ void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder) 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) @@ -478,7 +478,7 @@ void ExecutableAspect::addToLayout(LayoutBuilder &builder) { m_executable.addToLayout(builder); if (m_alternativeExecutable) - m_alternativeExecutable->addToLayout(builder.startNewRow()); + m_alternativeExecutable->addToLayout(builder.finishRow()); } void ExecutableAspect::setLabelText(const QString &labelText) diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp index 059dfb31068..a6d0207e501 100644 --- a/src/plugins/python/pythonrunconfiguration.cpp +++ b/src/plugins/python/pythonrunconfiguration.cpp @@ -194,7 +194,7 @@ void InterpreterAspect::addToLayout(LayoutBuilder &builder) 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() diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index 93a15a58e50..661354ad29f 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -195,16 +195,13 @@ BuildStepConfigWidget *QbsInstallStep::createConfigWidget() commandLineTextEdit->setMinimumHeight(QFontMetrics(widget->font()).height() * 8); LayoutBuilder builder(widget); - builder.addItems(new QLabel(tr("Install root:")), installRootValueLabel); - - builder.startNewRow(); - builder.addItem(new QLabel(tr("Flags:"))); + builder.addRow({tr("Install root:"), installRootValueLabel}); + builder.addRow(tr("Flags:")); m_dryRun->addToLayout(builder); m_keepGoing->addToLayout(builder); m_cleanInstallRoot->addToLayout(builder); - builder.startNewRow(); - builder.addItems(commandLineKeyLabel, commandLineTextEdit); + builder.addRow({commandLineKeyLabel, commandLineTextEdit}); const auto updateState = [this, commandLineTextEdit, installRootValueLabel] { installRootValueLabel->setText(installRoot()); diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp index cfb11e05778..2667fcb66b1 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp @@ -84,7 +84,7 @@ void QmlMainFileAspect::addToLayout(Utils::LayoutBuilder &builder) connect(m_fileListCombo, QOverload::of(&QComboBox::activated), 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 diff --git a/src/plugins/qtsupport/qtbuildaspects.cpp b/src/plugins/qtsupport/qtbuildaspects.cpp index 1874156f62c..a31c981721b 100644 --- a/src/plugins/qtsupport/qtbuildaspects.cpp +++ b/src/plugins/qtsupport/qtbuildaspects.cpp @@ -54,7 +54,7 @@ void QmlDebuggingAspect::addToLayout(LayoutBuilder &builder) SelectionAspect::addToLayout(builder); const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning); warningLabel->setElideMode(Qt::ElideNone); - builder.startNewRow().addItems(QString(), warningLabel); + builder.addRow({{}, warningLabel}); const auto changeHandler = [this, warningLabel] { QString warningText; const bool supported = m_kit && BaseQtVersion::isQmlDebuggingSupported(m_kit, &warningText); @@ -86,7 +86,7 @@ void QtQuickCompilerAspect::addToLayout(LayoutBuilder &builder) SelectionAspect::addToLayout(builder); const auto warningLabel = new Utils::InfoLabel({}, Utils::InfoLabel::Warning); warningLabel->setElideMode(Qt::ElideNone); - builder.startNewRow().addItems(QString(), warningLabel); + builder.addRow({{}, warningLabel}); const auto changeHandler = [this, warningLabel] { QString warningText; const bool supported = m_kit diff --git a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp b/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp index a12f95c10c9..27dad991b42 100644 --- a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp +++ b/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp @@ -91,7 +91,7 @@ void WebBrowserSelectionAspect::addToLayout(LayoutBuilder &builder) m_currentBrowser = selectedBrowser; emit changed(); }); - builder.addItems(tr("Web browser:"), m_webBrowserComboBox); + builder.addItems({tr("Web browser:"), m_webBrowserComboBox}); } void WebBrowserSelectionAspect::fromMap(const QVariantMap &map)