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) {
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<int>::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<int>::of(&QSpinBox::valueChanged),
this, [this](int value) {
d->m_value = value * d->m_displayScaleFactor;

View File

@@ -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<LayoutBuilder::LayoutItem> &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<LayoutBuilder::LayoutItem> &items)
{
for (const LayoutItem &item : items)
addItem(item);
return *this;
}
} // Utils

View File

@@ -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<typename ...Items>
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<LayoutItem> &items);
LayoutBuilder &startNewRow();
LayoutBuilder &finishRow();
LayoutBuilder &addRow(const LayoutItem &item);
LayoutBuilder &addRow(const QList<LayoutItem> &items);
QLayout *layout() const;

View File

@@ -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;

View File

@@ -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();

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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<NimbleBuildSystem *>(this->buildSystem());
QTC_ASSERT(buildSystem, return widget);

View File

@@ -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] {

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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("<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));
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);
}

View File

@@ -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();

View File

@@ -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());
}
}

View File

@@ -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)

View File

@@ -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()

View File

@@ -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());

View File

@@ -84,7 +84,7 @@ void QmlMainFileAspect::addToLayout(Utils::LayoutBuilder &builder)
connect(m_fileListCombo, QOverload<int>::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

View File

@@ -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

View File

@@ -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)