LayoutBuilder: Allow for more compact code at calling sites

Change-Id: I12bb6dbfc138e03138b9a74d36e864d8ea36092f
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-11-07 12:22:29 +01:00
parent 8e4fb05532
commit efa9832912
13 changed files with 34 additions and 52 deletions

View File

@@ -168,16 +168,12 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
QWidget *w = new QWidget; QWidget *w = new QWidget;
LayoutBuilder builder(w); LayoutBuilder builder(w);
m_cppAspect->addToLayout(builder); m_cppAspect->addToLayout(builder);
builder.startNewRow(); m_qmlAspect->addToLayout(builder.startNewRow());
m_qmlAspect->addToLayout(builder); m_overrideStartupAspect->addToLayout(builder.startNewRow());
builder.startNewRow();
m_overrideStartupAspect->addToLayout(builder);
static const QByteArray env = qgetenv("QTC_DEBUGGER_MULTIPROCESS"); static const QByteArray env = qgetenv("QTC_DEBUGGER_MULTIPROCESS");
if (env.toInt()) { if (env.toInt())
builder.startNewRow(); m_multiProcessAspect->addToLayout(builder.startNewRow());
m_multiProcessAspect->addToLayout(builder);
}
return w; return w;
}); });

View File

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

View File

@@ -185,10 +185,8 @@ NamedWidget *BuildConfiguration::createConfigWidget()
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (ProjectConfigurationAspect *aspect : aspects()) { for (ProjectConfigurationAspect *aspect : aspects()) {
if (aspect->isVisible()) { if (aspect->isVisible())
builder.startNewRow(); aspect->addToLayout(builder.startNewRow());
aspect->addToLayout(builder);
}
} }
return named; return named;

View File

@@ -152,10 +152,8 @@ BuildStepConfigWidget *BuildStep::createConfigWidget()
{ {
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (ProjectConfigurationAspect *aspect : m_aspects) { for (ProjectConfigurationAspect *aspect : m_aspects) {
if (aspect->isVisible()) { if (aspect->isVisible())
builder.startNewRow(); aspect->addToLayout(builder.startNewRow());
aspect->addToLayout(builder);
}
} }
} }

View File

@@ -126,9 +126,7 @@ CustomExecutableDialog::CustomExecutableDialog(RunConfiguration *rc)
{ {
LayoutBuilder builder(detailsWidget); LayoutBuilder builder(detailsWidget);
builder.addItem(tr("Executable:")); builder.addItems(tr("Executable:"), m_executableChooser).startNewRow();
builder.addItem(m_executableChooser);
builder.startNewRow();
m_arguments.addToLayout(builder); m_arguments.addToLayout(builder);
m_workingDirectory.addToLayout(builder); m_workingDirectory.addToLayout(builder);
m_terminal.addToLayout(builder); m_terminal.addToLayout(builder);

View File

@@ -73,9 +73,10 @@ LayoutBuilder::~LayoutBuilder()
flushPendingItems(); flushPendingItems();
} }
void LayoutBuilder::startNewRow() LayoutBuilder &LayoutBuilder::startNewRow()
{ {
flushPendingItems(); flushPendingItems();
return *this;
} }
void LayoutBuilder::flushPendingItems() void LayoutBuilder::flushPendingItems()
@@ -132,12 +133,12 @@ QLayout *LayoutBuilder::layout() const
return m_layout; return m_layout;
} }
void LayoutBuilder::addItem(LayoutItem item) LayoutBuilder &LayoutBuilder::addItem(LayoutItem item)
{ {
if (item.widget && !item.widget->parent()) if (item.widget && !item.widget->parent())
item.widget->setParent(m_layout->parentWidget()); item.widget->setParent(m_layout->parentWidget());
m_pendingItems.append(item); m_pendingItems.append(item);
return *this;
} }

View File

@@ -61,8 +61,14 @@ public:
QString text; QString text;
}; };
void addItem(LayoutItem item); template<typename ...Items>
void startNewRow(); LayoutBuilder &addItems(LayoutItem first, Items... rest) {
return addItem(first).addItems(rest...);
}
LayoutBuilder &addItems() { return *this; }
LayoutBuilder &addItem(LayoutItem item);
LayoutBuilder &startNewRow();
QLayout *layout() const; QLayout *layout() const;

View File

@@ -377,8 +377,7 @@ void BaseBoolAspect::addToLayout(LayoutBuilder &builder)
d->m_checkBox = new QCheckBox(d->m_label); d->m_checkBox = new QCheckBox(d->m_label);
d->m_checkBox->setChecked(d->m_value); d->m_checkBox->setChecked(d->m_value);
d->m_checkBox->setToolTip(d->m_tooltip); d->m_checkBox->setToolTip(d->m_tooltip);
builder.addItem(QString()); builder.addItems(QString(), d->m_checkBox.data());
builder.addItem(d->m_checkBox.data());
connect(d->m_checkBox.data(), &QAbstractButton::clicked, this, [this] { connect(d->m_checkBox.data(), &QAbstractButton::clicked, this, [this] {
d->m_value = d->m_checkBox->isChecked(); d->m_value = d->m_checkBox->isChecked();
emit changed(); emit changed();
@@ -450,8 +449,7 @@ void BaseSelectionAspect::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.addItem(QString()); builder.addItems(QString(), button);
builder.addItem(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] {
@@ -521,8 +519,7 @@ void BaseIntegerAspect::addToLayout(LayoutBuilder &builder)
if (d->m_maximumValue.isValid() && d->m_maximumValue.isValid()) if (d->m_maximumValue.isValid() && d->m_maximumValue.isValid())
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.addItem(d->m_label); builder.addItems(d->m_label, d->m_spinBox.data());
builder.addItem(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

@@ -251,10 +251,8 @@ QWidget *RunConfiguration::createConfigurationWidget()
{ {
LayoutBuilder builder(widget); LayoutBuilder builder(widget);
for (ProjectConfigurationAspect *aspect : m_aspects) { for (ProjectConfigurationAspect *aspect : m_aspects) {
if (aspect->isVisible()) { if (aspect->isVisible())
builder.startNewRow(); aspect->addToLayout(builder.startNewRow());
aspect->addToLayout(builder);
}
} }
} }

View File

@@ -68,8 +68,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.addItem(QString()); builder.addItems(QString(), m_checkBox.data());
builder.addItem(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,9 +168,7 @@ void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder)
m_chooser->setEnvironment(m_envAspect->environment()); m_chooser->setEnvironment(m_envAspect->environment());
} }
builder.addItem(tr("Working directory:")); builder.addItems(tr("Working directory:"), m_chooser.data(), m_resetButton.data());
builder.addItem(m_chooser.data());
builder.addItem(m_resetButton.data());
} }
void WorkingDirectoryAspect::acquaintSiblings(const ProjectConfigurationAspects &siblings) void WorkingDirectoryAspect::acquaintSiblings(const ProjectConfigurationAspects &siblings)
@@ -455,10 +452,8 @@ FilePath ExecutableAspect::executable() const
void ExecutableAspect::addToLayout(LayoutBuilder &builder) void ExecutableAspect::addToLayout(LayoutBuilder &builder)
{ {
m_executable.addToLayout(builder); m_executable.addToLayout(builder);
if (m_alternativeExecutable) { if (m_alternativeExecutable)
builder.startNewRow(); m_alternativeExecutable->addToLayout(builder.startNewRow());
m_alternativeExecutable->addToLayout(builder);
}
} }
void ExecutableAspect::setLabelText(const QString &labelText) void ExecutableAspect::setLabelText(const QString &labelText)

View File

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

View File

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

View File

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