Use LayoutBuilder V2

This puts the implementation introduced in acf1ecb47f into use, after
significant simplifications in the class hierarchy. CRTP is not used
anymore, and the new tag based dispatch is also used for Layout::addItem,
effectively reducing the number of different code paths.

The Lua based settings access is disabled for now.

Change-Id: Idb6d1a25675378757c5267bdb630bcd4c1f52d34
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2024-05-14 10:33:01 +02:00
parent e9b002ff7e
commit 971938421c
102 changed files with 1599 additions and 1244 deletions

View File

@@ -27,6 +27,7 @@
#include <QDebug> #include <QDebug>
#include <QGroupBox> #include <QGroupBox>
#include <QLabel> #include <QLabel>
#include <QLayout>
#include <QLineEdit> #include <QLineEdit>
#include <QListWidget> #include <QListWidget>
#include <QPaintEvent> #include <QPaintEvent>
@@ -279,14 +280,14 @@ QLabel *BaseAspect::createLabel()
return label; return label;
} }
void BaseAspect::addLabeledItem(LayoutItem &parent, QWidget *widget) void BaseAspect::addLabeledItem(Layout &parent, QWidget *widget)
{ {
if (QLabel *l = createLabel()) { if (QLabel *l = createLabel()) {
l->setBuddy(widget); l->setBuddy(widget);
parent.addItem(l); parent.addItem(l);
parent.addItem(Span(std::max(d->m_spanX - 1, 1), LayoutItem(widget))); parent.addItem(Span(std::max(d->m_spanX - 1, 1), widget));
} else { } else {
parent.addItem(LayoutItem(widget)); parent.addItem(widget);
} }
} }
@@ -532,21 +533,20 @@ AspectContainer *BaseAspect::container() const
Adds the visual representation of this aspect to the layout with the Adds the visual representation of this aspect to the layout with the
specified \a parent using a layout builder. specified \a parent using a layout builder.
*/ */
void BaseAspect::addToLayout(LayoutItem &) void BaseAspect::addToLayout(Layout &)
{ {
} }
void createItem(Layouting::LayoutItem *item, const BaseAspect &aspect) void addToLayout(Layouting::Layout *iface, BaseAspect &aspect)
{ {
const_cast<BaseAspect &>(aspect).addToLayout(*item); aspect.addToLayout(*iface);
} }
void createItem(Layouting::LayoutItem *item, const BaseAspect *aspect) void addToLayout(Layouting::Layout *item, BaseAspect *aspect)
{ {
const_cast<BaseAspect *>(aspect)->addToLayout(*item); aspect->addToLayout(*item);
} }
/*! /*!
Updates this aspect's value from user-initiated changes in the widget. Updates this aspect's value from user-initiated changes in the widget.
@@ -858,15 +858,15 @@ public:
aspect->bufferToGui(); aspect->bufferToGui();
} }
void addToLayoutFirst(LayoutItem &parent) void addToLayoutFirst(Layout &parent)
{ {
if (m_checked && m_checkBoxPlacement == CheckBoxPlacement::Top) { if (m_checked && m_checkBoxPlacement == CheckBoxPlacement::Top) {
m_checked->addToLayout(parent); m_checked->addToLayout(parent);
parent.addItem(br); parent.flush();
} }
} }
void addToLayoutLast(LayoutItem &parent) void addToLayoutLast(Layout &parent)
{ {
if (m_checked && m_checkBoxPlacement == CheckBoxPlacement::Right) if (m_checked && m_checkBoxPlacement == CheckBoxPlacement::Right)
m_checked->addToLayout(parent); m_checked->addToLayout(parent);
@@ -1140,7 +1140,7 @@ void StringAspect::setAutoApplyOnEditingFinished(bool applyOnEditingFinished)
d->m_autoApplyOnEditingFinished = applyOnEditingFinished; d->m_autoApplyOnEditingFinished = applyOnEditingFinished;
} }
void StringAspect::addToLayout(LayoutItem &parent) void StringAspect::addToLayout(Layout &parent)
{ {
d->m_checkerImpl.addToLayoutFirst(parent); d->m_checkerImpl.addToLayoutFirst(parent);
@@ -1551,7 +1551,7 @@ PathChooser *FilePathAspect::pathChooser() const
return d->m_pathChooserDisplay.data(); return d->m_pathChooserDisplay.data();
} }
void FilePathAspect::addToLayout(Layouting::LayoutItem &parent) void FilePathAspect::addToLayout(Layouting::Layout &parent)
{ {
d->m_checkerImpl.addToLayoutFirst(parent); d->m_checkerImpl.addToLayoutFirst(parent);
@@ -1769,7 +1769,7 @@ ColorAspect::ColorAspect(AspectContainer *container)
ColorAspect::~ColorAspect() = default; ColorAspect::~ColorAspect() = default;
void ColorAspect::addToLayout(Layouting::LayoutItem &parent) void ColorAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_CHECK(!d->m_colorButton); QTC_CHECK(!d->m_colorButton);
d->m_colorButton = createSubWidget<QtColorButton>(); d->m_colorButton = createSubWidget<QtColorButton>();
@@ -1946,7 +1946,7 @@ BoolAspect::BoolAspect(AspectContainer *container)
*/ */
BoolAspect::~BoolAspect() = default; BoolAspect::~BoolAspect() = default;
void BoolAspect::addToLayoutHelper(Layouting::LayoutItem &parent, QAbstractButton *button) void BoolAspect::addToLayoutHelper(Layouting::Layout &parent, QAbstractButton *button)
{ {
switch (d->m_labelPlacement) { switch (d->m_labelPlacement) {
case LabelPlacement::Compact: case LabelPlacement::Compact:
@@ -1955,7 +1955,7 @@ void BoolAspect::addToLayoutHelper(Layouting::LayoutItem &parent, QAbstractButto
break; break;
case LabelPlacement::AtCheckBox: case LabelPlacement::AtCheckBox:
button->setText(labelText()); button->setText(labelText());
parent.addItem(empty()); parent.addItem(empty);
parent.addItem(button); parent.addItem(button);
break; break;
case LabelPlacement::InExtraLabel: case LabelPlacement::InExtraLabel:
@@ -1973,20 +1973,18 @@ void BoolAspect::addToLayoutHelper(Layouting::LayoutItem &parent, QAbstractButto
}); });
} }
LayoutItem BoolAspect::adoptButton(QAbstractButton *button) std::function<void(Layouting::Layout *)> BoolAspect::adoptButton(QAbstractButton *button)
{ {
LayoutItem parent; return [this, button](Layouting::Layout *layout) {
addToLayoutHelper(*layout, button);
addToLayoutHelper(parent, button);
bufferToGui(); bufferToGui();
return parent; };
} }
/*! /*!
\reimp \reimp
*/ */
void BoolAspect::addToLayout(Layouting::LayoutItem &parent) void BoolAspect::addToLayout(Layouting::Layout &parent)
{ {
QCheckBox *checkBox = createSubWidget<QCheckBox>(); QCheckBox *checkBox = createSubWidget<QCheckBox>();
addToLayoutHelper(parent, checkBox); addToLayoutHelper(parent, checkBox);
@@ -2092,7 +2090,7 @@ SelectionAspect::~SelectionAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void SelectionAspect::addToLayout(Layouting::LayoutItem &parent) void SelectionAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_CHECK(d->m_buttonGroup == nullptr); QTC_CHECK(d->m_buttonGroup == nullptr);
QTC_CHECK(!d->m_comboBox); QTC_CHECK(!d->m_comboBox);
@@ -2266,7 +2264,7 @@ MultiSelectionAspect::~MultiSelectionAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void MultiSelectionAspect::addToLayout(LayoutItem &builder) void MultiSelectionAspect::addToLayout(Layout &builder)
{ {
QTC_CHECK(d->m_listView == nullptr); QTC_CHECK(d->m_listView == nullptr);
if (d->m_allValues.isEmpty()) if (d->m_allValues.isEmpty())
@@ -2375,7 +2373,7 @@ IntegerAspect::~IntegerAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void IntegerAspect::addToLayout(Layouting::LayoutItem &parent) void IntegerAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_CHECK(!d->m_spinBox); QTC_CHECK(!d->m_spinBox);
d->m_spinBox = createSubWidget<QSpinBox>(); d->m_spinBox = createSubWidget<QSpinBox>();
@@ -2477,7 +2475,7 @@ DoubleAspect::~DoubleAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void DoubleAspect::addToLayout(LayoutItem &builder) void DoubleAspect::addToLayout(Layout &builder)
{ {
QTC_CHECK(!d->m_spinBox); QTC_CHECK(!d->m_spinBox);
d->m_spinBox = createSubWidget<QDoubleSpinBox>(); d->m_spinBox = createSubWidget<QDoubleSpinBox>();
@@ -2634,7 +2632,7 @@ StringListAspect::~StringListAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void StringListAspect::addToLayout(LayoutItem &parent) void StringListAspect::addToLayout(Layout &parent)
{ {
Q_UNUSED(parent) Q_UNUSED(parent)
// TODO - when needed. // TODO - when needed.
@@ -2710,7 +2708,7 @@ void FilePathListAspect::bufferToGui()
d->undoable.setWithoutUndo(m_buffer); d->undoable.setWithoutUndo(m_buffer);
} }
void FilePathListAspect::addToLayout(LayoutItem &parent) void FilePathListAspect::addToLayout(Layout &parent)
{ {
d->undoable.setSilently(value()); d->undoable.setSilently(value());
@@ -2804,7 +2802,7 @@ IntegersAspect::~IntegersAspect() = default;
/*! /*!
\reimp \reimp
*/ */
void IntegersAspect::addToLayout(Layouting::LayoutItem &parent) void IntegersAspect::addToLayout(Layouting::Layout &parent)
{ {
Q_UNUSED(parent) Q_UNUSED(parent)
// TODO - when needed. // TODO - when needed.
@@ -2841,7 +2839,7 @@ TextDisplay::~TextDisplay() = default;
/*! /*!
\reimp \reimp
*/ */
void TextDisplay::addToLayout(LayoutItem &parent) void TextDisplay::addToLayout(Layout &parent)
{ {
if (!d->m_label) { if (!d->m_label) {
d->m_label = createSubWidget<InfoLabel>(d->m_message, d->m_type); d->m_label = createSubWidget<InfoLabel>(d->m_message, d->m_type);
@@ -2893,7 +2891,7 @@ public:
QList<BaseAspect *> m_items; // Both owned and non-owned. QList<BaseAspect *> m_items; // Both owned and non-owned.
QList<BaseAspect *> m_ownedItems; // Owned only. QList<BaseAspect *> m_ownedItems; // Owned only.
QStringList m_settingsGroup; QStringList m_settingsGroup;
std::function<Layouting::LayoutItem ()> m_layouter; std::function<Layouting::Layout()> m_layouter;
}; };
AspectContainer::AspectContainer() AspectContainer::AspectContainer()
@@ -2908,6 +2906,11 @@ AspectContainer::~AspectContainer()
qDeleteAll(d->m_ownedItems); qDeleteAll(d->m_ownedItems);
} }
void AspectContainer::addToLayout(Layouting::Layout &parent)
{
parent.addItem(layouter()());
}
/*! /*!
\internal \internal
*/ */
@@ -2945,12 +2948,12 @@ AspectContainer::const_iterator AspectContainer::end() const
return d->m_items.cend(); return d->m_items.cend();
} }
void AspectContainer::setLayouter(const std::function<Layouting::LayoutItem ()> &layouter) void AspectContainer::setLayouter(const std::function<Layouting::Layout ()> &layouter)
{ {
d->m_layouter = layouter; d->m_layouter = layouter;
} }
std::function<LayoutItem ()> AspectContainer::layouter() const std::function<Layout ()> AspectContainer::layouter() const
{ {
return d->m_layouter; return d->m_layouter;
} }
@@ -3447,7 +3450,7 @@ private:
int m_index; int m_index;
}; };
void AspectList::addToLayout(Layouting::LayoutItem &parent) void AspectList::addToLayout(Layouting::Layout &parent)
{ {
using namespace Layouting; using namespace Layouting;
@@ -3466,7 +3469,7 @@ void AspectList::addToLayout(Layouting::LayoutItem &parent)
addItem(d->createItem()); addItem(d->createItem());
}); });
Column column{noMargin()}; Column column{noMargin};
forEachItem<BaseAspect>([&column, this](const std::shared_ptr<BaseAspect> &item, int idx) { forEachItem<BaseAspect>([&column, this](const std::shared_ptr<BaseAspect> &item, int idx) {
auto removeBtn = new IconButton; auto removeBtn = new IconButton;
@@ -3557,7 +3560,7 @@ bool StringSelectionAspect::guiToBuffer()
return oldBuffer != m_buffer; return oldBuffer != m_buffer;
} }
void StringSelectionAspect::addToLayout(Layouting::LayoutItem &parent) void StringSelectionAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_ASSERT(m_fillCallback, return); QTC_ASSERT(m_fillCallback, return);
@@ -3630,4 +3633,4 @@ void StringSelectionAspect::addToLayout(Layouting::LayoutItem &parent)
return addLabeledItem(parent, comboBox); return addLabeledItem(parent, comboBox);
} }
} // namespace Utils } // Utils

View File

@@ -29,9 +29,7 @@ class QStandardItemModel;
class QItemSelectionModel; class QItemSelectionModel;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Layouting { namespace Layouting { class Layout; }
class LayoutItem;
}
namespace Utils { namespace Utils {
@@ -64,6 +62,7 @@ class QTCREATOR_UTILS_EXPORT BaseAspect : public QObject
public: public:
BaseAspect(AspectContainer *container = nullptr); BaseAspect(AspectContainer *container = nullptr);
BaseAspect(const BaseAspect &) = delete;
~BaseAspect() override; ~BaseAspect() override;
Id id() const; Id id() const;
@@ -125,9 +124,7 @@ public:
virtual void toMap(Store &map) const; virtual void toMap(Store &map) const;
virtual void toActiveMap(Store &map) const { toMap(map); } virtual void toActiveMap(Store &map) const { toMap(map); }
virtual void volatileToMap(Store &map) const; virtual void volatileToMap(Store &map) const;
virtual void addToLayout(Layouting::Layout &parent);
virtual void addToLayout(Layouting::LayoutItem &parent);
virtual void readSettings(); virtual void readSettings();
virtual void writeSettings() const; virtual void writeSettings() const;
@@ -223,7 +220,7 @@ protected:
virtual void handleGuiChanged(); virtual void handleGuiChanged();
QLabel *createLabel(); QLabel *createLabel();
void addLabeledItem(Layouting::LayoutItem &parent, QWidget *widget); void addLabeledItem(Layouting::Layout &parent, QWidget *widget);
void setDataCreatorHelper(const DataCreator &creator) const; void setDataCreatorHelper(const DataCreator &creator) const;
void setDataClonerHelper(const DataCloner &cloner) const; void setDataClonerHelper(const DataCloner &cloner) const;
@@ -276,8 +273,8 @@ private:
friend class Internal::CheckableAspectImplementation; friend class Internal::CheckableAspectImplementation;
}; };
QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect &aspect); QTCREATOR_UTILS_EXPORT void addToLayout(Layouting::Layout *layout, BaseAspect *aspect);
QTCREATOR_UTILS_EXPORT void createItem(Layouting::LayoutItem *item, const BaseAspect *aspect); QTCREATOR_UTILS_EXPORT void addToLayout(Layouting::Layout *layout, BaseAspect &aspect);
template<typename ValueType> template<typename ValueType>
class class
@@ -439,7 +436,7 @@ public:
BoolAspect(AspectContainer *container = nullptr); BoolAspect(AspectContainer *container = nullptr);
~BoolAspect() override; ~BoolAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
std::function<void(QObject *)> groupChecker(); std::function<void(QObject *)> groupChecker();
Utils::CheckableDecider askAgainCheckableDecider(); Utils::CheckableDecider askAgainCheckableDecider();
@@ -452,10 +449,10 @@ public:
LabelPlacement labelPlacement = LabelPlacement::InExtraLabel); LabelPlacement labelPlacement = LabelPlacement::InExtraLabel);
void setLabelPlacement(LabelPlacement labelPlacement); void setLabelPlacement(LabelPlacement labelPlacement);
Layouting::LayoutItem adoptButton(QAbstractButton *button); std::function<void(Layouting::Layout *)> adoptButton(QAbstractButton *button);
private: private:
void addToLayoutHelper(Layouting::LayoutItem &parent, QAbstractButton *button); void addToLayoutHelper(Layouting::Layout &parent, QAbstractButton *button);
void bufferToGui() override; void bufferToGui() override;
bool guiToBuffer() override; bool guiToBuffer() override;
@@ -504,7 +501,7 @@ public:
ColorAspect(AspectContainer *container = nullptr); ColorAspect(AspectContainer *container = nullptr);
~ColorAspect() override; ~ColorAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
private: private:
void bufferToGui() override; void bufferToGui() override;
@@ -521,7 +518,7 @@ public:
SelectionAspect(AspectContainer *container = nullptr); SelectionAspect(AspectContainer *container = nullptr);
~SelectionAspect() override; ~SelectionAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void finish() override; void finish() override;
QString stringValue() const; QString stringValue() const;
@@ -569,7 +566,7 @@ public:
MultiSelectionAspect(AspectContainer *container = nullptr); MultiSelectionAspect(AspectContainer *container = nullptr);
~MultiSelectionAspect() override; ~MultiSelectionAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
enum class DisplayStyle { ListView }; enum class DisplayStyle { ListView };
void setDisplayStyle(DisplayStyle style); void setDisplayStyle(DisplayStyle style);
@@ -596,7 +593,7 @@ public:
StringAspect(AspectContainer *container = nullptr); StringAspect(AspectContainer *container = nullptr);
~StringAspect() override; ~StringAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
QString operator()() const { return expandedValue(); } QString operator()() const { return expandedValue(); }
QString expandedValue() const; QString expandedValue() const;
@@ -703,7 +700,7 @@ public:
PathChooser *pathChooser() const; // Avoid to use. PathChooser *pathChooser() const; // Avoid to use.
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void fromMap(const Utils::Store &map) override; void fromMap(const Utils::Store &map) override;
void toMap(Utils::Store &map) const override; void toMap(Utils::Store &map) const override;
@@ -730,7 +727,7 @@ public:
IntegerAspect(AspectContainer *container = nullptr); IntegerAspect(AspectContainer *container = nullptr);
~IntegerAspect() override; ~IntegerAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void setRange(qint64 min, qint64 max); void setRange(qint64 min, qint64 max);
void setLabel(const QString &label); // FIXME: Use setLabelText void setLabel(const QString &label); // FIXME: Use setLabelText
@@ -759,7 +756,7 @@ public:
DoubleAspect(AspectContainer *container = nullptr); DoubleAspect(AspectContainer *container = nullptr);
~DoubleAspect() override; ~DoubleAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void setRange(double min, double max); void setRange(double min, double max);
void setPrefix(const QString &prefix); void setPrefix(const QString &prefix);
@@ -831,7 +828,7 @@ public:
StringListAspect(AspectContainer *container = nullptr); StringListAspect(AspectContainer *container = nullptr);
~StringListAspect() override; ~StringListAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void appendValue(const QString &value, bool allowDuplicates = true); void appendValue(const QString &value, bool allowDuplicates = true);
void removeValue(const QString &value); void removeValue(const QString &value);
@@ -855,7 +852,7 @@ public:
bool guiToBuffer() override; bool guiToBuffer() override;
void bufferToGui() override; void bufferToGui() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void setPlaceHolderText(const QString &placeHolderText); void setPlaceHolderText(const QString &placeHolderText);
void appendValue(const FilePath &path, bool allowDuplicates = true); void appendValue(const FilePath &path, bool allowDuplicates = true);
@@ -875,7 +872,7 @@ public:
IntegersAspect(AspectContainer *container = nullptr); IntegersAspect(AspectContainer *container = nullptr);
~IntegersAspect() override; ~IntegersAspect() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
}; };
class QTCREATOR_UTILS_EXPORT TextDisplay : public BaseAspect class QTCREATOR_UTILS_EXPORT TextDisplay : public BaseAspect
@@ -888,7 +885,7 @@ public:
InfoLabel::InfoType type = InfoLabel::None); InfoLabel::InfoType type = InfoLabel::None);
~TextDisplay() override; ~TextDisplay() override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void setIconType(InfoLabel::InfoType t); void setIconType(InfoLabel::InfoType t);
void setText(const QString &message); void setText(const QString &message);
@@ -939,6 +936,8 @@ public:
AspectContainer(const AspectContainer &) = delete; AspectContainer(const AspectContainer &) = delete;
AspectContainer &operator=(const AspectContainer &) = delete; AspectContainer &operator=(const AspectContainer &) = delete;
void addToLayout(Layouting::Layout &parent) override;
void registerAspect(BaseAspect *aspect, bool takeOwnership = false); void registerAspect(BaseAspect *aspect, bool takeOwnership = false);
void registerAspects(const AspectContainer &aspects); void registerAspects(const AspectContainer &aspects);
@@ -989,8 +988,8 @@ public:
const_iterator begin() const; const_iterator begin() const;
const_iterator end() const; const_iterator end() const;
void setLayouter(const std::function<Layouting::LayoutItem()> &layouter); void setLayouter(const std::function<Layouting::Layout()> &layouter);
std::function<Layouting::LayoutItem()> layouter() const; std::function<Layouting::Layout()> layouter() const;
signals: signals:
void applied(); void applied();
@@ -1131,7 +1130,7 @@ public:
QVariant volatileVariantValue() const override { return {}; } QVariant volatileVariantValue() const override { return {}; }
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
private: private:
std::unique_ptr<Internal::AspectListPrivate> d; std::unique_ptr<Internal::AspectListPrivate> d;
@@ -1143,7 +1142,7 @@ class QTCREATOR_UTILS_EXPORT StringSelectionAspect : public Utils::TypedAspect<Q
public: public:
StringSelectionAspect(Utils::AspectContainer *container = nullptr); StringSelectionAspect(Utils::AspectContainer *container = nullptr);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
using ResultCallback = std::function<void(QList<QStandardItem *> items)>; using ResultCallback = std::function<void(QList<QStandardItem *> items)>;
using FillCallback = std::function<void(ResultCallback)>; using FillCallback = std::function<void(ResultCallback)>;

File diff suppressed because it is too large Load Diff

View File

@@ -3,12 +3,12 @@
#pragma once #pragma once
#include <QFormLayout> #include <QMargins>
#include <QList>
#include <QString> #include <QString>
#include <QtGlobal>
#include <optional> #include <functional>
#include <initializer_list>
#include <vector>
#if defined(UTILS_LIBRARY) #if defined(UTILS_LIBRARY)
# define QTCREATOR_UTILS_EXPORT Q_DECL_EXPORT # define QTCREATOR_UTILS_EXPORT Q_DECL_EXPORT
@@ -19,251 +19,536 @@
#endif #endif
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QBoxLayout;
class QFormLayout;
class QGridLayout;
class QGroupBox;
class QHBoxLayout;
class QLabel;
class QLayout; class QLayout;
class QMargins; class QMargins;
class QObject; class QObject;
class QPushButton;
class QSpinBox;
class QSplitter;
class QStackedWidget;
class QTabWidget;
class QTextEdit;
class QToolBar;
class QVBoxLayout;
class QWidget; class QWidget;
template <class T> T qobject_cast(QObject *object);
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Layouting { namespace Layouting {
// LayoutItem class NestId {};
class LayoutBuilder; template <typename T1, typename T2>
class LayoutItem; class IdAndArg
using LayoutItems = QList<LayoutItem>; {
public:
IdAndArg(const T1 &id, const T2 &arg) : id(id), arg(arg) {}
const T1 id;
const T2 arg; // FIXME: Could be const &, but this would currently break bindTo().
};
// The main dispatcher
void doit(auto x, auto id, auto p);
template <typename X> class BuilderItem
{
public:
// Nested child object
template <typename Inner>
BuilderItem(Inner && p)
{
apply = [&p](X *x) { doit(x, NestId{}, std::forward<Inner>(p)); };
}
// Property setter
template <typename Id, typename Arg>
BuilderItem(IdAndArg<Id, Arg> && idarg)
{
apply = [&idarg](X *x) { doit(x, idarg.id, idarg.arg); };
}
std::function<void(X *)> apply;
};
//////////////////////////////////////////////
//
// Basic
//
class QTCREATOR_UTILS_EXPORT Thing
{
public:
void *ptr; // The product.
};
class QTCREATOR_UTILS_EXPORT Object : public Thing
{
public:
using Implementation = QObject;
using I = BuilderItem<Object>;
Object() = default;
Object(std::initializer_list<I> ps);
};
//
// Layouts
//
class FlowLayout;
class Layout;
using LayoutModifier = std::function<void(Layout *)>;
// using LayoutModifier = void(*)(Layout *);
class QTCREATOR_UTILS_EXPORT LayoutItem class QTCREATOR_UTILS_EXPORT LayoutItem
{ {
public: public:
using Setter = std::function<void(QObject *target)>;
LayoutItem();
~LayoutItem(); ~LayoutItem();
LayoutItem();
LayoutItem(QLayout *l) : layout(l) {}
LayoutItem(QWidget *w) : widget(w) {}
LayoutItem(const QString &t) : text(t) {}
LayoutItem(const LayoutModifier &inner);
LayoutItem(const LayoutItem &t); QString text;
LayoutItem &operator=(const LayoutItem &t) = default; QLayout *layout = nullptr;
QWidget *widget = nullptr;
template <class T> LayoutItem(const T &t) int stretch = -1;
{ int spanCols = 1;
if constexpr (std::is_base_of_v<LayoutItem, T>) int spanRows = 1;
LayoutItem::operator=(t); bool empty = false;
else LayoutModifier ownerModifier;
createItem(this, t); //Qt::Alignment align = {};
}
void attachTo(QWidget *w) const;
QWidget *emerge();
void addItem(const LayoutItem &item);
void addItems(const LayoutItems &items);
void addRow(const LayoutItems &items);
std::function<void(LayoutBuilder &)> onAdd;
std::function<void(LayoutBuilder &)> onExit;
std::function<void(QObject *target)> setter;
LayoutItems subItems;
}; };
// Special items class QTCREATOR_UTILS_EXPORT Layout : public Object
class QTCREATOR_UTILS_EXPORT Space
{ {
public: public:
explicit Space(int space) : space(space) {} using Implementation = QLayout;
const int space; using I = BuilderItem<Layout>;
Layout() = default;
Layout(Implementation *w) { ptr = w; }
void span(int cols, int rows);
void noMargin();
void normalMargin();
void customMargin(const QMargins &margin);
void setColumnStretch(int cols, int rows);
void setSpacing(int space);
void attachTo(QWidget *);
void addItem(I item);
void addItems(std::initializer_list<I> items);
void addRow(std::initializer_list<I> items);
void addLayoutItem(const LayoutItem &item);
void flush();
void flush_() const;
void fieldGrowthPolicy(int policy);
QWidget *emerge() const;
QFormLayout *asForm();
QGridLayout *asGrid();
QBoxLayout *asBox();
FlowLayout *asFlow();
// Grid-only
int currentGridColumn = 0;
int currentGridRow = 0;
//Qt::Alignment align = {};
bool useFormAlignment = false;
std::vector<LayoutItem> pendingItems;
};
class QTCREATOR_UTILS_EXPORT Column : public Layout
{
public:
using Implementation = QVBoxLayout;
using I = BuilderItem<Column>;
Column(std::initializer_list<I> ps);
};
class QTCREATOR_UTILS_EXPORT Row : public Layout
{
public:
using Implementation = QHBoxLayout;
using I = BuilderItem<Row>;
Row(std::initializer_list<I> ps);
};
class QTCREATOR_UTILS_EXPORT Form : public Layout
{
public:
using Implementation = QFormLayout;
using I = BuilderItem<Form>;
Form();
Form(std::initializer_list<I> ps);
};
class QTCREATOR_UTILS_EXPORT Grid : public Layout
{
public:
using Implementation = QGridLayout;
using I = BuilderItem<Grid>;
Grid();
Grid(std::initializer_list<I> ps);
};
class QTCREATOR_UTILS_EXPORT Flow : public Layout
{
public:
Flow(std::initializer_list<I> ps);
}; };
class QTCREATOR_UTILS_EXPORT Stretch class QTCREATOR_UTILS_EXPORT Stretch
{ {
public: public:
explicit Stretch(int stretch = 1) : stretch(stretch) {} explicit Stretch(int stretch) : stretch(stretch) {}
const int stretch;
int stretch;
};
class QTCREATOR_UTILS_EXPORT Space
{
public:
explicit Space(int space) : space(space) {}
int space;
}; };
class QTCREATOR_UTILS_EXPORT Span class QTCREATOR_UTILS_EXPORT Span
{ {
public: public:
Span(int span, const LayoutItem &item) : span(span), item(item) {} Span(int cols, const Layout::I &item);
const int span; Span(int cols, int rows, const Layout::I &item);
LayoutItem item;
Layout::I item;
int spanCols = 1;
int spanRows = 1;
}; };
class QTCREATOR_UTILS_EXPORT Column : public LayoutItem //
// Widgets
//
class QTCREATOR_UTILS_EXPORT Widget : public Object
{ {
public: public:
Column(std::initializer_list<LayoutItem> items); using Implementation = QWidget;
using I = BuilderItem<Widget>;
Widget() = default;
Widget(std::initializer_list<I> ps);
Widget(Implementation *w) { ptr = w; }
QWidget *emerge() const;
void show();
void resize(int, int);
void setLayout(const Layout &layout);
void setWindowTitle(const QString &);
void setToolTip(const QString &);
void noMargin(int = 0);
void normalMargin(int = 0);
void customMargin(const QMargins &margin);
}; };
class QTCREATOR_UTILS_EXPORT Row : public LayoutItem class QTCREATOR_UTILS_EXPORT Label : public Widget
{ {
public: public:
Row(std::initializer_list<LayoutItem> items); using Implementation = QLabel;
using I = BuilderItem<Label>;
Label(std::initializer_list<I> ps);
Label(const QString &text);
void setText(const QString &);
}; };
class QTCREATOR_UTILS_EXPORT Flow : public LayoutItem class QTCREATOR_UTILS_EXPORT Group : public Widget
{ {
public: public:
Flow(std::initializer_list<LayoutItem> items); using Implementation = QGroupBox;
using I = BuilderItem<Group>;
Group(std::initializer_list<I> ps);
void setTitle(const QString &);
void setGroupChecker(const std::function<void(QObject *)> &);
}; };
class QTCREATOR_UTILS_EXPORT Grid : public LayoutItem class QTCREATOR_UTILS_EXPORT SpinBox : public Widget
{ {
public: public:
Grid() : Grid({}) {} using Implementation = QSpinBox;
Grid(std::initializer_list<LayoutItem> items); using I = BuilderItem<SpinBox>;
SpinBox(std::initializer_list<I> ps);
void setValue(int);
void onTextChanged(const std::function<void(QString)> &);
}; };
class QTCREATOR_UTILS_EXPORT Form : public LayoutItem class QTCREATOR_UTILS_EXPORT PushButton : public Widget
{ {
public: public:
Form() : Form({}) {} using Implementation = QPushButton;
Form(std::initializer_list<LayoutItem> items); using I = BuilderItem<PushButton>;
PushButton(std::initializer_list<I> ps);
void setText(const QString &);
void onClicked(const std::function<void()> &, QObject *guard);
}; };
class QTCREATOR_UTILS_EXPORT Widget : public LayoutItem class QTCREATOR_UTILS_EXPORT TextEdit : public Widget
{ {
public: public:
Widget(std::initializer_list<LayoutItem> items); using Implementation = QTextEdit;
using I = BuilderItem<TextEdit>;
using Id = Implementation *;
TextEdit(std::initializer_list<I> ps);
void setText(const QString &);
}; };
class QTCREATOR_UTILS_EXPORT Stack : public LayoutItem class QTCREATOR_UTILS_EXPORT Splitter : public Widget
{ {
public: public:
using Implementation = QSplitter;
using I = BuilderItem<Splitter>;
Splitter(std::initializer_list<I> items);
};
class QTCREATOR_UTILS_EXPORT Stack : public Widget
{
public:
using Implementation = QStackedWidget;
using I = BuilderItem<Stack>;
Stack() : Stack({}) {} Stack() : Stack({}) {}
Stack(std::initializer_list<LayoutItem> items); Stack(std::initializer_list<I> items);
}; };
class QTCREATOR_UTILS_EXPORT Tab : public LayoutItem class QTCREATOR_UTILS_EXPORT Tab : public Widget
{ {
public: public:
Tab(const QString &tabName, const LayoutItem &item); using Implementation = QWidget;
Tab(const QString &tabName, const Layout &inner);
const QString tabName;
const Layout inner;
}; };
class QTCREATOR_UTILS_EXPORT If : public LayoutItem class QTCREATOR_UTILS_EXPORT TabWidget : public Widget
{ {
public: public:
If(bool condition, const LayoutItems &item, const LayoutItems &other = {}); using Implementation = QTabWidget;
using I = BuilderItem<TabWidget>;
TabWidget(std::initializer_list<I> items);
}; };
class QTCREATOR_UTILS_EXPORT Group : public LayoutItem class QTCREATOR_UTILS_EXPORT ToolBar : public Widget
{ {
public: public:
Group(std::initializer_list<LayoutItem> items); using Implementation = QToolBar;
using I = Layouting::BuilderItem<ToolBar>;
ToolBar(std::initializer_list<I> items);
}; };
class QTCREATOR_UTILS_EXPORT TextEdit : public LayoutItem // Special
class QTCREATOR_UTILS_EXPORT If
{ {
public: public:
TextEdit(std::initializer_list<LayoutItem> items); If(bool condition,
const std::initializer_list<Layout::I> ifcase,
const std::initializer_list<Layout::I> thencase = {});
const std::initializer_list<Layout::I> used;
}; };
class QTCREATOR_UTILS_EXPORT PushButton : public LayoutItem //
// Dispatchers
//
// We need one 'Id' (and a corresponding function wrapping arguments into a
// tuple marked by this id) per 'name' of "backend" setter member function,
// i.e. one 'text' is sufficient for QLabel::setText, QLineEdit::setText.
// The name of the Id does not have to match the backend names as it
// is mapped per-backend-type in the respective setter implementation
// but we assume that it generally makes sense to stay close to the
// wrapped API name-wise.
// These are free functions overloaded on the type of builder object
// and setter id. The function implementations are independent, but
// the base expectation is that they will forwards to the backend
// type's setter.
// Special dispatchers
class BindToId {};
template <typename T>
auto bindTo(T **p)
{ {
public: return IdAndArg{BindToId{}, p};
PushButton(std::initializer_list<LayoutItem> items); }
};
class QTCREATOR_UTILS_EXPORT SpinBox : public LayoutItem template <typename Interface>
void doit(Interface *x, BindToId, auto p)
{ {
public: *p = static_cast<typename Interface::Implementation *>(x->ptr);
SpinBox(std::initializer_list<LayoutItem> items); }
};
class QTCREATOR_UTILS_EXPORT Splitter : public LayoutItem class IdId {};
auto id(auto p) { return IdAndArg{IdId{}, p}; }
template <typename Interface>
void doit(Interface *x, IdId, auto p)
{ {
public: **p = static_cast<typename Interface::Implementation *>(x->ptr);
Splitter(std::initializer_list<LayoutItem> items); }
};
class QTCREATOR_UTILS_EXPORT ToolBar : public LayoutItem // Setter dispatchers
class SizeId {};
auto size(auto w, auto h) { return IdAndArg{SizeId{}, std::pair{w, h}}; }
void doit(auto x, SizeId, auto p) { x->resize(p->first, p->second); }
class TextId {};
auto text(auto p) { return IdAndArg{TextId{}, p}; }
void doit(auto x, TextId, auto p) { x->setText(p); }
class TitleId {};
auto title(auto p) { return IdAndArg{TitleId{}, p}; }
void doit(auto x, TitleId, auto p) { x->setTitle(p); }
class GroupCheckerId {};
auto groupChecker(auto p) { return IdAndArg{GroupCheckerId{}, p}; }
void doit(auto x, GroupCheckerId, auto p) { x->setGroupChecker(p); }
class ToolTipId {};
auto toolTip(auto p) { return IdAndArg{ToolTipId{}, p}; }
void doit(auto x, ToolTipId, auto p) { x->setToolTip(p); }
class WindowTitleId {};
auto windowTitle(auto p) { return IdAndArg{WindowTitleId{}, p}; }
void doit(auto x, WindowTitleId, auto p) { x->setWindowTitle(p); }
class OnTextChangedId {};
auto onTextChanged(auto p) { return IdAndArg{OnTextChangedId{}, p}; }
void doit(auto x, OnTextChangedId, auto p) { x->onTextChanged(p); }
class OnClickedId {};
auto onClicked(auto p, auto guard) { return IdAndArg{OnClickedId{}, std::pair{p, guard}}; }
void doit(auto x, OnClickedId, auto p) { x->onClicked(p.first, p.second); }
class CustomMarginId {};
inline auto customMargin(const QMargins &p) { return IdAndArg{CustomMarginId{}, p}; }
void doit(auto x, CustomMarginId, auto p) { x->customMargin(p); }
class FieldGrowthPolicyId {};
inline auto fieldGrowthPolicy(auto p) { return IdAndArg{FieldGrowthPolicyId{}, p}; }
void doit(auto x, FieldGrowthPolicyId, auto p) { x->fieldGrowthPolicy(p); }
class ColumnStretchId {};
inline auto columnStretch(int column, int stretch) { return IdAndArg{ColumnStretchId{}, std::pair{column, stretch}}; }
void doit(auto x, ColumnStretchId, auto p) { x->setColumnStretch(p.first, p.second); }
// Nesting dispatchers
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const Layout &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const Widget &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, QWidget *inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, QLayout *inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const LayoutModifier &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const QString &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const Space &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const Stretch &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const If &inner);
QTCREATOR_UTILS_EXPORT void addToLayout(Layout *layout, const Span &inner);
// ... can be added to anywhere later to support "user types"
QTCREATOR_UTILS_EXPORT void addToWidget(Widget *widget, const Layout &layout);
QTCREATOR_UTILS_EXPORT void addToTabWidget(TabWidget *tabWidget, const Tab &inner);
QTCREATOR_UTILS_EXPORT void addToSplitter(Splitter *splitter, QWidget *inner);
QTCREATOR_UTILS_EXPORT void addToSplitter(Splitter *splitter, const Widget &inner);
QTCREATOR_UTILS_EXPORT void addToSplitter(Splitter *splitter, const Layout &inner);
QTCREATOR_UTILS_EXPORT void addToStack(Stack *stack, QWidget *inner);
QTCREATOR_UTILS_EXPORT void addToStack(Stack *stack, const Widget &inner);
QTCREATOR_UTILS_EXPORT void addToStack(Stack *stack, const Layout &inner);
template <class Inner>
void doit_nested(Layout *outer, Inner && inner)
{ {
public: addToLayout(outer, std::forward<Inner>(inner));
ToolBar(std::initializer_list<LayoutItem> items); }
};
class QTCREATOR_UTILS_EXPORT TabWidget : public LayoutItem void doit_nested(Widget *outer, auto inner)
{ {
public: addToWidget(outer, inner);
TabWidget(std::initializer_list<LayoutItem> items); }
};
class QTCREATOR_UTILS_EXPORT Application : public LayoutItem void doit_nested(TabWidget *outer, auto inner)
{ {
public: addToTabWidget(outer, inner);
Application(std::initializer_list<LayoutItem> items); }
int exec(int &argc, char *argv[]); void doit_nested(Stack *outer, auto inner)
};
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, const std::function<void(QObject *target)> &t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, QWidget *t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, QLayout *t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, LayoutItem(*t)());
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, const QString &t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, const Span &t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, const Space &t);
void QTCREATOR_UTILS_EXPORT createItem(LayoutItem *item, const Stretch &t);
// "Singletons"
QTCREATOR_UTILS_EXPORT LayoutItem br();
QTCREATOR_UTILS_EXPORT LayoutItem st();
QTCREATOR_UTILS_EXPORT LayoutItem empty();
QTCREATOR_UTILS_EXPORT LayoutItem hr();
QTCREATOR_UTILS_EXPORT LayoutItem noMargin();
QTCREATOR_UTILS_EXPORT LayoutItem normalMargin();
QTCREATOR_UTILS_EXPORT LayoutItem customMargin(const QMargins &margin);
QTCREATOR_UTILS_EXPORT LayoutItem withFormAlignment();
// "Setters"
QTCREATOR_UTILS_EXPORT LayoutItem title(const QString &title);
QTCREATOR_UTILS_EXPORT LayoutItem text(const QString &text);
QTCREATOR_UTILS_EXPORT LayoutItem tooltip(const QString &toolTip);
QTCREATOR_UTILS_EXPORT LayoutItem resize(int, int);
QTCREATOR_UTILS_EXPORT LayoutItem columnStretch(int column, int stretch);
QTCREATOR_UTILS_EXPORT LayoutItem spacing(int);
QTCREATOR_UTILS_EXPORT LayoutItem windowTitle(const QString &windowTitle);
QTCREATOR_UTILS_EXPORT LayoutItem fieldGrowthPolicy(QFormLayout::FieldGrowthPolicy policy);
// "Getters"
class ID
{ {
public: addToStack(outer, inner);
QObject *ob = nullptr; }
};
QTCREATOR_UTILS_EXPORT LayoutItem id(ID &out); void doit_nested(Splitter *outer, auto inner)
{
addToSplitter(outer, inner);
}
QTCREATOR_UTILS_EXPORT void setText(ID id, const QString &text); template <class Inner>
void doit(auto outer, NestId, Inner && inner)
{
doit_nested(outer, std::forward<Inner>(inner));
}
// Special layout items
// "Signals" QTCREATOR_UTILS_EXPORT void empty(Layout *);
QTCREATOR_UTILS_EXPORT void br(Layout *);
QTCREATOR_UTILS_EXPORT void st(Layout *);
QTCREATOR_UTILS_EXPORT void noMargin(Layout *);
QTCREATOR_UTILS_EXPORT void normalMargin(Layout *);
QTCREATOR_UTILS_EXPORT void withFormAlignment(Layout *);
QTCREATOR_UTILS_EXPORT void hr(Layout *);
QTCREATOR_UTILS_EXPORT LayoutItem onClicked(const std::function<void()> &, QTCREATOR_UTILS_EXPORT LayoutModifier spacing(int space);
QObject *guard = nullptr);
QTCREATOR_UTILS_EXPORT LayoutItem onTextChanged(const std::function<void(const QString &)> &,
QObject *guard = nullptr);
QTCREATOR_UTILS_EXPORT LayoutItem onValueChanged(const std::function<void(int)> &,
QObject *guard = nullptr);
QTCREATOR_UTILS_EXPORT LayoutItem onTextChanged(ID &id, QVariant(*sig)(QObject *));
// Convenience // Convenience
QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr); QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr);
template <class T>
LayoutItem bindTo(T **out)
{
return [out](QObject *target) { *out = qobject_cast<T *>(target); };
}
} // Layouting } // Layouting

View File

@@ -110,7 +110,8 @@ ProjectIntroPage::ProjectIntroPage(QWidget *parent) :
using namespace Layouting; using namespace Layouting;
Form { Form {
Tr::tr("Name:"), d->m_nameLineEdit, br, Tr::tr("Name:"), d->m_nameLineEdit,
br,
d->m_projectLabel, d->m_projectComboBox, br, d->m_projectLabel, d->m_projectComboBox, br,
Column { Space(12) }, br, Column { Space(12) }, br,
Tr::tr("Create in:"), d->m_pathChooser, br, Tr::tr("Create in:"), d->m_pathChooser, br,

View File

@@ -43,15 +43,15 @@ CTestTool::CTestTool()
outputMode, br, outputMode, br,
Group { Group {
title(Tr::tr("Repeat Tests")), title(Tr::tr("Repeat Tests")),
repeat.groupChecker(), groupChecker(repeat.groupChecker()),
Row { repetitionMode, repetitionCount}, Row { repetitionMode, repetitionCount},
}, br, }, br,
Group { Group {
title(Tr::tr("Run in Parallel")), title(Tr::tr("Run in Parallel")),
parallel.groupChecker(), groupChecker(parallel.groupChecker()),
Column { Column {
Row { jobs }, br, Row { jobs }, br,
Row { testLoad, threshold} Row { testLoad, threshold }
} }
} }
}, st }; }, st };

View File

@@ -92,13 +92,13 @@ ProjectTestSettingsWidget::ProjectTestSettingsWidget(Project *project)
m_runAfterBuild, m_runAfterBuild,
st, st,
}, },
noMargin(), noMargin,
}, },
}, },
Row { // explicitly outside of the global settings Row { // explicitly outside of the global settings
Group { Group {
title(Tr::tr("Limit Files to Path Patterns")), title(Tr::tr("Limit Files to Path Patterns")),
m_applyFilter.groupChecker(), groupChecker(m_applyFilter.groupChecker()),
Column { Column {
filterLabel, filterLabel,
Row { Row {
@@ -108,7 +108,7 @@ ProjectTestSettingsWidget::ProjectTestSettingsWidget(Project *project)
}, },
}, },
}, },
noMargin(), noMargin,
}.attachTo(this); }.attachTo(this);
// clang-format on // clang-format on

View File

@@ -75,7 +75,7 @@ TestSettingsWidget::TestSettingsWidget()
PushButton resetChoicesButton { PushButton resetChoicesButton {
text(Tr::tr("Reset Cached Choices")), text(Tr::tr("Reset Cached Choices")),
tooltip(Tr::tr("Clear all cached choices of run configurations for " Layouting::toolTip(Tr::tr("Clear all cached choices of run configurations for "
"tests where the executable could not be deduced.")), "tests where the executable could not be deduced.")),
onClicked(&clearChoiceCache, this) onClicked(&clearChoiceCache, this)
}; };

View File

@@ -270,7 +270,8 @@ public:
title(Tr::tr("Options")), title(Tr::tr("Options")),
bindTo(&options), bindTo(&options),
Form { Form {
s.usePredefinedStyle.adoptButton(predefinedStyleButton), predefinedBlob, br, s.usePredefinedStyle.adoptButton(predefinedStyleButton),
predefinedBlob, br,
customizedStyleButton, configurations, customizedStyleButton, configurations,
}, },
}, },

View File

@@ -50,7 +50,7 @@ GeneralSettings::GeneralSettings()
return Column { return Column {
Group { Group {
title(Tr::tr("Automatic Formatting on File Save")), title(Tr::tr("Automatic Formatting on File Save")),
autoFormatOnSave.groupChecker(), groupChecker(autoFormatOnSave.groupChecker()),
Form { Form {
autoFormatTools, br, autoFormatTools, br,
autoFormatMime, br, autoFormatMime, br,

View File

@@ -26,6 +26,7 @@
#include <QCheckBox> #include <QCheckBox>
#include <QComboBox> #include <QComboBox>
#include <QGroupBox>
#include <QLabel> #include <QLabel>
#include <QSpinBox> #include <QSpinBox>

View File

@@ -342,7 +342,7 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc)
Column { Column {
cmakeConfiguration, cmakeConfiguration,
Row { Row {
bc->initialCMakeArguments, br, bc->initialCMakeArguments,
bc->additionalCMakeOptions bc->additionalCMakeOptions
}, },
m_reconfigureButton, m_reconfigureButton,

View File

@@ -600,7 +600,7 @@ QWidget *CMakeBuildStep::createConfigWidget()
if (!isCleanStep() && !m_buildPreset.isEmpty()) if (!isCleanStep() && !m_buildPreset.isEmpty())
createAndAddEnvironmentWidgets(builder); createAndAddEnvironmentWidgets(builder);
builder.addItem(Layouting::noMargin); builder.noMargin();
auto widget = builder.emerge(); auto widget = builder.emerge();
updateDetails(); updateDetails();

View File

@@ -79,7 +79,7 @@ public:
Space(10), Space(10),
Group { Group {
title(Tr::tr("Automatic Formatting on File Save")), title(Tr::tr("Automatic Formatting on File Save")),
autoFormatOnSave.groupChecker(), groupChecker(autoFormatOnSave.groupChecker()),
// Conceptually, that's a Form, but this would look odd: // Conceptually, that's a Form, but this would look odd:
// xxxxxx [____] // xxxxxx [____]
// [x] xxxxxxxxxxxxxx // [x] xxxxxxxxxxxxxx

View File

@@ -148,7 +148,7 @@ private:
// KitAspectWidget interface // KitAspectWidget interface
void makeReadOnly() override { m_comboBox->setEnabled(false); } void makeReadOnly() override { m_comboBox->setEnabled(false); }
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
builder.addItem(m_comboBox); builder.addItem(m_comboBox);
@@ -376,7 +376,7 @@ private:
// KitAspectWidget interface // KitAspectWidget interface
void makeReadOnly() override { m_changeButton->setEnabled(false); } void makeReadOnly() override { m_changeButton->setEnabled(false); }
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_label); addMutableAction(m_label);
parent.addItem(m_label); parent.addItem(m_label);
@@ -875,7 +875,7 @@ public:
private: private:
// KitAspectWidget interface // KitAspectWidget interface
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_summaryLabel); addMutableAction(m_summaryLabel);
parent.addItem(m_summaryLabel); parent.addItem(m_summaryLabel);

View File

@@ -91,7 +91,7 @@ void LibrarySelectionAspect::setVariantValue(const QVariant &value, Announcement
setValue(map, howToAnnounce); setValue(map, howToAnnounce);
} }
void LibrarySelectionAspect::addToLayout(Layouting::LayoutItem &parent) void LibrarySelectionAspect::addToLayout(Layouting::Layout &parent)
{ {
using namespace Layouting; using namespace Layouting;
@@ -223,12 +223,12 @@ void LibrarySelectionAspect::addToLayout(Layouting::LayoutItem &parent)
// clang-format off // clang-format off
QStackedWidget *stack = static_cast<QStackedWidget*>( QStackedWidget *stack = static_cast<QStackedWidget*>(
Stack { Stack {
noMargin,
Row { noMargin, displayLabel, editBtn }, Row { noMargin, displayLabel, editBtn },
Row { noMargin, nameCombo, versionCombo, clearBtn } Row { noMargin, nameCombo, versionCombo, clearBtn }
}.emerge() }.emerge()
); );
// clang-format on // clang-format on
stack->setContentsMargins({});
connect(editBtn, &QPushButton::clicked, stack, [stack] { stack->setCurrentIndex(1); }); connect(editBtn, &QPushButton::clicked, stack, [stack] { stack->setCurrentIndex(1); });
connect(this, &LibrarySelectionAspect::returnToDisplay, stack, [stack] { connect(this, &LibrarySelectionAspect::returnToDisplay, stack, [stack] {
stack->setCurrentIndex(0); stack->setCurrentIndex(0);

View File

@@ -68,7 +68,7 @@ public:
LibrarySelectionAspect(Utils::AspectContainer *container = nullptr); LibrarySelectionAspect(Utils::AspectContainer *container = nullptr);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
using ResultCallback = std::function<void(QList<QStandardItem *>)>; using ResultCallback = std::function<void(QList<QStandardItem *>)>;
using FillCallback = std::function<void(ResultCallback)>; using FillCallback = std::function<void(ResultCallback)>;

View File

@@ -264,7 +264,7 @@ SourceEditorWidget::SourceEditorWidget(const std::shared_ptr<SourceSettings> &se
Column { Column {
toolBar, toolBar,
m_codeEditor, m_codeEditor,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
// clang-format on // clang-format on
@@ -370,7 +370,6 @@ CompilerWidget::CompilerWidget(const std::shared_ptr<SourceSettings> &sourceSett
connect(m_asmEditor, &AsmEditorWidget::gotFocus, this, &CompilerWidget::gotFocus); connect(m_asmEditor, &AsmEditorWidget::gotFocus, this, &CompilerWidget::gotFocus);
auto advButton = new QToolButton; auto advButton = new QToolButton;
QSplitter *splitter{nullptr};
auto advDlg = new QAction; auto advDlg = new QAction;
advDlg->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon()); advDlg->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon());
@@ -400,7 +399,6 @@ CompilerWidget::CompilerWidget(const std::shared_ptr<SourceSettings> &sourceSett
}); });
// clang-format off // clang-format off
Row { Row {
m_compilerSettings->compiler, m_compilerSettings->compiler,
advButton, advButton,
@@ -411,11 +409,10 @@ CompilerWidget::CompilerWidget(const std::shared_ptr<SourceSettings> &sourceSett
Column { Column {
toolBar, toolBar,
Splitter { Splitter {
bindTo(&splitter),
m_asmEditor, m_asmEditor,
createTerminal() createTerminal()
}, },
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
// clang-format on // clang-format on

View File

@@ -461,7 +461,7 @@ FancyTabWidget::FancyTabWidget(QWidget *parent)
QVBoxLayout *vlayout; QVBoxLayout *vlayout;
using namespace Layouting; using namespace Layouting;
Row { fancyButton, noMargin() }.attachTo(bar); Row { fancyButton, noMargin }.attachTo(bar);
Row { Row {
Widget { Widget {
bindTo(&m_selectionWidget), bindTo(&m_selectionWidget),
@@ -471,13 +471,13 @@ FancyTabWidget::FancyTabWidget(QWidget *parent)
st, st,
Widget { Widget {
bindTo(&m_cornerWidgetContainer), bindTo(&m_cornerWidgetContainer),
Column { st, spacing(0), noMargin() }, Column { st, spacing(0), noMargin },
}, },
spacing(0), noMargin(), spacing(0), noMargin,
}, },
}, },
Column { bindTo(&vlayout), m_modesStack, m_statusBar, spacing(0) }, Column { bindTo(&vlayout), m_modesStack, m_statusBar, spacing(0) },
spacing(1), noMargin(), spacing(1), noMargin,
}.attachTo(this); }.attachTo(this);
m_selectionWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); m_selectionWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);

View File

@@ -715,7 +715,7 @@ LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent)
Splitter { Splitter {
bindTo(&splitter), bindTo(&splitter),
Column { Column {
noMargin(), noMargin,
Row { Row {
spacing(0), spacing(0),
save, save,
@@ -729,7 +729,7 @@ LoggingViewManagerWidget::LoggingViewManagerWidget(QWidget *parent)
m_logView m_logView
}, },
Column { Column {
noMargin(), noMargin,
Row { Row {
qtInternal, qtInternal,
filterEdit, filterEdit,

View File

@@ -410,14 +410,14 @@ OutputPaneManager::OutputPaneManager(QWidget *parent) :
m_opToolBarWidgets, m_opToolBarWidgets,
minMaxButton, minMaxButton,
closeButton, closeButton,
spacing(0), noMargin(), spacing(0), noMargin,
}.attachTo(toolBar); }.attachTo(toolBar);
Column { Column {
toolBar, toolBar,
m_outputWidgetPane, m_outputWidgetPane,
new FindToolBarPlaceHolder(this), new FindToolBarPlaceHolder(this),
spacing(0), noMargin(), spacing(0), noMargin,
}.attachTo(this); }.attachTo(this);
Row { Row {
@@ -503,7 +503,7 @@ void OutputPaneManager::initialize()
QWidget *toolButtonsContainer = new QWidget(m_instance->m_opToolBarWidgets); QWidget *toolButtonsContainer = new QWidget(m_instance->m_opToolBarWidgets);
using namespace Layouting; using namespace Layouting;
Row toolButtonsRow { spacing(0), noMargin() }; Row toolButtonsRow { spacing(0), noMargin };
const QList<QWidget *> toolBarWidgets = outPane->toolBarWidgets(); const QList<QWidget *> toolBarWidgets = outPane->toolBarWidgets();
for (QWidget *toolButton : toolBarWidgets) for (QWidget *toolButton : toolBarWidgets)
toolButtonsRow.addItem(toolButton); toolButtonsRow.addItem(toolButton);

View File

@@ -111,7 +111,7 @@ CppcheckSettings::CppcheckSettings()
readSettings(); readSettings();
} }
std::function<Layouting::LayoutItem()> CppcheckSettings::layouter() std::function<Layouting::Layout()> CppcheckSettings::layouter()
{ {
return [this] { return [this] {
using namespace Layouting; using namespace Layouting;

View File

@@ -14,7 +14,7 @@ class CppcheckSettings final : public Utils::AspectContainer
public: public:
CppcheckSettings(); CppcheckSettings();
std::function<Layouting::LayoutItem()> layouter(); std::function<Layouting::Layout()> layouter();
Utils::FilePathAspect binary{this}; Utils::FilePathAspect binary{this};
Utils::BoolAspect warning{this}; Utils::BoolAspect warning{this};

View File

@@ -1445,11 +1445,11 @@ CppCodeModelInspectorDialog::CppCodeModelInspectorDialog(QWidget *parent)
Tab("&Defines", Tab("&Defines",
Column { Column {
Group { Group {
title("Toolchain Defines"), title(QString("Toolchain Defines")),
Column { m_partToolchainDefinesEdit }, Column { m_partToolchainDefinesEdit },
}, },
Group { Group {
title("Project Defines"), title(QString("Project Defines")),
Column { m_partProjectDefinesEdit }, Column { m_partProjectDefinesEdit },
} }
} }

View File

@@ -157,7 +157,7 @@ CommonSettings::CommonSettings()
}; };
return Column { return Column {
Group { title("Behavior"), Row { col1, col2, st } }, Group { title(Tr::tr("Behavior")), Row { col1, col2, st } },
sourcePathMap, sourcePathMap,
st st
}; };

View File

@@ -25,7 +25,7 @@ public:
void fromMap(const Utils::Store &map) override; void fromMap(const Utils::Store &map) override;
void toMap(Utils::Store &map) const override; void toMap(Utils::Store &map) const override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void readSettings() override; void readSettings() override;
void writeSettings() const override; void writeSettings() const override;

View File

@@ -379,7 +379,7 @@ DebuggerItemConfigWidget::DebuggerItemConfigWidget()
// clang-format off // clang-format off
using namespace Layouting; using namespace Layouting;
Form { Form {
fieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow), fieldGrowthPolicy(int(QFormLayout::AllNonFixedFieldsGrow)),
Tr::tr("Name:"), m_displayNameLineEdit, br, Tr::tr("Name:"), m_displayNameLineEdit, br,
Tr::tr("Path:"), m_binaryChooser, br, Tr::tr("Path:"), m_binaryChooser, br,
m_cdbLabel, br, m_cdbLabel, br,

View File

@@ -66,7 +66,7 @@ public:
} }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
parent.addItem(m_comboBox); parent.addItem(m_comboBox);

View File

@@ -72,7 +72,7 @@ DebuggerRunConfigurationAspect::DebuggerRunConfigurationAspect(Target *target)
details->setState(DetailsWidget::Expanded); details->setState(DetailsWidget::Expanded);
auto innerPane = new QWidget; auto innerPane = new QWidget;
details->setWidget(innerPane); details->setWidget(innerPane);
builder.addItem(Layouting::noMargin); builder.noMargin();
builder.attachTo(innerPane); builder.attachTo(innerPane);
const auto setSummaryText = [this, details] { const auto setSummaryText = [this, details] {

View File

@@ -467,7 +467,7 @@ bool SourcePathMapAspect::isDirty()
return m_internal != m_buffer; return m_internal != m_buffer;
} }
void SourcePathMapAspect::addToLayout(Layouting::LayoutItem &parent) void SourcePathMapAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_CHECK(!d->m_widget); QTC_CHECK(!d->m_widget);
d->m_widget = createSubWidget<DebuggerSourcePathMappingWidget>(); d->m_widget = createSubWidget<DebuggerSourcePathMappingWidget>();

View File

@@ -73,24 +73,24 @@ ExtensionManagerWidget::ExtensionManagerWidget()
Row { Row {
WelcomePageHelpers::createRule(Qt::Vertical), WelcomePageHelpers::createRule(Qt::Vertical),
m_secondaryDescription, m_secondaryDescription,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(m_secondarDescriptionWidget); }.attachTo(m_secondarDescriptionWidget);
Row { Row {
WelcomePageHelpers::createRule(Qt::Vertical), WelcomePageHelpers::createRule(Qt::Vertical),
Row { Row {
m_primaryDescription, m_primaryDescription,
noMargin(), noMargin,
}, },
m_secondarDescriptionWidget, m_secondarDescriptionWidget,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(descriptionColumns); }.attachTo(descriptionColumns);
Row { Row {
Space(StyleHelper::SpacingTokens::ExVPaddingGapXl), Space(StyleHelper::SpacingTokens::ExVPaddingGapXl),
m_leftColumn, m_leftColumn,
descriptionColumns, descriptionColumns,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
WelcomePageHelpers::setBackgroundColor(this, Theme::Token_Background_Default); WelcomePageHelpers::setBackgroundColor(this, Theme::Token_Background_Default);

View File

@@ -457,7 +457,7 @@ ExtensionsBrowser::ExtensionsBrowser()
Row { m_searchBox, st, m_updateButton, Space(extraListViewWidth() + gapSize) }, Row { m_searchBox, st, m_updateButton, Space(extraListViewWidth() + gapSize) },
Space(gapSize), Space(gapSize),
m_extensionsView, m_extensionsView,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
WelcomePageHelpers::setBackgroundColor(this, Theme::Token_Background_Default); WelcomePageHelpers::setBackgroundColor(this, Theme::Token_Background_Default);

View File

@@ -139,7 +139,7 @@ FakeVimSettings::FakeVimSettings()
startOfLine, startOfLine,
passKeys, passKeys,
blinkingCursor, blinkingCursor,
HostOsInfo::isWindowsHost() ? LayoutItem(systemEncoding) : empty If { HostOsInfo::isWindowsHost(), { systemEncoding } }
}, },
Column { Column {
incSearch, incSearch,
@@ -199,7 +199,7 @@ FakeVimSettings::FakeVimSettings()
autoIndent.setValue(true); autoIndent.setValue(true);
smartIndent.setValue(tps.m_autoIndent); smartIndent.setValue(tps.m_autoIndent);
incSearch.setValue(true); incSearch.setValue(true);
}), }, nullptr),
}, },
PushButton { PushButton {
text(Tr::tr("Set Qt Style")), text(Tr::tr("Set Qt Style")),
@@ -213,7 +213,7 @@ FakeVimSettings::FakeVimSettings()
incSearch.setVolatileValue(true); incSearch.setVolatileValue(true);
backspace.setVolatileValue(QString("indent,eol,start")); backspace.setVolatileValue(QString("indent,eol,start"));
passKeys.setVolatileValue(true); passKeys.setVolatileValue(true);
}), }, nullptr),
}, },
PushButton { PushButton {
text(Tr::tr("Set Plain Style")), text(Tr::tr("Set Plain Style")),
@@ -227,7 +227,7 @@ FakeVimSettings::FakeVimSettings()
incSearch.setVolatileValue(false); incSearch.setVolatileValue(false);
backspace.setVolatileValue(QString()); backspace.setVolatileValue(QString());
passKeys.setVolatileValue(false); passKeys.setVolatileValue(false);
}), }, nullptr),
}, },
st st
}, },

View File

@@ -151,7 +151,7 @@ GitSettings::GitSettings()
Group { Group {
title(Tr::tr("Instant Blame")), title(Tr::tr("Instant Blame")),
instantBlame.groupChecker(), groupChecker(instantBlame.groupChecker()),
Row { instantBlameIgnoreSpaceChanges, instantBlameIgnoreLineMoves, st }, Row { instantBlameIgnoreSpaceChanges, instantBlameIgnoreLineMoves, st },
}, },

View File

@@ -102,7 +102,7 @@ GitLabServerWidget::GitLabServerWidget(Mode m, QWidget *parent)
m_token, br, m_token, br,
m_port, br, m_port, br,
m_secure, m_secure,
m == Edit ? normalMargin : noMargin m == Edit ? &Layout::normalMargin : &Layout::noMargin
}, },
}.attachTo(this); }.attachTo(this);
} }

View File

@@ -112,7 +112,7 @@ void CommandBuilderAspectPrivate::tryToMigrate()
} }
} }
void CommandBuilderAspect::addToLayout(Layouting::LayoutItem &parent) void CommandBuilderAspect::addToLayout(Layouting::Layout &parent)
{ {
if (!d->commandBuilder) { if (!d->commandBuilder) {
d->commandBuilder = new QComboBox; d->commandBuilder = new QComboBox;

View File

@@ -23,7 +23,7 @@ public:
QString fullCommandFlag(bool keepJobNum) const; QString fullCommandFlag(bool keepJobNum) const;
private: private:
void addToLayout(Layouting::LayoutItem &parent) final; void addToLayout(Layouting::Layout &parent) final;
void fromMap(const Utils::Store &map) final; void fromMap(const Utils::Store &map) final;
void toMap(Utils::Store &map) const final; void toMap(Utils::Store &map) const final;

View File

@@ -337,7 +337,7 @@ IosDeviceTypeAspect::IosDeviceTypeAspect(AspectContainer *container, IosRunConfi
this, &IosDeviceTypeAspect::deviceChanges); this, &IosDeviceTypeAspect::deviceChanges);
} }
void IosDeviceTypeAspect::addToLayout(Layouting::LayoutItem &parent) void IosDeviceTypeAspect::addToLayout(Layouting::Layout &parent)
{ {
m_deviceTypeComboBox = new QComboBox; m_deviceTypeComboBox = new QComboBox;
m_deviceTypeComboBox->setModel(&m_deviceTypeModel); m_deviceTypeComboBox->setModel(&m_deviceTypeModel);

View File

@@ -31,7 +31,7 @@ public:
void fromMap(const Utils::Store &map) override; void fromMap(const Utils::Store &map) override;
void toMap(Utils::Store &map) const override; void toMap(Utils::Store &map) const override;
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
IosDeviceType deviceType() const; IosDeviceType deviceType() const;
void setDeviceType(const IosDeviceType &deviceType); void setDeviceType(const IosDeviceType &deviceType);

View File

@@ -40,6 +40,7 @@
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
#include <QFormLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QHeaderView> #include <QHeaderView>
#include <QJsonDocument> #include <QJsonDocument>
@@ -817,8 +818,8 @@ static QString startupBehaviorString(BaseSettings::StartBehavior behavior)
return {}; return {};
} }
BaseSettingsWidget::BaseSettingsWidget( BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *parent,
const BaseSettings *settings, QWidget *parent, Layouting::LayoutItems additionalItems) Layouting::LayoutModifier additionalItems)
: QWidget(parent) : QWidget(parent)
, m_name(new QLineEdit(settings->m_name, this)) , m_name(new QLineEdit(settings->m_name, this))
, m_mimeTypes(new QLabel(settings->m_languageFilter.mimeTypes.join(filterSeparator), this)) , m_mimeTypes(new QLabel(settings->m_languageFilter.mimeTypes.join(filterSeparator), this))
@@ -878,7 +879,10 @@ BaseSettingsWidget::BaseSettingsWidget(
Tr::tr("Initialization options:"), m_initializationOptions, br Tr::tr("Initialization options:"), m_initializationOptions, br
}; };
form.addItems(additionalItems);
if (additionalItems)
additionalItems(&form);
form.attachTo(this); form.attachTo(this);
// clang-format on // clang-format on
} }

View File

@@ -159,7 +159,7 @@ public:
explicit BaseSettingsWidget( explicit BaseSettingsWidget(
const BaseSettings *settings, const BaseSettings *settings,
QWidget *parent = nullptr, QWidget *parent = nullptr,
Layouting::LayoutItems additionalItems = {}); Layouting::LayoutModifier additionalItems = {});
~BaseSettingsWidget() override = default; ~BaseSettingsWidget() override = default;

View File

@@ -320,10 +320,10 @@ public:
m_aspects->toMap(map); m_aspects->toMap(map);
} }
std::optional<Layouting::LayoutItem> settingsLayout() Layouting::LayoutModifier settingsLayout()
{ {
if (m_aspects && m_aspects->layouter()) if (m_aspects)
return m_aspects->layouter()(); return [this](Layouting::Layout *iface) { m_aspects->addToLayout(*iface); };
return {}; return {};
} }
@@ -483,8 +483,7 @@ QWidget *LuaClientSettings::createSettingsWidget(QWidget *parent) const
using namespace Layouting; using namespace Layouting;
if (auto w = m_wrapper.lock()) if (auto w = m_wrapper.lock())
if (std::optional<LayoutItem> layout = w->settingsLayout()) return new BaseSettingsWidget(this, parent, w->settingsLayout());
return new BaseSettingsWidget(this, parent, layout->subItems);
return new BaseSettingsWidget(this, parent); return new BaseSettingsWidget(this, parent);
} }

View File

@@ -72,43 +72,47 @@ SOL_DERIVED_CLASSES(
Utils::AspectList); Utils::AspectList);
namespace Layouting { namespace Layouting {
class LayoutItem; class Object;
class Layout;
class Column; class Column;
class Row;
class Flow; class Flow;
class Grid;
class Form; class Form;
class Grid;
class Widget; class Widget;
class Stack;
class Tab;
class Group; class Group;
class TextEdit;
class PushButton; class PushButton;
class Row;
class SpinBox; class SpinBox;
class Splitter; class Splitter;
class ToolBar; class Stack;
class Tab;
class TabWidget; class TabWidget;
class Group; class TextEdit;
class ToolBar;
} // namespace Layouting } // namespace Layouting
SOL_BASE_CLASSES(Layouting::Column, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Layout, Layouting::Object);
SOL_BASE_CLASSES(Layouting::Row, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Column, Layouting::Layout);
SOL_BASE_CLASSES(Layouting::Flow, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Row, Layouting::Layout);
SOL_BASE_CLASSES(Layouting::Grid, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Flow, Layouting::Layout);
SOL_BASE_CLASSES(Layouting::Form, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Grid, Layouting::Layout);
SOL_BASE_CLASSES(Layouting::Widget, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Form, Layouting::Layout);
SOL_BASE_CLASSES(Layouting::Stack, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Widget, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::Tab, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Stack, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::Group, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Tab, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::TextEdit, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Group, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::PushButton, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::TextEdit, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::SpinBox, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::PushButton, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::Splitter, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::SpinBox, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::ToolBar, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::Splitter, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::TabWidget, Layouting::LayoutItem); SOL_BASE_CLASSES(Layouting::ToolBar, Layouting::Widget);
SOL_BASE_CLASSES(Layouting::TabWidget, Layouting::Widget);
SOL_DERIVED_CLASSES( SOL_DERIVED_CLASSES(
Layouting::LayoutItem, Layouting::Object,
Layouting::Layout,
Layouting::Column, Layouting::Column,
Layouting::Row, Layouting::Row,
Layouting::Flow, Layouting::Flow,
@@ -124,3 +128,4 @@ SOL_DERIVED_CLASSES(
Layouting::Splitter, Layouting::Splitter,
Layouting::ToolBar, Layouting::ToolBar,
Layouting::TabWidget); Layouting::TabWidget);

View File

@@ -13,36 +13,164 @@ using namespace Utils;
namespace Lua::Internal { namespace Lua::Internal {
static void processChildren(LayoutItem *item, const sol::table &children) template<class T>
static void processChildren(T *item, const sol::table &children)
{ {
for (size_t i = 1; i <= children.size(); ++i) { for (size_t i = 1; i <= children.size(); ++i) {
const sol::object v = children[i]; const auto &child = children[i];
if (child.is<Layout *>()) {
if (v.is<LayoutItem *>()) { item->addItem(*child.get<Layout *>());
item->addItem(*v.as<LayoutItem *>()); } else if (child.is<Widget *>()) {
} else if (v.is<BaseAspect>()) { item->addItem(*child.get<Widget *>());
v.as<BaseAspect *>()->addToLayout(*item); } else if (child.is<BaseAspect>()) {
} else if (v.is<QString>()) { child.get<BaseAspect *>()->addToLayout(*item);
item->addItem(v.as<QString>()); } else if (child.is<QString>()) {
} else if (v.is<sol::function>()) { item->addItem(child.get<QString>());
const sol::function f = v.as<sol::function>(); } else if (child.is<sol::function>()) {
auto res = LuaEngine::safe_call<LayoutItem *>(f); const sol::function f = child.get<sol::function>();
auto res = LuaEngine::void_safe_call(f, item);
QTC_ASSERT_EXPECTED(res, continue); QTC_ASSERT_EXPECTED(res, continue);
item->addItem(**res); } else if (child.is<Span>()) {
const Span &span = child.get<Span>();
item->addItem(span);
} else if (child.is<Space>()) {
const Space &space = child.get<Space>();
item->addItem(space);
} else if (child.is<Stretch>()) {
const Stretch &stretch = child.get<Stretch>();
item->addItem(stretch);
} else { } else {
qWarning() << "Incompatible object added to layout item: " << (int) v.get_type() qWarning() << "Incompatible object added to layout item: " << (int) child.get_type()
<< " (expected LayoutItem, Aspect or function returning LayoutItem)"; << " (expected LayoutItem, Aspect or function returning LayoutItem)";
} }
} }
} }
template<class T, typename... Args> template<class T>
static std::unique_ptr<T> construct(Args &&...args, const sol::table &children) static std::unique_ptr<T> construct(const sol::table &children)
{ {
std::unique_ptr<T> item(new T(std::forward<Args>(args)..., {})); std::unique_ptr<T> item(new T({}));
processChildren(item.get(), children); processChildren(item.get(), children);
return item;
}
template<class T>
void constructWidget(std::unique_ptr<T> &widget, const sol::table &children)
{
widget->setWindowTitle(children.get_or<QString>("windowTitle", ""));
widget->setToolTip(children.get_or<QString>("toolTip", ""));
for (size_t i = 1; i < children.size(); ++i) {
const auto &child = children[i];
if (child.is<Layout>())
widget->setLayout(*child.get<Layout *>());
}
}
#define HAS_MEM_FUNC(func, name) \
template<typename T, typename Sign> \
struct name \
{ \
typedef char yes[1]; \
typedef char no[2]; \
template<typename U, U> \
struct type_check; \
template<typename _1> \
static yes &chk(type_check<Sign, &_1::func> *); \
template<typename> \
static no &chk(...); \
static bool const value = sizeof(chk<T>(0)) == sizeof(yes); \
}
HAS_MEM_FUNC(onTextChanged, hasOnTextChanged);
HAS_MEM_FUNC(onClicked, hasOnClicked);
HAS_MEM_FUNC(setText, hasSetText);
HAS_MEM_FUNC(setTitle, hasSetTitle);
HAS_MEM_FUNC(setValue, hasSetValue);
template<class T>
void setProperties(std::unique_ptr<T> &item, const sol::table &children)
{
if constexpr (hasOnTextChanged<T, void (T::*)(const QString &)>::value) {
sol::optional<sol::protected_function> onTextChanged
= children.get<sol::optional<sol::protected_function>>("onTextChanged");
if (onTextChanged) {
item->onTextChanged(
[f = *onTextChanged](const QString &text) {
auto res = LuaEngine::void_safe_call(f, text);
QTC_CHECK_EXPECTED(res);
},
&LuaEngine::instance());
}
}
if constexpr (hasOnClicked<T, void (T::*)(const std::function<void()> &, QObject *guard)>::value) {
sol::optional<sol::protected_function> onClicked
= children.get<sol::optional<sol::protected_function>>("onClicked");
if (onClicked) {
item->onClicked(
[f = *onClicked]() {
auto res = LuaEngine::void_safe_call(f);
QTC_CHECK_EXPECTED(res);
},
&LuaEngine::instance());
}
}
if constexpr (hasSetText<T, void (T::*)(const QString &)>::value) {
item->setText(children.get_or<QString>("text", ""));
}
if constexpr (hasSetTitle<T, void (T::*)(const QString &)>::value) {
item->setTitle(children.get_or<QString>("title", ""));
}
if constexpr (hasSetValue<T, void (T::*)(int)>::value) {
sol::optional<int> value = children.get<sol::optional<int>>("value");
if (value)
item->setValue(*value);
}
}
template<class T>
std::unique_ptr<T> constructWidgetType(const sol::table &children)
{
std::unique_ptr<T> item(new T({}));
constructWidget(item, children);
setProperties(item, children);
return item;
}
std::unique_ptr<Tab> constructTab(const QString &tabName, const Layout &layout)
{
std::unique_ptr<Tab> item = std::make_unique<Tab>(tabName, layout);
return item;
}
std::unique_ptr<TabWidget> constructTabWidget(const sol::table &children)
{
std::unique_ptr<TabWidget> item(new TabWidget({}));
setProperties(item, children);
for (size_t i = 1; i < children.size(); ++i) {
const auto &child = children[i];
if (child.is<Tab *>())
addToTabWidget(item.get(), *child.get<Tab *>());
}
return item;
}
std::unique_ptr<Splitter> constructSplitter(const sol::table &children)
{
std::unique_ptr<Splitter> item(new Splitter({}));
constructWidget(item, children);
for (size_t i = 1; i < children.size(); ++i) {
const auto &child = children[i];
if (child.is<Layout *>()) {
addToSplitter(item.get(), *child.get<Layout *>());
} else if (child.is<Widget *>()) {
addToSplitter(item.get(), *child.get<Widget *>());
} else {
qWarning() << "Incompatible object added to Splitter: " << (int) child.get_type()
<< " (expected Layout or Widget)";
}
}
return item; return item;
} }
@@ -51,91 +179,119 @@ void addLayoutModule()
LuaEngine::registerProvider("Layout", [](sol::state_view l) -> sol::object { LuaEngine::registerProvider("Layout", [](sol::state_view l) -> sol::object {
sol::table layout = l.create_table(); sol::table layout = l.create_table();
layout.new_usertype<LayoutItem>("LayoutItem", "attachTo", &LayoutItem::attachTo); layout.new_usertype<Span>(
"Span", sol::call_constructor, sol::constructors<Span(int n, const Layout::I &item)>());
layout["Span"] = [](int span, LayoutItem *item) { layout.new_usertype<Space>("Space", sol::call_constructor, sol::constructors<Space(int)>());
return createItem(item, Span(span, *item));
};
layout["Space"] = [](int space) { return createItem(nullptr, Space(space)); };
layout["Stretch"] = [](int stretch) { return createItem(nullptr, Stretch(stretch)); };
layout.new_usertype<Column>("Column", layout.new_usertype<Stretch>(
sol::call_constructor, "Stretch", sol::call_constructor, sol::constructors<Stretch(int)>());
sol::factories(&construct<Column>),
sol::base_classes, // Layouts
sol::bases<LayoutItem>()); layout.new_usertype<Form>(
layout.new_usertype<Row>("Row", "Form",
sol::call_constructor,
sol::factories(&construct<Row>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<Flow>("Flow",
sol::call_constructor,
sol::factories(&construct<Flow>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<Grid>("Grid",
sol::call_constructor,
sol::factories(&construct<Grid>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<Form>("Form",
sol::call_constructor, sol::call_constructor,
sol::factories(&construct<Form>), sol::factories(&construct<Form>),
sol::base_classes, sol::base_classes,
sol::bases<LayoutItem>()); sol::bases<Layout, Object, Thing>());
layout.new_usertype<Widget>("Widget",
layout.new_usertype<Column>(
"Column",
sol::call_constructor, sol::call_constructor,
sol::factories(&construct<Widget>), sol::factories(&construct<Column>),
sol::base_classes, sol::base_classes,
sol::bases<LayoutItem>()); sol::bases<Layout, Object, Thing>());
layout.new_usertype<Stack>("Stack",
layout.new_usertype<Row>(
"Row",
sol::call_constructor, sol::call_constructor,
sol::factories(&construct<Stack>), sol::factories(&construct<Row>),
sol::base_classes, sol::base_classes,
sol::bases<LayoutItem>()); sol::bases<Layout, Object, Thing>());
layout.new_usertype<Flow>(
"Flow",
sol::call_constructor,
sol::factories(&construct<Flow>),
sol::base_classes,
sol::bases<Layout, Object, Thing>());
layout.new_usertype<Grid>(
"Grid",
sol::call_constructor,
sol::factories(&construct<Grid>),
sol::base_classes,
sol::bases<Layout, Object, Thing>());
// Widgets
layout.new_usertype<PushButton>(
"PushButton",
sol::call_constructor,
sol::factories(&constructWidgetType<PushButton>),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<Widget>(
"Widget",
sol::call_constructor,
sol::factories(&constructWidgetType<Widget>),
"show",
&Widget::show,
"resize",
&Widget::resize,
sol::base_classes,
sol::bases<Object, Thing>());
layout.new_usertype<Stack>(
"Stack",
sol::call_constructor,
sol::factories(&constructWidgetType<Stack>),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<Tab>( layout.new_usertype<Tab>(
"Tab", "Tab",
sol::call_constructor, sol::call_constructor,
sol::factories(&construct<Tab, QString>), sol::factories(&constructTab),
sol::base_classes, sol::base_classes,
sol::bases<LayoutItem>()); sol::bases<Widget, Object, Thing>());
layout.new_usertype<TextEdit>("TextEdit",
sol::call_constructor,
sol::factories(&construct<TextEdit>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<PushButton>("PushButton",
sol::call_constructor,
sol::factories(&construct<PushButton>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<SpinBox>("SpinBox",
sol::call_constructor,
sol::factories(&construct<SpinBox>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<Splitter>("Splitter",
sol::call_constructor,
sol::factories(&construct<Splitter>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<ToolBar>("ToolBar",
sol::call_constructor,
sol::factories(&construct<ToolBar>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<TabWidget>("TabWidget",
sol::call_constructor,
sol::factories(&construct<TabWidget>),
sol::base_classes,
sol::bases<LayoutItem>());
layout.new_usertype<Group>("Group", layout.new_usertype<TextEdit>(
"TextEdit",
sol::call_constructor, sol::call_constructor,
sol::factories(&construct<Group>), sol::factories(&constructWidgetType<TextEdit>),
sol::base_classes, sol::base_classes,
sol::bases<LayoutItem>()); sol::bases<Widget, Object, Thing>());
layout.new_usertype<SpinBox>(
"SpinBox",
sol::call_constructor,
sol::factories(&constructWidgetType<SpinBox>),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<Splitter>(
"Splitter",
sol::call_constructor,
sol::factories(&constructSplitter),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<ToolBar>(
"ToolBar",
sol::call_constructor,
sol::factories(&constructWidgetType<ToolBar>),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<TabWidget>(
"TabWidget",
sol::call_constructor,
sol::factories(&constructTabWidget),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout.new_usertype<Group>(
"Group",
sol::call_constructor,
sol::factories(&constructWidgetType<Group>),
sol::base_classes,
sol::bases<Widget, Object, Thing>());
layout["br"] = &br; layout["br"] = &br;
layout["st"] = &st; layout["st"] = &st;
@@ -143,26 +299,16 @@ void addLayoutModule()
layout["hr"] = &hr; layout["hr"] = &hr;
layout["noMargin"] = &noMargin; layout["noMargin"] = &noMargin;
layout["normalMargin"] = &normalMargin; layout["normalMargin"] = &normalMargin;
layout["customMargin"] = [](int left, int top, int right, int bottom) {
return customMargin(QMargins(left, top, right, bottom)); //layout["customMargin"] = [](int left, int top, int right, int bottom) {
}; // return customMargin(QMargins(left, top, right, bottom));
layout["withFormAlignment"] = &withFormAlignment; //};
layout["title"] = &title; // layout["withFormAlignment"] = &withFormAlignment;
layout["text"] = &text; // layout["columnStretch"] = &columnStretch;
layout["tooltip"] = &tooltip; // layout["spacing"] = &spacing;
layout["resize"] = &resize; // layout["windowTitle"] = &windowTitle;
layout["columnStretch"] = &columnStretch; // layout["fieldGrowthPolicy"] = &fieldGrowthPolicy;
layout["spacing"] = &spacing; // layout["id"] = &id;
layout["windowTitle"] = &windowTitle;
layout["fieldGrowthPolicy"] = &fieldGrowthPolicy;
layout["id"] = &id;
layout["setText"] = &setText;
layout["onClicked"] = [](const sol::function &f) {
return onClicked([f]() {
auto res = LuaEngine::void_safe_call(f);
QTC_CHECK_EXPECTED(res);
});
};
layout["onTextChanged"] = [](const sol::function &f) { layout["onTextChanged"] = [](const sol::function &f) {
return onTextChanged([f](const QString &text) { return onTextChanged([f](const QString &text) {
auto res = LuaEngine::void_safe_call(f, text); auto res = LuaEngine::void_safe_call(f, text);

View File

@@ -62,8 +62,8 @@ std::unique_ptr<LuaAspectContainer> aspectContainerCreate(const sol::table &opti
} else if (key == "layouter") { } else if (key == "layouter") {
if (v.is<sol::function>()) if (v.is<sol::function>())
container->setLayouter( container->setLayouter(
[func = v.as<sol::function>()]() -> Layouting::LayoutItem { [func = v.as<sol::function>()]() -> Layouting::Layout {
auto res = Lua::LuaEngine::safe_call<Layouting::LayoutItem>(func); auto res = Lua::LuaEngine::safe_call<Layouting::Layout>(func);
QTC_ASSERT_EXPECTED(res, return {}); QTC_ASSERT_EXPECTED(res, return {});
return *res; return *res;
}); });

View File

@@ -145,9 +145,8 @@ local function layoutSettings()
"Language server not found:", "Language server not found:",
Row { Row {
PushButton { PushButton {
text("Try to install lua language server"), text = "Try to install lua language server",
onClicked(function() a.sync(installOrUpdateServer)() end), onClicked = function() a.sync(installServer)() end,
br,
}, },
st st
} }

View File

@@ -24,7 +24,7 @@ public:
void makeReadOnly() override {} void makeReadOnly() override {}
void refresh() override {} void refresh() override {}
void addToLayoutImpl(Layouting::LayoutItem &) override {} void addToLayoutImpl(Layouting::Layout &) override {}
}; };
Utils::Id McuDependenciesKitAspect::id() Utils::Id McuDependenciesKitAspect::id()

View File

@@ -36,7 +36,7 @@ private:
void makeReadOnly() override { m_toolsComboBox->setEnabled(false); } void makeReadOnly() override { m_toolsComboBox->setEnabled(false); }
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_toolsComboBox); addMutableAction(m_toolsComboBox);
parent.addItem(m_toolsComboBox); parent.addItem(m_toolsComboBox);

View File

@@ -30,7 +30,7 @@ NimSettings::NimSettings()
using namespace Layouting; using namespace Layouting;
return Column { return Column {
Group { Group {
title("Nimsuggest"), title(QString("Nimsuggest")),
Column { nimSuggestPath } Column { nimSuggestPath }
}, },
st st

View File

@@ -125,7 +125,7 @@ PerforceSettings::PerforceSettings()
Group environment { Group environment {
title(Tr::tr("Environment Variables")), title(Tr::tr("Environment Variables")),
customEnv.groupChecker(), groupChecker(customEnv.groupChecker()),
Row { p4Port, p4Client, p4User } Row { p4Port, p4Client, p4User }
}; };

View File

@@ -123,7 +123,7 @@ void BuildDirectoryAspect::fromMap(const Store &map)
} }
} }
void BuildDirectoryAspect::addToLayout(Layouting::LayoutItem &parent) void BuildDirectoryAspect::addToLayout(Layouting::Layout &parent)
{ {
FilePathAspect::addToLayout(parent); FilePathAspect::addToLayout(parent);
d->genericProblemSpacer = new QLabel; d->genericProblemSpacer = new QLabel;

View File

@@ -23,7 +23,7 @@ public:
bool isShadowBuild() const; bool isShadowBuild() const;
void setProblem(const QString &description); void setProblem(const QString &description);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
static Utils::FilePath fixupDir(const Utils::FilePath &dir); static Utils::FilePath fixupDir(const Utils::FilePath &dir);

View File

@@ -326,13 +326,13 @@ NamedWidget *BuildConfiguration::createConfigWidget()
} }
Layouting::Form form; Layouting::Form form;
form.noMargin();
for (BaseAspect *aspect : aspects()) { for (BaseAspect *aspect : aspects()) {
if (aspect->isVisible()) { if (aspect->isVisible()) {
form.addItem(aspect); form.addItem(aspect);
form.addItem(Layouting::br); form.flush();
} }
} }
form.addItem(Layouting::noMargin);
form.attachTo(widget); form.attachTo(widget);
return named; return named;

View File

@@ -113,11 +113,13 @@ QWidget *BuildStep::doCreateConfigWidget()
QWidget *BuildStep::createConfigWidget() QWidget *BuildStep::createConfigWidget()
{ {
Layouting::Form form; Layouting::Form form;
form.noMargin();
for (BaseAspect *aspect : std::as_const(*this)) { for (BaseAspect *aspect : std::as_const(*this)) {
if (aspect->isVisible()) if (aspect->isVisible()) {
form.addItems({aspect, Layouting::br()}); form.addItem(aspect);
form.flush();
}
} }
form.addItem(Layouting::noMargin);
auto widget = form.emerge(); auto widget = form.emerge();
if (m_addMacroExpander) if (m_addMacroExpander)

View File

@@ -19,6 +19,7 @@
#include <QComboBox> #include <QComboBox>
#include <QLabel> #include <QLabel>
#include <QLayout>
#include <QStackedWidget> #include <QStackedWidget>
using namespace TextEditor; using namespace TextEditor;

View File

@@ -23,6 +23,7 @@
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QComboBox> #include <QComboBox>
#include <QFormLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
@@ -91,7 +92,7 @@ private:
QPushButton *m_defaultDeviceButton; QPushButton *m_defaultDeviceButton;
QVBoxLayout *m_buttonsLayout; QVBoxLayout *m_buttonsLayout;
QWidget *m_deviceNameEditWidget; QWidget *m_deviceNameEditWidget;
QFormLayout *m_generalFormLayout; QLayout *m_generalFormLayout;
}; };
DeviceSettingsWidget::DeviceSettingsWidget() DeviceSettingsWidget::DeviceSettingsWidget()
@@ -338,7 +339,7 @@ void DeviceSettingsWidget::currentDeviceChanged(int index)
return; return;
} }
Layouting::Column item{Layouting::noMargin()}; Layouting::Column item{Layouting::noMargin};
device->settings()->displayName.addToLayout(item); device->settings()->displayName.addToLayout(item);
QWidget *newEdit = item.emerge(); QWidget *newEdit = item.emerge();
QLayoutItem *oldItem = m_generalFormLayout->replaceWidget(m_deviceNameEditWidget, newEdit); QLayoutItem *oldItem = m_generalFormLayout->replaceWidget(m_deviceNameEditWidget, newEdit);

View File

@@ -61,7 +61,7 @@ public:
private: private:
void makeReadOnly() override { m_chooser->setReadOnly(true); } void makeReadOnly() override { m_chooser->setReadOnly(true); }
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_chooser); addMutableAction(m_chooser);
builder.addItem(Layouting::Span(2, m_chooser)); builder.addItem(Layouting::Span(2, m_chooser));
@@ -238,7 +238,7 @@ public:
} }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_mainWidget); addMutableAction(m_mainWidget);
builder.addItem(m_mainWidget); builder.addItem(m_mainWidget);
@@ -739,7 +739,7 @@ public:
~DeviceTypeKitAspectImpl() override { delete m_comboBox; } ~DeviceTypeKitAspectImpl() override { delete m_comboBox; }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
builder.addItem(m_comboBox); builder.addItem(m_comboBox);
@@ -889,7 +889,7 @@ public:
} }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
builder.addItem(m_comboBox); builder.addItem(m_comboBox);
@@ -1170,7 +1170,7 @@ public:
} }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
builder.addItem(m_comboBox); builder.addItem(m_comboBox);
@@ -1433,7 +1433,7 @@ public:
} }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &builder) override void addToLayoutImpl(Layouting::Layout &builder) override
{ {
addMutableAction(m_mainWidget); addMutableAction(m_mainWidget);
builder.addItem(m_mainWidget); builder.addItem(m_mainWidget);

View File

@@ -798,7 +798,7 @@ void KitAspect::makeStickySubWidgetsReadOnly()
makeReadOnly(); makeReadOnly();
} }
void KitAspect::addToLayout(Layouting::LayoutItem &parentItem) void KitAspect::addToLayout(Layouting::Layout &parentItem)
{ {
auto label = createSubWidget<QLabel>(m_factory->displayName() + ':'); auto label = createSubWidget<QLabel>(m_factory->displayName() + ':');
label->setToolTip(m_factory->description()); label->setToolTip(m_factory->description());

View File

@@ -110,7 +110,7 @@ public:
virtual void refresh() = 0; virtual void refresh() = 0;
void addToLayout(Layouting::LayoutItem &parentItem) override; void addToLayout(Layouting::Layout &parentItem) override;
static QString msgManage(); static QString msgManage();
@@ -124,7 +124,7 @@ public:
protected: protected:
virtual void makeReadOnly() {} virtual void makeReadOnly() {}
virtual void addToLayoutImpl(Layouting::LayoutItem &parentItem) = 0; virtual void addToLayoutImpl(Layouting::Layout &parentItem) = 0;
virtual Utils::Id settingsPageItemToPreselect() const { return {}; } virtual Utils::Id settingsPageItemToPreselect() const { return {}; }
Kit *m_kit; Kit *m_kit;

View File

@@ -200,7 +200,7 @@ QString KitManagerConfigWidget::validityMessage() const
return m_modifiedKit->toHtml(tmp); return m_modifiedKit->toHtml(tmp);
} }
void KitManagerConfigWidget::addAspectToWorkingCopy(Layouting::LayoutItem &parent, KitAspectFactory *factory) void KitManagerConfigWidget::addAspectToWorkingCopy(Layouting::Layout &parent, KitAspectFactory *factory)
{ {
QTC_ASSERT(factory, return); QTC_ASSERT(factory, return);
KitAspect *aspect = factory->createKitAspect(workingCopy()); KitAspect *aspect = factory->createKitAspect(workingCopy());

View File

@@ -36,7 +36,7 @@ public:
void discard(); void discard();
bool isDirty() const; bool isDirty() const;
QString validityMessage() const; QString validityMessage() const;
void addAspectToWorkingCopy(Layouting::LayoutItem &parent, KitAspectFactory *factory); void addAspectToWorkingCopy(Layouting::Layout &parent, KitAspectFactory *factory);
void makeStickySubWidgetsReadOnly(); void makeStickySubWidgetsReadOnly();
Kit *workingCopy() const; Kit *workingCopy() const;

View File

@@ -313,7 +313,7 @@ QWidget *MakeStep::createConfigWidget()
if (m_disablingForSubDirsSupported) if (m_disablingForSubDirsSupported)
builder.addRow({m_disabledForSubdirsAspect}); builder.addRow({m_disabledForSubdirsAspect});
builder.addRow({m_buildTargetsAspect}); builder.addRow({m_buildTargetsAspect});
builder.addItem(Layouting::noMargin); builder.noMargin();
auto widget = builder.emerge(); auto widget = builder.emerge();

View File

@@ -552,7 +552,7 @@ int SelectorView::padding()
///////// /////////
// KitAreaWidget // KitAreaWidget
///////// /////////
void doLayout(KitAspect *aspect, Layouting::LayoutItem &builder) void doLayout(KitAspect *aspect, Layouting::Layout &builder)
{ {
aspect->addToLayout(builder); aspect->addToLayout(builder);
} }
@@ -586,7 +586,8 @@ public:
if (k && k->isMutable(factory->id())) { if (k && k->isMutable(factory->id())) {
KitAspect *aspect = factory->createKitAspect(k); KitAspect *aspect = factory->createKitAspect(k);
m_kitAspects << aspect; m_kitAspects << aspect;
grid.addItems({aspect, Layouting::br}); grid.addItem(aspect);
grid.flush();
} }
} }
m_gridWidget = grid.emerge(); m_gridWidget = grid.emerge();

View File

@@ -789,7 +789,7 @@ public:
auto sessions = new QWidget; auto sessions = new QWidget;
{ {
auto sessionsLabel = new Label(Tr::tr("Sessions"), Label::Primary); auto sessionsLabel = new Core::Label(Tr::tr("Sessions"), Core::Label::Primary);
auto manageSessionsButton = new Button(Tr::tr("Manage..."), Button::MediumSecondary); auto manageSessionsButton = new Button(Tr::tr("Manage..."), Button::MediumSecondary);
auto sessionsList = new TreeView(this, "Sessions"); auto sessionsList = new TreeView(this, "Sessions");
sessionsList->setModel(projectWelcomePage->m_sessionModel); sessionsList->setModel(projectWelcomePage->m_sessionModel);
@@ -816,7 +816,7 @@ public:
auto projects = new QWidget; auto projects = new QWidget;
{ {
auto projectsLabel = new Label(Tr::tr("Projects"), Label::Primary); auto projectsLabel = new Core::Label(Tr::tr("Projects"), Core::Label::Primary);
auto projectsList = new TreeView(this, "Recent Projects"); auto projectsList = new TreeView(this, "Recent Projects");
projectsList->setUniformRowHeights(true); projectsList->setUniformRowHeights(true);
projectsList->setModel(projectWelcomePage->m_projectModel); projectsList->setModel(projectWelcomePage->m_projectModel);
@@ -840,7 +840,7 @@ public:
sessions, sessions,
projects, projects,
spacing(0), spacing(0),
noMargin(), noMargin,
}.attachTo(this); }.attachTo(this);
} }

View File

@@ -201,13 +201,13 @@ bool RunConfiguration::isEnabled(Utils::Id) const
QWidget *RunConfiguration::createConfigurationWidget() QWidget *RunConfiguration::createConfigurationWidget()
{ {
Layouting::Form form; Layouting::Form form;
form.noMargin();
for (BaseAspect *aspect : std::as_const(*this)) { for (BaseAspect *aspect : std::as_const(*this)) {
if (aspect->isVisible()) { if (aspect->isVisible()) {
form.addItem(aspect); form.addItem(aspect);
form.addItem(Layouting::br); form.flush();
} }
} }
form.addItem(Layouting::noMargin);
auto widget = form.emerge(); auto widget = form.emerge();
VariableChooser::addSupportForChildWidgets(widget, &m_expander); VariableChooser::addSupportForChildWidgets(widget, &m_expander);

View File

@@ -63,13 +63,13 @@ TerminalAspect::TerminalAspect(AspectContainer *container)
/*! /*!
\reimp \reimp
*/ */
void TerminalAspect::addToLayout(LayoutItem &parent) void TerminalAspect::addToLayout(Layout &parent)
{ {
QTC_CHECK(!m_checkBox); QTC_CHECK(!m_checkBox);
m_checkBox = createSubWidget<QCheckBox>(Tr::tr("Run in terminal")); m_checkBox = createSubWidget<QCheckBox>(Tr::tr("Run in terminal"));
m_checkBox->setChecked(m_useTerminal); m_checkBox->setChecked(m_useTerminal);
m_checkBox->setEnabled(isEnabled()); m_checkBox->setEnabled(isEnabled());
parent.addItems({empty(), m_checkBox.data()}); parent.addItems({empty, 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();
@@ -174,7 +174,7 @@ void WorkingDirectoryAspect::setEnvironment(EnvironmentAspect *envAspect)
/*! /*!
\reimp \reimp
*/ */
void WorkingDirectoryAspect::addToLayout(LayoutItem &builder) void WorkingDirectoryAspect::addToLayout(Layout &builder)
{ {
QTC_CHECK(!m_chooser); QTC_CHECK(!m_chooser);
m_chooser = new PathChooser; m_chooser = new PathChooser;
@@ -451,7 +451,7 @@ QWidget *ArgumentsAspect::setupChooser()
/*! /*!
\reimp \reimp
*/ */
void ArgumentsAspect::addToLayout(LayoutItem &builder) void ArgumentsAspect::addToLayout(Layout &builder)
{ {
QTC_CHECK(!m_chooser && !m_multiLineChooser && !m_multiLineButton); QTC_CHECK(!m_chooser && !m_multiLineChooser && !m_multiLineButton);
@@ -643,11 +643,13 @@ FilePath ExecutableAspect::executable() const
/*! /*!
\reimp \reimp
*/ */
void ExecutableAspect::addToLayout(LayoutItem &builder) void ExecutableAspect::addToLayout(Layout &builder)
{ {
builder.addItem(m_executable); builder.addItem(m_executable);
if (m_alternativeExecutable) if (m_alternativeExecutable) {
builder.addItems({br, m_alternativeExecutable}); builder.flush();
builder.addItem(m_alternativeExecutable);
}
} }
/*! /*!

View File

@@ -29,7 +29,7 @@ class PROJECTEXPLORER_EXPORT TerminalAspect : public Utils::BaseAspect
public: public:
explicit TerminalAspect(Utils::AspectContainer *container = nullptr); explicit TerminalAspect(Utils::AspectContainer *container = nullptr);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
bool useTerminal() const; bool useTerminal() const;
void setUseTerminalHint(bool useTerminal); void setUseTerminalHint(bool useTerminal);
@@ -61,7 +61,7 @@ class PROJECTEXPLORER_EXPORT WorkingDirectoryAspect : public Utils::BaseAspect
public: public:
explicit WorkingDirectoryAspect(Utils::AspectContainer *container = nullptr); explicit WorkingDirectoryAspect(Utils::AspectContainer *container = nullptr);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
Utils::FilePath operator()() const { return workingDirectory(); } Utils::FilePath operator()() const { return workingDirectory(); }
Utils::FilePath workingDirectory() const; Utils::FilePath workingDirectory() const;
@@ -93,7 +93,7 @@ class PROJECTEXPLORER_EXPORT ArgumentsAspect : public Utils::BaseAspect
public: public:
explicit ArgumentsAspect(Utils::AspectContainer *container = nullptr); explicit ArgumentsAspect(Utils::AspectContainer *container = nullptr);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
QString operator()() const { return arguments(); } QString operator()() const { return arguments(); }
QString arguments() const; QString arguments() const;
@@ -171,7 +171,7 @@ public:
void setDeviceSelector(Target *target, ExecutionDeviceSelector selector); void setDeviceSelector(Target *target, ExecutionDeviceSelector selector);
void setSettingsKey(const Utils::Key &key); void setSettingsKey(const Utils::Key &key);
void makeOverridable(const Utils::Key &overridingKey, const Utils::Key &useOverridableKey); void makeOverridable(const Utils::Key &overridingKey, const Utils::Key &useOverridableKey);
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
void setLabelText(const QString &labelText); void setLabelText(const QString &labelText);
void setPlaceHolderText(const QString &placeHolderText); void setPlaceHolderText(const QString &placeHolderText);
void setHistoryCompleter(const Utils::Key &historyCompleterKey); void setHistoryCompleter(const Utils::Key &historyCompleterKey);

View File

@@ -73,7 +73,7 @@ public:
} }
protected: protected:
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_comboBox); addMutableAction(m_comboBox);
parent.addItem(m_comboBox); parent.addItem(m_comboBox);

View File

@@ -50,7 +50,7 @@ CustomQbsPropertiesDialog::CustomQbsPropertiesDialog(const QVariantMap &properti
Column { Column {
PushButton { PushButton {
text(Tr::tr("&Add")), text(Tr::tr("&Add")),
onClicked([this] { addProperty(); } ), onClicked([this] { addProperty(); }, nullptr),
}, },
m_removeButton, m_removeButton,
st st

View File

@@ -60,7 +60,7 @@ ArchitecturesAspect::ArchitecturesAspect(AspectContainer *container)
setAllValues(m_abisToArchMap.keys()); setAllValues(m_abisToArchMap.keys());
} }
void ArchitecturesAspect::addToLayout(Layouting::LayoutItem &parent) void ArchitecturesAspect::addToLayout(Layouting::Layout &parent)
{ {
MultiSelectionAspect::addToLayout(parent); MultiSelectionAspect::addToLayout(parent);
const auto changeHandler = [this] { const auto changeHandler = [this] {

View File

@@ -20,7 +20,7 @@ public:
ArchitecturesAspect(Utils::AspectContainer *container = nullptr); ArchitecturesAspect(Utils::AspectContainer *container = nullptr);
void setKit(const ProjectExplorer::Kit *kit) { m_kit = kit; } void setKit(const ProjectExplorer::Kit *kit) { m_kit = kit; }
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
QStringList selectedArchitectures() const; QStringList selectedArchitectures() const;
void setSelectedArchitectures(const QStringList& architectures); void setSelectedArchitectures(const QStringList& architectures);
bool isManagedByTarget() const { return m_isManagedByTarget; } bool isManagedByTarget() const { return m_isManagedByTarget; }

View File

@@ -34,7 +34,7 @@ private:
void makeReadOnly() override { m_changeButton->setEnabled(false); } void makeReadOnly() override { m_changeButton->setEnabled(false); }
void refresh() override { m_contentLabel->setText(QbsKitAspect::representation(kit())); } void refresh() override { m_contentLabel->setText(QbsKitAspect::representation(kit())); }
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_contentLabel); addMutableAction(m_contentLabel);
parent.addItem(m_contentLabel); parent.addItem(m_contentLabel);

View File

@@ -133,11 +133,11 @@ QbsProfilesSettingsWidget::QbsProfilesSettingsWidget()
Column { Column {
PushButton { PushButton {
text(Tr::tr("E&xpand All")), text(Tr::tr("E&xpand All")),
onClicked([this] { m_propertiesView->expandAll(); }), onClicked([this] { m_propertiesView->expandAll(); }, nullptr),
}, },
PushButton { PushButton {
text(Tr::tr("&Collapse All")), text(Tr::tr("&Collapse All")),
onClicked([this] { m_propertiesView->collapseAll(); }), onClicked([this] { m_propertiesView->collapseAll(); }, nullptr),
}, },
st, st,
}, },

View File

@@ -39,7 +39,7 @@ public:
~QmakeKitAspectImpl() override { delete m_lineEdit; } ~QmakeKitAspectImpl() override { delete m_lineEdit; }
private: private:
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_lineEdit); addMutableAction(m_lineEdit);
parent.addItem(m_lineEdit); parent.addItem(m_lineEdit);

View File

@@ -428,7 +428,7 @@ QWidget *QMakeStep::createConfigWidget()
builder.addRow({userArguments}); builder.addRow({userArguments});
builder.addRow({effectiveCall}); builder.addRow({effectiveCall});
builder.addRow({abisLabel, abisListWidget}); builder.addRow({abisLabel, abisListWidget});
builder.addItem(Layouting::noMargin); builder.noMargin();
auto widget = builder.emerge(); auto widget = builder.emerge();
qmakeBuildConfigChanged(); qmakeBuildConfigChanged();

View File

@@ -143,7 +143,7 @@ AssetExportDialog::AssetExportDialog(const FilePath &exportPath,
m_exportAssetsCheck, m_exportAssetsCheck,
m_perComponentExportCheck, m_perComponentExportCheck,
st, st,
noMargin(), noMargin,
}.attachTo(optionsWidget); }.attachTo(optionsWidget);
Column { Column {

View File

@@ -97,10 +97,10 @@ TimelineAnimationForm::TimelineAnimationForm(QWidget *parent)
using namespace Layouting; using namespace Layouting;
Grid { Grid {
Span(4, mainL), br, Span(4, mainL), br,
empty(), br, empty, br,
idL, Span(2, m_idLineEdit), Span(2, Row{ runningL, m_running }), br, idL, Span(2, m_idLineEdit), Span(2, Row{ runningL, m_running }), br,
empty(), startFrameL, m_startFrame, endFrameL, m_endFrame, durationL, m_duration, br, empty, startFrameL, m_startFrame, endFrameL, m_endFrame, durationL, m_duration, br,
empty(), continuousL, m_continuous, loopsL, m_loops, pingPongL, m_pingPong, str, br, empty, continuousL, m_continuous, loopsL, m_loops, pingPongL, m_pingPong, str, br,
tr("Transition to state:"), transitionToStateL, m_transitionToState, br, tr("Transition to state:"), transitionToStateL, m_transitionToState, br,
}.attachTo(this); }.attachTo(this);

View File

@@ -78,8 +78,8 @@ TimelineForm::TimelineForm(QWidget *parent)
Grid { Grid {
Span(2, mainL), br, Span(2, mainL), br,
idL, m_idLineEdit, br, idL, m_idLineEdit, br,
empty(), Row { startFrameL, m_startFrame, st(), endFrameL, m_endFrame }, str, br, empty, Row { startFrameL, m_startFrame, st, endFrameL, m_endFrame }, str, br,
empty(), Row { m_expressionBinding, m_animation, st() }, br, empty, Row { m_expressionBinding, m_animation, st }, br,
expressionBindingL, m_expressionBindingLineEdit, br, expressionBindingL, m_expressionBindingLineEdit, br,
}.attachTo(this); }.attachTo(this);

View File

@@ -21,6 +21,7 @@
#include <QCheckBox> #include <QCheckBox>
#include <QComboBox> #include <QComboBox>
#include <QGroupBox>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QMenu> #include <QMenu>

View File

@@ -56,7 +56,7 @@ QmlMainFileAspect::~QmlMainFileAspect()
delete m_fileListCombo; delete m_fileListCombo;
} }
void QmlMainFileAspect::addToLayout(Layouting::LayoutItem &parent) void QmlMainFileAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_ASSERT(!m_fileListCombo, delete m_fileListCombo); QTC_ASSERT(!m_fileListCombo, delete m_fileListCombo);
m_fileListCombo = new QComboBox; m_fileListCombo = new QComboBox;

View File

@@ -42,7 +42,7 @@ public:
Utils::FilePath currentFile; Utils::FilePath currentFile;
}; };
void addToLayout(Layouting::LayoutItem &parent) final; void addToLayout(Layouting::Layout &parent) final;
void toMap(Utils::Store &map) const final; void toMap(Utils::Store &map) const final;
void fromMap(const Utils::Store &map) final; void fromMap(const Utils::Store &map) final;

View File

@@ -30,12 +30,12 @@ QmlDebuggingAspect::QmlDebuggingAspect(AspectContainer *container)
setValue(buildPropertiesSettings().qmlDebugging()); setValue(buildPropertiesSettings().qmlDebugging());
} }
void QmlDebuggingAspect::addToLayout(Layouting::LayoutItem &parent) void QmlDebuggingAspect::addToLayout(Layouting::Layout &parent)
{ {
SelectionAspect::addToLayout(parent); SelectionAspect::addToLayout(parent);
const auto warningLabel = createSubWidget<InfoLabel>(QString(), InfoLabel::Warning); const auto warningLabel = createSubWidget<InfoLabel>(QString(), InfoLabel::Warning);
warningLabel->setElideMode(Qt::ElideNone); warningLabel->setElideMode(Qt::ElideNone);
parent.addRow({{}, warningLabel}); parent.addRow({Layouting::empty, warningLabel});
const auto changeHandler = [this, warningLabel] { const auto changeHandler = [this, warningLabel] {
QString warningText; QString warningText;
QTC_ASSERT(m_buildConfig, return); QTC_ASSERT(m_buildConfig, return);
@@ -78,13 +78,13 @@ void QtQuickCompilerAspect::setBuildConfiguration(const BuildConfiguration *buil
m_buildConfig = buildConfig; m_buildConfig = buildConfig;
} }
void QtQuickCompilerAspect::addToLayout(Layouting::LayoutItem &parent) void QtQuickCompilerAspect::addToLayout(Layouting::Layout &parent)
{ {
SelectionAspect::addToLayout(parent); SelectionAspect::addToLayout(parent);
const auto warningLabel = createSubWidget<InfoLabel>(QString(), InfoLabel::Warning); const auto warningLabel = createSubWidget<InfoLabel>(QString(), InfoLabel::Warning);
warningLabel->setElideMode(Qt::ElideNone); warningLabel->setElideMode(Qt::ElideNone);
warningLabel->setVisible(false); warningLabel->setVisible(false);
parent.addRow({{}, warningLabel}); parent.addRow({Layouting::empty, warningLabel});
const auto changeHandler = [this, warningLabel] { const auto changeHandler = [this, warningLabel] {
QString warningText; QString warningText;
QTC_ASSERT(m_buildConfig, return); QTC_ASSERT(m_buildConfig, return);

View File

@@ -21,7 +21,7 @@ public:
void setBuildConfiguration(const ProjectExplorer::BuildConfiguration *newBuildConfig); void setBuildConfiguration(const ProjectExplorer::BuildConfiguration *newBuildConfig);
private: private:
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
const ProjectExplorer::BuildConfiguration *m_buildConfig = nullptr; const ProjectExplorer::BuildConfiguration *m_buildConfig = nullptr;
}; };
@@ -36,7 +36,7 @@ public:
void setBuildConfiguration(const ProjectExplorer::BuildConfiguration *newBuildConfig); void setBuildConfiguration(const ProjectExplorer::BuildConfiguration *newBuildConfig);
private: private:
void addToLayout(Layouting::LayoutItem &parent) override; void addToLayout(Layouting::Layout &parent) override;
const ProjectExplorer::BuildConfiguration *m_buildConfig = nullptr; const ProjectExplorer::BuildConfiguration *m_buildConfig = nullptr;
}; };

View File

@@ -62,7 +62,7 @@ public:
private: private:
void makeReadOnly() final { m_combo->setEnabled(false); } void makeReadOnly() final { m_combo->setEnabled(false); }
void addToLayoutImpl(Layouting::LayoutItem &parent) override void addToLayoutImpl(Layouting::Layout &parent) override
{ {
addMutableAction(m_combo); addMutableAction(m_combo);
parent.addItem(m_combo); parent.addItem(m_combo);

View File

@@ -19,6 +19,7 @@
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QLabel> #include <QLabel>
#include <QLayout>
#include <QPushButton> #include <QPushButton>
#include <QSpinBox> #include <QSpinBox>

View File

@@ -324,7 +324,7 @@ CropWidget::CropWidget(QWidget *parent)
saveImageButton, saveImageButton,
copyImageToClipboardButton, copyImageToClipboardButton,
}, },
noMargin(), noMargin,
}.attachTo(this); }.attachTo(this);
connect(m_xSpinBox, &QSpinBox::valueChanged, this, &CropWidget::onSpinBoxChanged); connect(m_xSpinBox, &QSpinBox::valueChanged, this, &CropWidget::onSpinBoxChanged);
@@ -526,19 +526,19 @@ TrimWidget::TrimWidget(const ClipInfo &clip, QWidget *parent)
using namespace Layouting; using namespace Layouting;
Column { Column {
Row { m_frameSlider, m_currentTime, "/", m_clipDuration }, Row { m_frameSlider, m_currentTime, QString("/"), m_clipDuration },
Group { Group {
title(Tr::tr("Trimming")), title(Tr::tr("Trimming")),
Row { Row {
m_trimStart.button, m_trimStart.timeLabel, m_trimStart.button, m_trimStart.timeLabel,
Space(20), Space(20),
m_trimEnd.button, m_trimEnd.timeLabel, m_trimEnd.button, m_trimEnd.timeLabel,
Stretch(), Space(20), st, Space(20),
Tr::tr("Range:"), m_trimRange, Tr::tr("Range:"), m_trimRange,
m_trimResetButton, m_trimResetButton,
}, },
}, },
noMargin(), noMargin,
}.attachTo(this); }.attachTo(this);
connect(m_frameSlider, &QSlider::valueChanged, this, [this] { connect(m_frameSlider, &QSlider::valueChanged, this, [this] {
@@ -652,7 +652,7 @@ CropAndTrimDialog::CropAndTrimDialog(const ClipInfo &clip, QWidget *parent)
using namespace Layouting; using namespace Layouting;
Column { Column {
Group { Group {
title("Cropping"), title(Tr::tr("Cropping")),
Column { m_cropWidget }, Column { m_cropWidget },
}, },
Space(16), Space(16),
@@ -760,7 +760,7 @@ CropAndTrimWidget::CropAndTrimWidget(QWidget *parent)
Row { Row {
m_button, m_button,
m_cropSizeWarningIcon, m_cropSizeWarningIcon,
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
connect(m_button, &QPushButton::clicked, this, [this] { connect(m_button, &QPushButton::clicked, this, [this] {

View File

@@ -144,7 +144,7 @@ ExportWidget::ExportWidget(QWidget *parent)
exportButton->setText(Tr::tr("Export...")); exportButton->setText(Tr::tr("Export..."));
using namespace Layouting; using namespace Layouting;
Row { st, new StyledSeparator, exportButton, noMargin(), spacing(0) }.attachTo(this); Row { st, new StyledSeparator, exportButton, noMargin, spacing(0) }.attachTo(this);
connect(exportButton, &QToolButton::clicked, this, [this] { connect(exportButton, &QToolButton::clicked, this, [this] {
FilePathAspect &lastDir = Internal::settings().exportLastDirectory; FilePathAspect &lastDir = Internal::settings().exportLastDirectory;

View File

@@ -21,6 +21,7 @@
#include <QAction> #include <QAction>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QGuiApplication> #include <QGuiApplication>
#include <QLayout>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMessageBox> #include <QMessageBox>
#include <QScreen> #include <QScreen>
@@ -224,7 +225,7 @@ RecordWidget::RecordWidget(const FilePath &recordFile, QWidget *parent)
st, st,
progressLabel, progressLabel,
Space(6), Space(6),
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
connect(settingsButton, &QToolButton::clicked, this, [this] { connect(settingsButton, &QToolButton::clicked, this, [this] {

View File

@@ -29,6 +29,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <QDialog> #include <QDialog>
#include <QLayout>
using namespace Utils; using namespace Utils;
using namespace Core; using namespace Core;
@@ -56,7 +57,7 @@ public:
Column { Column {
m_recordWidget, m_recordWidget,
Row { m_cropAndTrimStatusWidget, m_exportWidget }, Row { m_cropAndTrimStatusWidget, m_exportWidget },
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
auto setLowerRowEndabled = [this] (bool enabled) { auto setLowerRowEndabled = [this] (bool enabled) {

View File

@@ -33,7 +33,7 @@ ShapesToolbox::ShapesToolbox(QWidget *parent)
Column { Column {
spacing(0), spacing(0),
scrollArea, scrollArea,
noMargin, noMargin
}.attachTo(this); }.attachTo(this);
} }

View File

@@ -33,7 +33,7 @@ StateView::StateView(StateItem *state, QWidget *parent)
using namespace Layouting; using namespace Layouting;
Row { Row {
PushButton{ text("Back"), onClicked([this] { closeView(); }, this) }, PushButton{ text(QString("Back")), onClicked([this] { closeView(); }, this) },
stateNameLabel, stateNameLabel,
noMargin noMargin
}.attachTo(titleBar); }.attachTo(titleBar);

View File

@@ -387,10 +387,10 @@ SquishServerSettingsWidget::SquishServerSettingsWidget(QWidget *parent)
using namespace Layouting; using namespace Layouting;
Form grid { Form grid {
&m_applicationsView, br, &m_applicationsView, br,
&m_serverSettings.autTimeout, br, m_serverSettings.autTimeout, br,
&m_serverSettings.responseTimeout, br, m_serverSettings.responseTimeout, br,
&m_serverSettings.postMortemWaitTime, br, m_serverSettings.postMortemWaitTime, br,
&m_serverSettings.animatedCursor, br, m_serverSettings.animatedCursor, br,
}; };
Column buttonCol { Column buttonCol {
add, add,

View File

@@ -76,7 +76,7 @@ SubversionSettings::SubversionSettings()
Group { Group {
title(Tr::tr("Authentication")), title(Tr::tr("Authentication")),
useAuthentication.groupChecker(), groupChecker(useAuthentication.groupChecker()),
Form { Form {
userName, br, userName, br,
password, password,

View File

@@ -116,7 +116,7 @@ SuppressionAspect::~SuppressionAspect()
delete d; delete d;
} }
void SuppressionAspect::addToLayout(Layouting::LayoutItem &parent) void SuppressionAspect::addToLayout(Layouting::Layout &parent)
{ {
QTC_CHECK(!d->addEntry); QTC_CHECK(!d->addEntry);
QTC_CHECK(!d->removeEntry); QTC_CHECK(!d->removeEntry);

View File

@@ -20,7 +20,7 @@ public:
SuppressionAspect(Utils::AspectContainer *container, bool global); SuppressionAspect(Utils::AspectContainer *container, bool global);
~SuppressionAspect() final; ~SuppressionAspect() final;
void addToLayout(Layouting::LayoutItem &parent) final; void addToLayout(Layouting::Layout &parent) final;
void fromMap(const Utils::Store &map) final; void fromMap(const Utils::Store &map) final;
void toMap(Utils::Store &map) const final; void toMap(Utils::Store &map) const final;

View File

@@ -92,9 +92,9 @@ CommonVcsSettings::CommonVcsSettings()
empty, empty,
PushButton { PushButton {
text(Tr::tr("Reset VCS Cache")), text(Tr::tr("Reset VCS Cache")),
tooltip(Tr::tr("Reset information about which " Layouting::toolTip(Tr::tr("Reset information about which "
"version control system handles which directory.")), "version control system handles which directory.")),
onClicked(&VcsManager::clearVersionControlCache) onClicked(&VcsManager::clearVersionControlCache, (QObject *)nullptr)
} }
} }
}; };

View File

@@ -131,7 +131,7 @@ public:
addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser); addDataExtractor(this, &WebBrowserSelectionAspect::currentBrowser, &Data::currentBrowser);
} }
void addToLayout(Layouting::LayoutItem &parent) override void addToLayout(Layouting::Layout &parent) override
{ {
QTC_CHECK(!m_webBrowserComboBox); QTC_CHECK(!m_webBrowserComboBox);
m_webBrowserComboBox = new QComboBox; m_webBrowserComboBox = new QComboBox;

View File

@@ -21,6 +21,7 @@
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
#include <QGroupBox>
#include <QTextBrowser> #include <QTextBrowser>
#include <QTimer> #include <QTimer>

View File

@@ -165,7 +165,7 @@ public:
customMargin({HPaddingM, VPaddingM, HPaddingM, VPaddingM}), customMargin({HPaddingM, VPaddingM, HPaddingM, VPaddingM}),
}, },
createRule(Qt::Horizontal), createRule(Qt::Horizontal),
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(this); }.attachTo(this);
} }
}; };
@@ -194,7 +194,7 @@ public:
m_essentials = new QWidget; m_essentials = new QWidget;
Column essentials { Column essentials {
spacing(0), spacing(0),
noMargin(), noMargin,
}; };
{ {
@@ -232,7 +232,7 @@ public:
mainColumn.addItem(st); mainColumn.addItem(st);
{ {
auto label = new Label(Tr::tr("Explore more"), Label::Secondary); auto label = new Core::Label(Tr::tr("Explore more"), Core::Label::Secondary);
label->setContentsMargins(HPaddingXxs, 0, 0, 0); // Is indented in Figma design label->setContentsMargins(HPaddingXxs, 0, 0, 0); // Is indented in Figma design
Column linksLayout { Column linksLayout {
@@ -275,7 +275,7 @@ public:
Row { Row {
mainColumn, mainColumn,
createRule(Qt::Vertical), createRule(Qt::Vertical),
noMargin(), spacing(0), noMargin, spacing(0),
}.attachTo(mainWidget); }.attachTo(mainWidget);
setWidget(mainWidget); setWidget(mainWidget);
@@ -342,7 +342,7 @@ WelcomeMode::WelcomeMode()
m_sideArea, m_sideArea,
m_pageStack, m_pageStack,
}, },
noMargin(), noMargin,
spacing(0), spacing(0),
}.attachTo(m_modeWidget); }.attachTo(m_modeWidget);

View File

@@ -24,9 +24,9 @@ int main(int argc, char *argv[])
}; };
Row { Row {
PushButton { text("-"), onClicked(minusClick) }, PushButton { text("-"), onClicked(minusClick, nullptr) },
lineEdit, lineEdit,
PushButton { text("+"), onClicked(plusClick) }, PushButton { text("+"), onClicked(plusClick, nullptr) },
Group { Group {
title("Splitter in Group"), title("Splitter in Group"),
Column { Column {
@@ -52,8 +52,8 @@ int main(int argc, char *argv[])
Splitter { Splitter {
windowTitle("Splitter with sub layouts"), windowTitle("Splitter with sub layouts"),
Column {"First Widget"}, Column { QString("First Widget") },
Row {"Second Widget"}, Row { QString("Second Widget") },
}.emerge()->show(); }.emerge()->show();
return app.exec(); return app.exec();

Some files were not shown because too many files have changed in this diff Show More