summaryrefslogtreecommitdiff
path: root/src/libs/utils/layoutbuilder.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/utils/layoutbuilder.h')
-rw-r--r--src/libs/utils/layoutbuilder.h163
1 files changed, 142 insertions, 21 deletions
diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h
index 1a2ad1f5e5..a258690416 100644
--- a/src/libs/utils/layoutbuilder.h
+++ b/src/libs/utils/layoutbuilder.h
@@ -29,10 +29,9 @@
#include <QList>
#include <QString>
+#include <QVariant>
QT_BEGIN_NAMESPACE
-class QFormLayout;
-class QGridLayout;
class QLayout;
class QWidget;
QT_END_NAMESPACE
@@ -40,52 +39,174 @@ QT_END_NAMESPACE
namespace Utils {
class BaseAspect;
+class BoolAspect;
class QTCREATOR_UTILS_EXPORT LayoutBuilder
{
public:
- enum LayoutType { GridLayout, FormLayout };
- enum Alignment { DefaultAlignment, AlignAsFormLabel };
+ enum LayoutType {
+ HBoxLayout,
+ VBoxLayout,
+ FormLayout,
+ GridLayout,
+ };
- explicit LayoutBuilder(QWidget *parent, LayoutType layoutType = FormLayout);
- explicit LayoutBuilder(QLayout *layout); // Adds to existing layout.
+ enum class AlignmentType {
+ DefaultAlignment,
+ AlignAsFormLabel,
+ };
- ~LayoutBuilder();
+ enum class SpecialType {
+ NotSpecial,
+ Space,
+ Stretch,
+ Break,
+ Title,
+ };
class QTCREATOR_UTILS_EXPORT LayoutItem
{
public:
LayoutItem();
- LayoutItem(QLayout *layout, int span = 1, Alignment align = {});
- LayoutItem(QWidget *widget, int span = 1, Alignment align = {});
- LayoutItem(BaseAspect *aspect);
+ LayoutItem(QLayout *layout);
+ LayoutItem(QWidget *widget);
+ LayoutItem(BaseAspect *aspect); // Remove
+ LayoutItem(BaseAspect &aspect);
LayoutItem(const QString &text);
+ LayoutItem(const LayoutBuilder &builder);
QLayout *layout = nullptr;
QWidget *widget = nullptr;
BaseAspect *aspect = nullptr;
- QString text;
+
+ QString text; // FIXME: Use specialValue for that
int span = 1;
- Alignment align;
+ AlignmentType align = AlignmentType::DefaultAlignment;
+ SpecialType specialType = SpecialType::NotSpecial;
+ QVariant specialValue;
};
+ using LayoutItems = QList<LayoutItem>;
+
+ explicit LayoutBuilder(LayoutType layoutType, const LayoutItems &items = {});
+
+ LayoutBuilder(const LayoutBuilder &) = delete;
+ LayoutBuilder(LayoutBuilder &&) = default;
+ LayoutBuilder &operator=(const LayoutBuilder &) = delete;
+ LayoutBuilder &operator=(LayoutBuilder &&) = default;
+
+ ~LayoutBuilder();
+
LayoutBuilder &addItem(const LayoutItem &item);
- LayoutBuilder &addItems(const QList<LayoutItem> &items);
+ LayoutBuilder &addItems(const LayoutItems &items);
LayoutBuilder &finishRow();
LayoutBuilder &addRow(const LayoutItem &item);
- LayoutBuilder &addRow(const QList<LayoutItem> &items);
+ LayoutBuilder &addRow(const LayoutItems &items);
+
+ LayoutType layoutType() const { return m_layoutType; }
+
+ void attachTo(QWidget *w, bool withMargins = true);
+ QWidget *emerge(bool withMargins = true);
+
+ class QTCREATOR_UTILS_EXPORT Space : public LayoutItem
+ {
+ public:
+ explicit Space(int space);
+ };
- QLayout *layout() const;
+ class QTCREATOR_UTILS_EXPORT Span : public LayoutItem
+ {
+ public:
+ Span(int span, const LayoutItem &item);
+ };
+
+ class QTCREATOR_UTILS_EXPORT AlignAsFormLabel : public LayoutItem
+ {
+ public:
+ AlignAsFormLabel(const LayoutItem &item);
+ };
+
+ class QTCREATOR_UTILS_EXPORT Stretch : public LayoutItem
+ {
+ public:
+ explicit Stretch(int stretch = 1);
+ };
+
+ class QTCREATOR_UTILS_EXPORT Break : public LayoutItem
+ {
+ public:
+ Break();
+ };
+
+ class QTCREATOR_UTILS_EXPORT Title : public LayoutItem
+ {
+ public:
+ explicit Title(const QString &title, BoolAspect *check = nullptr);
+ };
+
+protected:
+ explicit LayoutBuilder(); // Adds to existing layout.
+
+ void doLayout(QWidget *parent);
+
+ LayoutItems m_items;
+ LayoutType m_layoutType;
+ bool m_withMargins = false;
+};
+
+class QTCREATOR_UTILS_EXPORT LayoutExtender : public LayoutBuilder
+{
+public:
+ explicit LayoutExtender(QLayout *layout);
+ ~LayoutExtender();
private:
- void flushPendingFormItems();
+ QLayout *m_layout = nullptr;
+};
+
+namespace Layouting {
- QFormLayout *m_formLayout = nullptr;
- QGridLayout *m_gridLayout = nullptr;
- QList<LayoutItem> m_pendingFormItems;
- int m_currentGridRow = 0;
- int m_currentGridColumn = 0;
+class QTCREATOR_UTILS_EXPORT Group : public LayoutBuilder::LayoutItem
+{
+public:
+ Group(std::initializer_list<LayoutBuilder::LayoutItem> items);
};
+class QTCREATOR_UTILS_EXPORT Column : public LayoutBuilder
+{
+public:
+ Column() : LayoutBuilder(VBoxLayout) {}
+ Column(std::initializer_list<LayoutItem> items) : LayoutBuilder(VBoxLayout, items) {}
+};
+
+class QTCREATOR_UTILS_EXPORT Row : public LayoutBuilder
+{
+public:
+ Row() : LayoutBuilder(HBoxLayout) {}
+ Row(std::initializer_list<LayoutItem> items) : LayoutBuilder(HBoxLayout, items) {}
+};
+
+class QTCREATOR_UTILS_EXPORT Grid : public LayoutBuilder
+{
+public:
+ Grid() : LayoutBuilder(GridLayout) {}
+ Grid(std::initializer_list<LayoutItem> items) : LayoutBuilder(GridLayout, items) {}
+};
+
+class QTCREATOR_UTILS_EXPORT Form : public LayoutBuilder
+{
+public:
+ Form() : LayoutBuilder(FormLayout) {}
+ Form(std::initializer_list<LayoutItem> items) : LayoutBuilder(FormLayout, items) {}
+};
+
+using Stretch = LayoutBuilder::Stretch;
+using Space = LayoutBuilder::Space;
+using Span = LayoutBuilder::Span;
+using AlignAsFormLabel = LayoutBuilder::AlignAsFormLabel;
+using Break = LayoutBuilder::Break;
+using Title = LayoutBuilder::Title;
+
+}
} // namespace Utils