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.h265
1 files changed, 104 insertions, 161 deletions
diff --git a/src/libs/utils/layoutbuilder.h b/src/libs/utils/layoutbuilder.h
index aea4db876c..1e9e6b9ad3 100644
--- a/src/libs/utils/layoutbuilder.h
+++ b/src/libs/utils/layoutbuilder.h
@@ -5,7 +5,6 @@
#include <QList>
#include <QString>
-#include <QVariant>
#include <QtGlobal>
#include <optional>
@@ -18,10 +17,9 @@
QT_BEGIN_NAMESPACE
class QLayout;
-class QSplitter;
-class QTabWidget;
-class QTextEdit;
+class QObject;
class QWidget;
+template <class T> T qobject_cast(QObject *object);
QT_END_NAMESPACE
namespace Layouting {
@@ -34,6 +32,7 @@ enum AttachType {
class LayoutBuilder;
class LayoutItem;
+class Span;
// Special items
@@ -51,27 +50,19 @@ public:
const int stretch;
};
-class QTCREATOR_UTILS_EXPORT Break
-{
-public:
- Break() {}
-};
-class QTCREATOR_UTILS_EXPORT Span
-{
-public:
- Span(int span, const LayoutItem &item) : span(span), item(item) {}
- const int span;
- const LayoutItem &item;
-};
+// LayoutItem
-class QTCREATOR_UTILS_EXPORT HorizontalRule
-{
-public:
- HorizontalRule() {}
-};
+using LayoutItems = QList<LayoutItem>;
-// LayoutItem
+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);
class QTCREATOR_UTILS_EXPORT LayoutItem
{
@@ -81,72 +72,81 @@ public:
AlignAsFormLabel,
};
- enum class SpecialType {
- NotSpecial,
- Space,
- Stretch,
- Break,
- HorizontalRule,
- Tab,
- };
-
using Setter = std::function<void(QObject *target)>;
- using OnAdder = std::function<void(LayoutBuilder &)>;
LayoutItem();
+ ~LayoutItem();
+
+ LayoutItem(const LayoutItem &t);
+ LayoutItem &operator=(const LayoutItem &t) = default;
template <class T> LayoutItem(const T &t)
{
- if constexpr (std::is_same_v<QString, T>) {
- text = t;
- } else if constexpr (std::is_same_v<Space, T>) {
- specialType = LayoutItem::SpecialType::Space;
- specialValue = t.space;
- } else if constexpr (std::is_same_v<Stretch, T>) {
- specialType = LayoutItem::SpecialType::Stretch;
- specialValue = t.stretch;
- } else if constexpr (std::is_same_v<Break, T>) {
- specialType = LayoutItem::SpecialType::Break;
- } else if constexpr (std::is_same_v<Span, T>) {
- LayoutItem::operator=(t.item);
- span = t.span;
- } else if constexpr (std::is_same_v<HorizontalRule, T>) {
- specialType = SpecialType::HorizontalRule;
- } else if constexpr (std::is_base_of_v<LayoutBuilder, T>) {
- setBuilder(t);
- } else if constexpr (std::is_base_of_v<LayoutItem, T>) {
+ if constexpr (std::is_base_of_v<LayoutItem, T>)
LayoutItem::operator=(t);
- } else if constexpr (std::is_base_of_v<Setter, T>) {
- setter = t;
- } else if constexpr (std::is_base_of_v<QLayout, std::remove_pointer_t<T>>) {
- layout = t;
- } else if constexpr (std::is_base_of_v<QWidget, std::remove_pointer_t<T>>) {
- widget = t;
- } else if constexpr (std::is_pointer_v<T>) {
- onAdd = [t](LayoutBuilder &builder) { doLayout(*t, builder); };
- } else {
- onAdd = [&t](LayoutBuilder &builder) { doLayout(t, builder); };
- }
+ else
+ createItem(this, t);
}
- void setBuilder(const LayoutBuilder &builder);
+ void attachTo(QWidget *w, AttachType attachType = WithMargins) const;
+ QWidget *emerge(AttachType attachType = WithMargins);
+
+ void addItem(const LayoutItem &item);
+ void addItems(const LayoutItems &items);
+ void addRow(const LayoutItems &items);
+ void finishRow();
+
+ std::function<void(LayoutBuilder &)> onAdd;
+ std::function<void(LayoutBuilder &)> onExit;
+ std::function<void(QObject *target)> setter;
+ LayoutItems subItems;
+};
+
+class QTCREATOR_UTILS_EXPORT Span
+{
+public:
+ Span(int span, const LayoutItem &item) : span(span), item(item) {}
+ const int span;
+ LayoutItem item;
+};
- QLayout *layout = nullptr;
- QWidget *widget = nullptr;
- OnAdder onAdd;
+class QTCREATOR_UTILS_EXPORT Column : public LayoutItem
+{
+public:
+ Column(std::initializer_list<LayoutItem> items);
+};
+
+class QTCREATOR_UTILS_EXPORT Row : public LayoutItem
+{
+public:
+ Row(std::initializer_list<LayoutItem> items);
+};
+
+class QTCREATOR_UTILS_EXPORT Grid : public LayoutItem
+{
+public:
+ Grid() : Grid({}) {}
+ Grid(std::initializer_list<LayoutItem> items);
+};
+
+class QTCREATOR_UTILS_EXPORT Form : public LayoutItem
+{
+public:
+ Form() : Form({}) {}
+ Form(std::initializer_list<LayoutItem> items);
+};
- QString text; // FIXME: Use specialValue for that
- int span = 1;
- AlignmentType align = AlignmentType::DefaultAlignment;
- Setter setter;
- SpecialType specialType = SpecialType::NotSpecial;
- QVariant specialValue;
+class QTCREATOR_UTILS_EXPORT Stack : public LayoutItem
+{
+public:
+ Stack() : Stack({}) {}
+ Stack(std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT Tab : public LayoutItem
{
public:
- Tab(const QString &tabName, const LayoutBuilder &item);
+ Tab(const QString &tabName, const LayoutItem &item);
};
class QTCREATOR_UTILS_EXPORT Group : public LayoutItem
@@ -179,124 +179,67 @@ public:
TabWidget(std::initializer_list<LayoutItem> items);
};
-// Singleton items.
+class QTCREATOR_UTILS_EXPORT Application : public LayoutItem
+{
+public:
+ Application(std::initializer_list<LayoutItem> items);
-QTCREATOR_UTILS_EXPORT extern Break br;
-QTCREATOR_UTILS_EXPORT extern Stretch st;
-QTCREATOR_UTILS_EXPORT extern Space empty;
-QTCREATOR_UTILS_EXPORT extern HorizontalRule hr;
+ int exec(int &argc, char *argv[]);
+};
-// "Properties"
+// "Singletons"
-QTCREATOR_UTILS_EXPORT LayoutItem bindTo(QTabWidget **);
-QTCREATOR_UTILS_EXPORT LayoutItem bindTo(QSplitter **);
+QTCREATOR_UTILS_EXPORT LayoutItem br();
+QTCREATOR_UTILS_EXPORT LayoutItem st();
+QTCREATOR_UTILS_EXPORT LayoutItem empty();
+QTCREATOR_UTILS_EXPORT LayoutItem hr();
+
+// "Properties"
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 onClicked(const std::function<void()> &func,
- QObject *guard = nullptr);
-
+QTCREATOR_UTILS_EXPORT LayoutItem resize(int, int);
+QTCREATOR_UTILS_EXPORT LayoutItem spacing(int);
+QTCREATOR_UTILS_EXPORT LayoutItem windowTitle(const QString &windowTitle);
+QTCREATOR_UTILS_EXPORT LayoutItem onClicked(const std::function<void()> &,
+ QObject *guard = nullptr);
// Convenience
QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr);
+template <class T>
+LayoutItem bindTo(T **out)
+{
+ return [out](QObject *target) { *out = qobject_cast<T *>(target); };
+}
// LayoutBuilder
class QTCREATOR_UTILS_EXPORT LayoutBuilder
{
- Q_DISABLE_COPY(LayoutBuilder)
+ Q_DISABLE_COPY_MOVE(LayoutBuilder)
public:
- enum LayoutType {
- HBoxLayout,
- VBoxLayout,
- FormLayout,
- GridLayout,
- StackLayout,
- };
-
- using LayoutItems = QList<LayoutItem>;
-
- explicit LayoutBuilder(LayoutType layoutType, const LayoutItems &items = {});
-
- LayoutBuilder(LayoutBuilder &&) = default;
- LayoutBuilder &operator=(LayoutBuilder &&) = default;
-
+ LayoutBuilder();
~LayoutBuilder();
- LayoutBuilder &setSpacing(int spacing);
-
- LayoutBuilder &addItem(const LayoutItem &item);
- LayoutBuilder &addItems(const LayoutItems &items);
-
- LayoutBuilder &finishRow();
- LayoutBuilder &addRow(const LayoutItems &items);
-
- LayoutType layoutType() const { return m_layoutType; }
-
- void attachTo(QWidget *w, Layouting::AttachType attachType = Layouting::WithMargins) const;
- QWidget *emerge(Layouting::AttachType attachType = Layouting::WithMargins);
-
-protected:
- friend class LayoutItem;
-
- explicit LayoutBuilder(); // Adds to existing layout.
+ void addItem(const LayoutItem &item);
+ void addItems(const LayoutItems &items);
+ void addRow(const LayoutItems &items);
- QLayout *createLayout() const;
- void doLayout(QWidget *parent, Layouting::AttachType attachType) const;
+ bool isForm() const;
- LayoutItems m_items;
- LayoutType m_layoutType;
- std::optional<int> m_spacing;
+ struct Slice;
+ QList<Slice> stack;
};
class QTCREATOR_UTILS_EXPORT LayoutExtender : public LayoutBuilder
{
public:
- explicit LayoutExtender(QLayout *layout, Layouting::AttachType attachType);
+ explicit LayoutExtender(QLayout *layout, AttachType attachType);
~LayoutExtender();
-
-private:
- QLayout *m_layout = nullptr;
- Layouting::AttachType m_attachType = {};
-};
-
-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) {}
-};
-
-class QTCREATOR_UTILS_EXPORT Stack : public LayoutBuilder
-{
-public:
- Stack() : LayoutBuilder(StackLayout) {}
- Stack(std::initializer_list<LayoutItem> items) : LayoutBuilder(StackLayout, items) {}
};
} // Layouting