diff options
20 files changed, 251 insertions, 140 deletions
diff --git a/src/plugins/android/adbcommandswidget.cpp b/src/plugins/android/adbcommandswidget.cpp index 282f4c7644..4fe5c76d8c 100644 --- a/src/plugins/android/adbcommandswidget.cpp +++ b/src/plugins/android/adbcommandswidget.cpp @@ -71,9 +71,8 @@ private: friend class AdbCommandsWidget; }; -AdbCommandsWidget::AdbCommandsWidget(QWidget *parent) : - QGroupBox(parent), - d(new AdbCommandsWidgetPrivate(this)) +AdbCommandsWidget::AdbCommandsWidget() + : d(new AdbCommandsWidgetPrivate(this)) { } diff --git a/src/plugins/android/adbcommandswidget.h b/src/plugins/android/adbcommandswidget.h index 6231d4e414..4650639cc2 100644 --- a/src/plugins/android/adbcommandswidget.h +++ b/src/plugins/android/adbcommandswidget.h @@ -39,7 +39,7 @@ class AdbCommandsWidget : public QGroupBox { Q_OBJECT public: - explicit AdbCommandsWidget(QWidget *parent); + AdbCommandsWidget(); ~AdbCommandsWidget() override; QStringList commandsList() const; diff --git a/src/plugins/android/androidrunconfiguration.cpp b/src/plugins/android/androidrunconfiguration.cpp index 01b0c6050a..ac4aa5f0c0 100644 --- a/src/plugins/android/androidrunconfiguration.cpp +++ b/src/plugins/android/androidrunconfiguration.cpp @@ -62,13 +62,13 @@ BaseStringListAspect::BaseStringListAspect(const QString &settingsKey, Core::Id BaseStringListAspect::~BaseStringListAspect() = default; -void BaseStringListAspect::addToConfigurationLayout(QFormLayout *layout) +void BaseStringListAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!m_widget); - m_widget = new AdbCommandsWidget(layout->parentWidget()); + m_widget = new AdbCommandsWidget; m_widget->setCommandList(m_value); m_widget->setTitleText(m_label); - layout->addRow(m_widget); + builder.addItem(m_widget.data()); connect(m_widget.data(), &AdbCommandsWidget::commandsChanged, this, [this] { m_value = m_widget->commandsList(); emit changed(); diff --git a/src/plugins/android/androidrunconfiguration.h b/src/plugins/android/androidrunconfiguration.h index 6723048f37..5d1d32c7e5 100644 --- a/src/plugins/android/androidrunconfiguration.h +++ b/src/plugins/android/androidrunconfiguration.h @@ -43,7 +43,7 @@ public: Core::Id id = Core::Id()); ~BaseStringListAspect() override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; QStringList value() const; void setValue(const QStringList &val); diff --git a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp index b7a6c697cf..a8deb29347 100644 --- a/src/plugins/debugger/debuggerrunconfigurationaspect.cpp +++ b/src/plugins/debugger/debuggerrunconfigurationaspect.cpp @@ -62,7 +62,7 @@ class DebuggerLanguageAspect : public ProjectConfigurationAspect public: DebuggerLanguageAspect() = default; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; bool value() const; void setValue(bool val); @@ -91,35 +91,29 @@ public: std::function<void(bool)> m_clickCallBack; }; -void DebuggerLanguageAspect::addToConfigurationLayout(QFormLayout *layout) +void DebuggerLanguageAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!m_checkBox); - m_checkBox = new QCheckBox(m_label, layout->parentWidget()); + m_checkBox = new QCheckBox(m_label); m_checkBox->setChecked(m_value); QTC_CHECK(m_clickCallBack); connect(m_checkBox, &QAbstractButton::clicked, this, m_clickCallBack, Qt::QueuedConnection); - auto innerLayout = new QHBoxLayout; - innerLayout->setContentsMargins(0, 0, 0, 0); - connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] { m_value = m_checkBox->isChecked() ? EnabledLanguage : DisabledLanguage; emit changed(); }); - innerLayout->addWidget(m_checkBox); + builder.addItem(m_checkBox.data()); if (!m_infoLabelText.isEmpty()) { QTC_CHECK(!m_infoLabel); - m_infoLabel = new QLabel(m_infoLabelText, layout->parentWidget()); + m_infoLabel = new QLabel(m_infoLabelText); connect(m_infoLabel, &QLabel::linkActivated, [](const QString &link) { Core::HelpManager::showHelpUrl(link); }); - innerLayout->addWidget(m_infoLabel); + builder.addItem(m_infoLabel.data()); } - - innerLayout->addStretch(); - layout->addRow(innerLayout); } void DebuggerLanguageAspect::setAutoSettingsKey(const QString &settingsKey) @@ -172,18 +166,19 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target) setConfigWidgetCreator([this] { QWidget *w = new QWidget; - auto layout = new QFormLayout; - layout->setContentsMargins(0, 0, 0, 0); - - m_cppAspect->addToConfigurationLayout(layout); - m_qmlAspect->addToConfigurationLayout(layout); - m_overrideStartupAspect->addToConfigurationLayout(layout); + LayoutBuilder builder(w); + m_cppAspect->addToLayout(builder); + builder.startNewRow(); + m_qmlAspect->addToLayout(builder); + builder.startNewRow(); + m_overrideStartupAspect->addToLayout(builder); static const QByteArray env = qgetenv("QTC_DEBUGGER_MULTIPROCESS"); - if (env.toInt()) - m_multiProcessAspect->addToConfigurationLayout(layout); + if (env.toInt()) { + builder.startNewRow(); + m_multiProcessAspect->addToLayout(builder); + } - w->setLayout(layout); return w; }); diff --git a/src/plugins/ios/iosrunconfiguration.cpp b/src/plugins/ios/iosrunconfiguration.cpp index b49f383051..92cb1965ab 100644 --- a/src/plugins/ios/iosrunconfiguration.cpp +++ b/src/plugins/ios/iosrunconfiguration.cpp @@ -84,7 +84,7 @@ public: void fromMap(const QVariantMap &map) override; void toMap(QVariantMap &map) const override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; IosDeviceType deviceType() const; void setDeviceType(const IosDeviceType &deviceType); @@ -321,14 +321,15 @@ IosDeviceTypeAspect::IosDeviceTypeAspect(IosRunConfiguration *runConfiguration) this, &IosDeviceTypeAspect::deviceChanges); } -void IosDeviceTypeAspect::addToConfigurationLayout(QFormLayout *layout) +void IosDeviceTypeAspect::addToLayout(LayoutBuilder &builder) { - m_deviceTypeComboBox = new QComboBox(layout->parentWidget()); + m_deviceTypeComboBox = new QComboBox; m_deviceTypeComboBox->setModel(&m_deviceTypeModel); - m_deviceTypeLabel = new QLabel(IosRunConfiguration::tr("Device type:"), layout->parentWidget()); + m_deviceTypeLabel = new QLabel(IosRunConfiguration::tr("Device type:")); - layout->addRow(m_deviceTypeLabel, m_deviceTypeComboBox); + builder.addItem(m_deviceTypeLabel); + builder.addItem(m_deviceTypeComboBox); updateValues(); diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index ccf333aa21..9154360970 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -157,13 +157,12 @@ NamedWidget *BuildConfiguration::createConfigWidget() widget = named; } - auto formLayout = new QFormLayout(widget); - formLayout->setContentsMargins(0, 0, 0, 0); - formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - + LayoutBuilder builder(widget); for (ProjectConfigurationAspect *aspect : aspects()) { - if (aspect->isVisible()) - aspect->addToConfigurationLayout(formLayout); + if (aspect->isVisible()) { + builder.startNewRow(); + aspect->addToLayout(builder); + } } return named; diff --git a/src/plugins/projectexplorer/buildstep.cpp b/src/plugins/projectexplorer/buildstep.cpp index 38968fe514..97d1874e81 100644 --- a/src/plugins/projectexplorer/buildstep.cpp +++ b/src/plugins/projectexplorer/buildstep.cpp @@ -149,13 +149,14 @@ BuildStepConfigWidget *BuildStep::createConfigWidget() { auto widget = new BuildStepConfigWidget(this); - auto formLayout = new QFormLayout(widget); - formLayout->setContentsMargins(0, 0, 0, 0); - formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - - for (ProjectConfigurationAspect *aspect : m_aspects) { - if (aspect->isVisible()) - aspect->addToConfigurationLayout(formLayout); + { + LayoutBuilder builder(widget); + for (ProjectConfigurationAspect *aspect : m_aspects) { + if (aspect->isVisible()) { + builder.startNewRow(); + aspect->addToLayout(builder); + } + } } connect(buildConfiguration(), &BuildConfiguration::buildDirectoryChanged, diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 2f5e4463b7..e3dfd2f1a0 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -99,10 +99,6 @@ CustomExecutableDialog::CustomExecutableDialog(RunConfiguration *rc) auto vbox = new QVBoxLayout(this); vbox->addWidget(new QLabel(tr("Could not find the executable, please specify one."))); - auto layout = new QFormLayout; - layout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - layout->setContentsMargins(0, 0, 0, 0); - auto detailsContainer = new DetailsWidget(this); detailsContainer->setState(DetailsWidget::NoSummary); vbox->addWidget(detailsContainer); @@ -116,24 +112,27 @@ CustomExecutableDialog::CustomExecutableDialog(RunConfiguration *rc) auto detailsWidget = new QWidget(detailsContainer); detailsContainer->setWidget(detailsWidget); - detailsWidget->setLayout(layout); m_executableChooser = new PathChooser(this); m_executableChooser->setHistoryCompleter("Qt.CustomExecutable.History"); m_executableChooser->setExpectedKind(PathChooser::ExistingCommand); m_executableChooser->setPath(rc->aspect<ExecutableAspect>()->executable().toString()); - layout->addRow(tr("Executable:"), m_executableChooser); connect(m_executableChooser, &PathChooser::rawPathChanged, this, &CustomExecutableDialog::changed); copyAspect(rc->aspect<ArgumentsAspect>(), &m_arguments); - m_arguments.addToConfigurationLayout(layout); - copyAspect(rc->aspect<WorkingDirectoryAspect>(), &m_workingDirectory); - m_workingDirectory.addToConfigurationLayout(layout); - copyAspect(rc->aspect<TerminalAspect>(), &m_terminal); - m_terminal.addToConfigurationLayout(layout); + + { + LayoutBuilder builder(detailsWidget); + builder.addItem(tr("Executable:")); + builder.addItem(m_executableChooser); + builder.startNewRow(); + m_arguments.addToLayout(builder); + m_workingDirectory.addToLayout(builder); + m_terminal.addToLayout(builder); + } auto enviromentAspect = rc->aspect<EnvironmentAspect>(); connect(enviromentAspect, &EnvironmentAspect::environmentChanged, diff --git a/src/plugins/projectexplorer/projectconfiguration.cpp b/src/plugins/projectexplorer/projectconfiguration.cpp index 5ad0299034..442438fc3d 100644 --- a/src/plugins/projectexplorer/projectconfiguration.cpp +++ b/src/plugins/projectexplorer/projectconfiguration.cpp @@ -29,6 +29,9 @@ #include <utils/algorithm.h> #include <utils/qtcassert.h> +#include <QFormLayout> +#include <QWidget> + using namespace ProjectExplorer; const char CONFIGURATION_ID_KEY[] = "ProjectExplorer.ProjectConfiguration.Id"; @@ -51,6 +54,92 @@ QWidget *ProjectConfigurationAspect::createConfigWidget() const return m_configWidgetCreator ? m_configWidgetCreator() : nullptr; } +void ProjectConfigurationAspect::addToLayout(LayoutBuilder &) +{ +} + +// LayoutBuilder + +LayoutBuilder::LayoutBuilder(QWidget *parent) + : m_layout(new QFormLayout(parent)) +{ + m_layout->setContentsMargins(0, 0, 0, 0); + if (auto fl = qobject_cast<QFormLayout *>(m_layout)) + fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); +} + +LayoutBuilder::~LayoutBuilder() +{ + flushPendingItems(); +} + +void LayoutBuilder::startNewRow() +{ + flushPendingItems(); +} + +void LayoutBuilder::flushPendingItems() +{ + if (m_pendingItems.isEmpty()) + return; + + if (auto fl = qobject_cast<QFormLayout *>(m_layout)) { + // If there are more than two items, we cram the last ones in one hbox. + if (m_pendingItems.size() > 2) { + auto hbox = new QHBoxLayout; + for (int i = 1; i < m_pendingItems.size(); ++i) { + if (QWidget *w = m_pendingItems.at(i).widget) + hbox->addWidget(w); + else if (QLayout *l = m_pendingItems.at(i).layout) + hbox->addItem(l); + else + QTC_CHECK(false); + } + while (m_pendingItems.size() >= 2) + m_pendingItems.takeLast(); + m_pendingItems.append(LayoutItem(hbox)); + } + + if (m_pendingItems.size() == 1) { // One one item given, so this spans both columns. + if (auto layout = m_pendingItems.at(0).layout) + fl->addRow(layout); + else if (auto widget = m_pendingItems.at(0).widget) + fl->addRow(widget); + } else if (m_pendingItems.size() == 2) { // Normal case, both columns used. + if (auto label = m_pendingItems.at(0).widget) { + if (auto layout = m_pendingItems.at(1).layout) + fl->addRow(label, layout); + else if (auto widget = m_pendingItems.at(1).widget) + fl->addRow(label, widget); + } else { + if (auto layout = m_pendingItems.at(1).layout) + fl->addRow(m_pendingItems.at(0).text, layout); + else if (auto widget = m_pendingItems.at(1).widget) + fl->addRow(m_pendingItems.at(0).text, widget); + } + } else { + QTC_CHECK(false); + } + } else { + QTC_CHECK(false); + } + + m_pendingItems.clear(); +} + +QLayout *LayoutBuilder::layout() const +{ + return m_layout; +} + +void LayoutBuilder::addItem(LayoutItem item) +{ + if (item.widget && !item.widget->parent()) + item.widget->setParent(m_layout->parentWidget()); + + m_pendingItems.append(item); +} + // ProjectConfigurationAspects diff --git a/src/plugins/projectexplorer/projectconfiguration.h b/src/plugins/projectexplorer/projectconfiguration.h index bc6d33fce8..76b3080291 100644 --- a/src/plugins/projectexplorer/projectconfiguration.h +++ b/src/plugins/projectexplorer/projectconfiguration.h @@ -35,10 +35,7 @@ #include <QPointer> #include <QString> #include <QVariantMap> - -QT_BEGIN_NAMESPACE -class QFormLayout; -QT_END_NAMESPACE +#include <QWidget> namespace ProjectExplorer { @@ -46,6 +43,36 @@ class Project; class ProjectConfigurationAspects; class Target; +class PROJECTEXPLORER_EXPORT LayoutBuilder +{ +public: + explicit LayoutBuilder(QWidget *parent); + ~LayoutBuilder(); + + class LayoutItem + { + public: + LayoutItem(QLayout *layout) : layout(layout) {} + LayoutItem(QWidget *widget) : widget(widget) {} + LayoutItem(const QString &text) : text(text) {} + + QLayout *layout = nullptr; + QWidget *widget = nullptr; + QString text; + }; + + void addItem(LayoutItem item); + void startNewRow(); + + QLayout *layout() const; + +private: + void flushPendingItems(); + + QLayout *m_layout = nullptr; + QList<LayoutItem> m_pendingItems; +}; + class PROJECTEXPLORER_EXPORT ProjectConfigurationAspect : public QObject { Q_OBJECT @@ -71,9 +98,10 @@ public: virtual void fromMap(const QVariantMap &) {} virtual void toMap(QVariantMap &) const {} - virtual void addToConfigurationLayout(QFormLayout *) {} virtual void acquaintSiblings(const ProjectConfigurationAspects &) {} + virtual void addToLayout(LayoutBuilder &builder); + signals: void changed(); diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.cpp b/src/plugins/projectexplorer/projectconfigurationaspects.cpp index 692c5d77b9..60b1ff400b 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/projectconfigurationaspects.cpp @@ -253,20 +253,19 @@ void BaseStringAspect::setReadOnly(bool readOnly) d->m_textEditDisplay->setReadOnly(readOnly); } -void BaseStringAspect::addToConfigurationLayout(QFormLayout *layout) +void BaseStringAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!d->m_label); - QWidget *parent = layout->parentWidget(); - d->m_label = new QLabel(parent); + d->m_label = new QLabel; d->m_label->setTextInteractionFlags(Qt::TextSelectableByMouse); d->m_label->setText(d->m_labelText); if (!d->m_labelPixmap.isNull()) d->m_label->setPixmap(d->m_labelPixmap); + builder.addItem(d->m_label.data()); - auto hbox = new QHBoxLayout; switch (d->m_displayStyle) { case PathChooserDisplay: - d->m_pathChooserDisplay = new PathChooser(parent); + d->m_pathChooserDisplay = new PathChooser; d->m_pathChooserDisplay->setExpectedKind(d->m_expectedKind); if (!d->m_historyCompleterKey.isEmpty()) d->m_pathChooserDisplay->setHistoryCompleter(d->m_historyCompleterKey); @@ -275,20 +274,20 @@ void BaseStringAspect::addToConfigurationLayout(QFormLayout *layout) d->m_pathChooserDisplay->setReadOnly(d->m_readOnly); connect(d->m_pathChooserDisplay, &PathChooser::pathChanged, this, &BaseStringAspect::setValue); - hbox->addWidget(d->m_pathChooserDisplay); + builder.addItem(d->m_pathChooserDisplay.data()); break; case LineEditDisplay: - d->m_lineEditDisplay = new FancyLineEdit(parent); + d->m_lineEditDisplay = new FancyLineEdit; d->m_lineEditDisplay->setPlaceholderText(d->m_placeHolderText); if (!d->m_historyCompleterKey.isEmpty()) d->m_lineEditDisplay->setHistoryCompleter(d->m_historyCompleterKey); d->m_lineEditDisplay->setReadOnly(d->m_readOnly); connect(d->m_lineEditDisplay, &FancyLineEdit::textEdited, this, &BaseStringAspect::setValue); - hbox->addWidget(d->m_lineEditDisplay); + builder.addItem(d->m_lineEditDisplay.data()); break; case TextEditDisplay: - d->m_textEditDisplay = new QTextEdit(parent); + d->m_textEditDisplay = new QTextEdit; d->m_textEditDisplay->setPlaceholderText(d->m_placeHolderText); d->m_textEditDisplay->setReadOnly(d->m_readOnly); connect(d->m_textEditDisplay, &QTextEdit::textChanged, this, [this] { @@ -298,23 +297,17 @@ void BaseStringAspect::addToConfigurationLayout(QFormLayout *layout) emit changed(); } }); - hbox->addWidget(d->m_textEditDisplay); + builder.addItem(d->m_textEditDisplay.data()); break; case LabelDisplay: - d->m_labelDisplay = new QLabel(parent); + d->m_labelDisplay = new QLabel; d->m_labelDisplay->setTextInteractionFlags(Qt::TextSelectableByMouse); - hbox->addWidget(d->m_labelDisplay); + builder.addItem(d->m_labelDisplay.data()); break; } - if (d->m_checker) { - auto form = new QFormLayout; - form->setContentsMargins(0, 0, 0, 0); - form->setFormAlignment(Qt::AlignLeft | Qt::AlignVCenter); - d->m_checker->addToConfigurationLayout(form); - hbox->addLayout(form); - } - layout->addRow(d->m_label, hbox); + if (d->m_checker) + d->m_checker->addToLayout(builder); update(); } @@ -378,13 +371,14 @@ BaseBoolAspect::BaseBoolAspect(const QString &settingsKey) BaseBoolAspect::~BaseBoolAspect() = default; -void BaseBoolAspect::addToConfigurationLayout(QFormLayout *layout) +void BaseBoolAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!d->m_checkBox); - d->m_checkBox = new QCheckBox(d->m_label, layout->parentWidget()); + d->m_checkBox = new QCheckBox(d->m_label); d->m_checkBox->setChecked(d->m_value); d->m_checkBox->setToolTip(d->m_tooltip); - layout->addRow(QString(), d->m_checkBox); + builder.addItem(QString()); + builder.addItem(d->m_checkBox.data()); connect(d->m_checkBox.data(), &QAbstractButton::clicked, this, [this] { d->m_value = d->m_checkBox->isChecked(); emit changed(); @@ -444,7 +438,7 @@ BaseSelectionAspect::BaseSelectionAspect() BaseSelectionAspect::~BaseSelectionAspect() = default; -void BaseSelectionAspect::addToConfigurationLayout(QFormLayout *layout) +void BaseSelectionAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(d->m_buttonGroup == nullptr); d->m_buttonGroup = new QButtonGroup; @@ -453,10 +447,11 @@ void BaseSelectionAspect::addToConfigurationLayout(QFormLayout *layout) QTC_ASSERT(d->m_buttons.isEmpty(), d->m_buttons.clear()); for (int i = 0, n = d->m_options.size(); i < n; ++i) { const Internal::BaseSelectionAspectPrivate::Option &option = d->m_options.at(i); - auto button = new QRadioButton(option.displayName, layout->parentWidget()); + auto button = new QRadioButton(option.displayName); button->setChecked(i == d->m_value); button->setToolTip(option.tooltip); - layout->addRow(QString(), button); + builder.addItem(QString()); + builder.addItem(button); d->m_buttons.append(button); d->m_buttonGroup->addButton(button); connect(button, &QAbstractButton::clicked, this, [this, i] { @@ -515,10 +510,10 @@ BaseIntegerAspect::BaseIntegerAspect() BaseIntegerAspect::~BaseIntegerAspect() = default; -void BaseIntegerAspect::addToConfigurationLayout(QFormLayout *layout) +void BaseIntegerAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!d->m_spinBox); - d->m_spinBox = new QSpinBox(layout->parentWidget()); + d->m_spinBox = new QSpinBox; d->m_spinBox->setValue(int(d->m_value / d->m_displayScaleFactor)); d->m_spinBox->setDisplayIntegerBase(d->m_displayIntegerBase); d->m_spinBox->setPrefix(d->m_prefix); @@ -526,7 +521,8 @@ void BaseIntegerAspect::addToConfigurationLayout(QFormLayout *layout) if (d->m_maximumValue.isValid() && d->m_maximumValue.isValid()) d->m_spinBox->setRange(int(d->m_minimumValue.toLongLong() / d->m_displayScaleFactor), int(d->m_maximumValue.toLongLong() / d->m_displayScaleFactor)); - layout->addRow(d->m_label, d->m_spinBox); + builder.addItem(d->m_label); + builder.addItem(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; diff --git a/src/plugins/projectexplorer/projectconfigurationaspects.h b/src/plugins/projectexplorer/projectconfigurationaspects.h index 3195ad63fc..90bdcbc2bb 100644 --- a/src/plugins/projectexplorer/projectconfigurationaspects.h +++ b/src/plugins/projectexplorer/projectconfigurationaspects.h @@ -50,7 +50,7 @@ public: explicit BaseBoolAspect(const QString &settingsKey = QString()); ~BaseBoolAspect() override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; bool value() const; void setValue(bool val); @@ -76,7 +76,7 @@ public: BaseSelectionAspect(); ~BaseSelectionAspect() override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; int value() const; void setValue(int val); @@ -101,7 +101,7 @@ public: BaseStringAspect(); ~BaseStringAspect() override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; QString value() const; void setValue(const QString &val); @@ -150,7 +150,7 @@ public: BaseIntegerAspect(); ~BaseIntegerAspect() override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; qint64 value() const; void setValue(qint64 val); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 2c2394c7e3..903c6f878a 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -248,13 +248,14 @@ QString RunConfiguration::disabledReason() const QWidget *RunConfiguration::createConfigurationWidget() { auto widget = new QWidget; - auto formLayout = new QFormLayout(widget); - formLayout->setContentsMargins(0, 0, 0, 0); - formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - - for (ProjectConfigurationAspect *aspect : m_aspects) { - if (aspect->isVisible()) - aspect->addToConfigurationLayout(formLayout); + { + LayoutBuilder builder(widget); + for (ProjectConfigurationAspect *aspect : m_aspects) { + if (aspect->isVisible()) { + builder.startNewRow(); + aspect->addToLayout(builder); + } + } } Core::VariableChooser::addSupportForChildWidgets(widget, macroExpander()); diff --git a/src/plugins/projectexplorer/runconfigurationaspects.cpp b/src/plugins/projectexplorer/runconfigurationaspects.cpp index 0358dd54a5..c453bb55b6 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.cpp +++ b/src/plugins/projectexplorer/runconfigurationaspects.cpp @@ -63,12 +63,13 @@ TerminalAspect::TerminalAspect() this, &TerminalAspect::calculateUseTerminal); } -void TerminalAspect::addToConfigurationLayout(QFormLayout *layout) +void TerminalAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!m_checkBox); - m_checkBox = new QCheckBox(tr("Run in terminal"), layout->parentWidget()); + m_checkBox = new QCheckBox(tr("Run in terminal")); m_checkBox->setChecked(m_useTerminal); - layout->addRow(QString(), m_checkBox); + builder.addItem(QString()); + builder.addItem(m_checkBox.data()); connect(m_checkBox.data(), &QAbstractButton::clicked, this, [this] { m_userSet = true; m_useTerminal = m_checkBox->isChecked(); @@ -140,10 +141,10 @@ WorkingDirectoryAspect::WorkingDirectoryAspect() setSettingsKey("RunConfiguration.WorkingDirectory"); } -void WorkingDirectoryAspect::addToConfigurationLayout(QFormLayout *layout) +void WorkingDirectoryAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!m_chooser); - m_chooser = new PathChooser(layout->parentWidget()); + m_chooser = new PathChooser; m_chooser->setHistoryCompleter(settingsKey()); m_chooser->setExpectedKind(Utils::PathChooser::Directory); m_chooser->setPromptDialogTitle(tr("Select Working Directory")); @@ -155,7 +156,7 @@ void WorkingDirectoryAspect::addToConfigurationLayout(QFormLayout *layout) m_resetButton->setEnabled(m_workingDirectory != m_defaultWorkingDirectory); }); - m_resetButton = new QToolButton(layout->parentWidget()); + m_resetButton = new QToolButton; m_resetButton->setToolTip(tr("Reset to Default")); m_resetButton->setIcon(Utils::Icons::RESET.icon()); connect(m_resetButton.data(), &QAbstractButton::clicked, this, &WorkingDirectoryAspect::resetPath); @@ -168,10 +169,9 @@ void WorkingDirectoryAspect::addToConfigurationLayout(QFormLayout *layout) m_chooser->setEnvironment(m_envAspect->environment()); } - auto hbox = new QHBoxLayout; - hbox->addWidget(m_chooser); - hbox->addWidget(m_resetButton); - layout->addRow(tr("Working directory:"), hbox); + builder.addItem(tr("Working directory:")); + builder.addItem(m_chooser.data()); + builder.addItem(m_resetButton.data()); } void WorkingDirectoryAspect::acquaintSiblings(const ProjectConfigurationAspects &siblings) @@ -337,9 +337,10 @@ QWidget *ArgumentsAspect::setupChooser() return m_chooser.data(); } -void ArgumentsAspect::addToConfigurationLayout(QFormLayout *layout) +void ArgumentsAspect::addToLayout(LayoutBuilder &builder) { QTC_CHECK(!m_chooser && !m_multiLineChooser && !m_multiLineButton); + builder.addItem(tr("Command line arguments:")); const auto container = new QWidget; const auto containerLayout = new QHBoxLayout(container); @@ -371,7 +372,8 @@ void ArgumentsAspect::addToConfigurationLayout(QFormLayout *layout) }); containerLayout->addWidget(m_multiLineButton); containerLayout->setAlignment(m_multiLineButton, Qt::AlignTop); - layout->addRow(tr("Command line arguments:"), container); + + builder.addItem(container); } /*! @@ -450,11 +452,13 @@ FilePath ExecutableAspect::executable() const return m_executable.filePath(); } -void ExecutableAspect::addToConfigurationLayout(QFormLayout *layout) +void ExecutableAspect::addToLayout(LayoutBuilder &builder) { - m_executable.addToConfigurationLayout(layout); - if (m_alternativeExecutable) - m_alternativeExecutable->addToConfigurationLayout(layout); + m_executable.addToLayout(builder); + if (m_alternativeExecutable) { + builder.startNewRow(); + m_alternativeExecutable->addToLayout(builder); + } } void ExecutableAspect::setLabelText(const QString &labelText) diff --git a/src/plugins/projectexplorer/runconfigurationaspects.h b/src/plugins/projectexplorer/runconfigurationaspects.h index 2b65737789..ca41d04df8 100644 --- a/src/plugins/projectexplorer/runconfigurationaspects.h +++ b/src/plugins/projectexplorer/runconfigurationaspects.h @@ -48,7 +48,7 @@ class PROJECTEXPLORER_EXPORT TerminalAspect : public ProjectConfigurationAspect public: TerminalAspect(); - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; bool useTerminal() const; void setUseTerminalHint(bool useTerminal); @@ -74,7 +74,7 @@ class PROJECTEXPLORER_EXPORT WorkingDirectoryAspect : public ProjectConfiguratio public: WorkingDirectoryAspect(); - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; void acquaintSiblings(const ProjectConfigurationAspects &) override; Utils::FilePath workingDirectory(const Utils::MacroExpander *expander) const; @@ -104,7 +104,7 @@ class PROJECTEXPLORER_EXPORT ArgumentsAspect : public ProjectConfigurationAspect public: ArgumentsAspect(); - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; QString arguments(const Utils::MacroExpander *expander) const; QString unexpandedArguments() const; @@ -157,7 +157,7 @@ public: void setSettingsKey(const QString &key); void makeOverridable(const QString &overridingKey, const QString &useOverridableKey); - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; void setLabelText(const QString &labelText); void setPlaceHolderText(const QString &placeHolderText); void setExecutablePathStyle(Utils::OsType osType); diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp index 53245b1632..37cbc53a9a 100644 --- a/src/plugins/python/pythonrunconfiguration.cpp +++ b/src/plugins/python/pythonrunconfiguration.cpp @@ -157,7 +157,7 @@ public: void fromMap(const QVariantMap &) override; void toMap(QVariantMap &) const override; - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(LayoutBuilder &builder) override; private: void updateCurrentInterpreter(); @@ -190,26 +190,23 @@ void InterpreterAspect::toMap(QVariantMap &map) const map.insert(settingsKey(), m_currentId); } -void InterpreterAspect::addToConfigurationLayout(QFormLayout *layout) +void InterpreterAspect::addToLayout(LayoutBuilder &builder) { if (QTC_GUARD(m_comboBox.isNull())) m_comboBox = new QComboBox; updateComboBox(); - connect(m_comboBox, - &QComboBox::currentTextChanged, - this, - &InterpreterAspect::updateCurrentInterpreter); + connect(m_comboBox, &QComboBox::currentTextChanged, + this, &InterpreterAspect::updateCurrentInterpreter); auto manageButton = new QPushButton(tr("Manage...")); connect(manageButton, &QPushButton::clicked, []() { Core::ICore::showOptionsDialog(Constants::C_PYTHONOPTIONS_PAGE_ID); }); - auto rowLayout = new QHBoxLayout; - rowLayout->addWidget(m_comboBox); - rowLayout->addWidget(manageButton); - layout->addRow(tr("Interpreter"), rowLayout); + builder.addItem(tr("Interpreter")); + builder.addItem(m_comboBox.data()); + builder.addItem(manageButton); } void InterpreterAspect::updateCurrentInterpreter() diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 6e67361d11..2b093fd7af 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -82,7 +82,7 @@ public: FileInSettings }; - void addToConfigurationLayout(QFormLayout *layout) final; + void addToLayout(LayoutBuilder &builder) final; void toMap(QVariantMap &map) const final; void fromMap(const QVariantMap &map) final; @@ -117,7 +117,7 @@ MainQmlFileAspect::MainQmlFileAspect(QmlProject *project) this, [this] { changeCurrentFile(); }); } -void MainQmlFileAspect::addToConfigurationLayout(QFormLayout *layout) +void MainQmlFileAspect::addToLayout(LayoutBuilder &builder) { QTC_ASSERT(!m_fileListCombo, delete m_fileListCombo); m_fileListCombo = new QComboBox; @@ -130,7 +130,8 @@ void MainQmlFileAspect::addToConfigurationLayout(QFormLayout *layout) connect(m_fileListCombo, QOverload<int>::of(&QComboBox::activated), this, &MainQmlFileAspect::setMainScript); - layout->addRow(QmlProjectRunConfiguration::tr("Main QML file:"), m_fileListCombo); + builder.addItem(QmlProjectRunConfiguration::tr("Main QML file:")); + builder.addItem(m_fileListCombo.data()); } void MainQmlFileAspect::toMap(QVariantMap &map) const diff --git a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp b/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp index aacbc67750..49f896ce09 100644 --- a/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp +++ b/src/plugins/webassembly/webassemblyrunconfigurationaspects.cpp @@ -74,10 +74,10 @@ WebBrowserSelectionAspect::WebBrowserSelectionAspect(ProjectExplorer::Target *ta setSettingsKey("RunConfiguration.WebBrowser"); } -void WebBrowserSelectionAspect::addToConfigurationLayout(QFormLayout *layout) +void WebBrowserSelectionAspect::addToLayout(ProjectExplorer::LayoutBuilder &builder) { QTC_CHECK(!m_webBrowserComboBox); - m_webBrowserComboBox = new QComboBox(layout->parentWidget()); + m_webBrowserComboBox = new QComboBox; m_webBrowserComboBox->addItems(m_availableBrowsers); m_webBrowserComboBox->setCurrentText(m_currentBrowser); connect(m_webBrowserComboBox, &QComboBox::currentTextChanged, @@ -85,7 +85,8 @@ void WebBrowserSelectionAspect::addToConfigurationLayout(QFormLayout *layout) m_currentBrowser = selectedBrowser; emit changed(); }); - layout->addRow(tr("Web browser:"), m_webBrowserComboBox); + builder.addItem(tr("Web browser:")); + builder.addItem(m_webBrowserComboBox); } void WebBrowserSelectionAspect::fromMap(const QVariantMap &map) diff --git a/src/plugins/webassembly/webassemblyrunconfigurationaspects.h b/src/plugins/webassembly/webassemblyrunconfigurationaspects.h index 16b2d842ee..1f640f35a3 100644 --- a/src/plugins/webassembly/webassemblyrunconfigurationaspects.h +++ b/src/plugins/webassembly/webassemblyrunconfigurationaspects.h @@ -39,7 +39,7 @@ class WebBrowserSelectionAspect : public ProjectExplorer::ProjectConfigurationAs public: WebBrowserSelectionAspect(ProjectExplorer::Target *target); - void addToConfigurationLayout(QFormLayout *layout) override; + void addToLayout(ProjectExplorer::LayoutBuilder &builder) override; void fromMap(const QVariantMap &map) override; void toMap(QVariantMap &map) const override; |