| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- // Copyright (C) 2020 The Qt Company Ltd.
- // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
- #pragma once
- #include "builderutils.h"
- #include <QString>
- #include <initializer_list>
- #include <vector>
- #if defined(UTILS_LIBRARY)
- # define QTCREATOR_UTILS_EXPORT Q_DECL_EXPORT
- #elif defined(UTILS_STATIC_LIBRARY)
- # define QTCREATOR_UTILS_EXPORT
- #else
- # define QTCREATOR_UTILS_EXPORT Q_DECL_IMPORT
- #endif
- QT_BEGIN_NAMESPACE
- class QBoxLayout;
- class QFormLayout;
- class QGridLayout;
- class QGroupBox;
- class QHBoxLayout;
- class QLabel;
- class QLayout;
- class QObject;
- class QPushButton;
- class QSpinBox;
- class QSplitter;
- class QStackedWidget;
- class QTabWidget;
- class QTextEdit;
- class QToolBar;
- class QVBoxLayout;
- class QWidget;
- QT_END_NAMESPACE
- namespace Layouting {
- //////////////////////////////////////////////
- //
- // Basic
- //
- class QTCREATOR_UTILS_EXPORT Thing
- {
- public:
- void *ptr; // The product.
- };
- class QTCREATOR_UTILS_EXPORT Object : public Thing
- {
- public:
- using Implementation = QObject;
- using I = Building::BuilderItem<Object>;
- Object() = default;
- Object(std::initializer_list<I> ps);
- };
- //
- // Layouts
- //
- class FlowLayout;
- class Layout;
- using LayoutModifier = std::function<void(Layout *)>;
- class QTCREATOR_UTILS_EXPORT LayoutItem
- {
- public:
- ~LayoutItem();
- LayoutItem();
- LayoutItem(QLayout *l);
- LayoutItem(QWidget *w);
- LayoutItem(const QString &t);
- QString text;
- QLayout *layout = nullptr;
- QWidget *widget = nullptr;
- int stretch = -1;
- int spanCols = 1;
- int spanRows = 1;
- bool empty = false;
- };
- class QTCREATOR_UTILS_EXPORT Layout : public Object
- {
- public:
- using Implementation = QLayout;
- using I = Building::BuilderItem<Layout>;
- Layout() = default;
- Layout(Implementation *w) { ptr = w; }
- void span(int cols, int rows);
- void setNoMargins();
- void setNormalMargins();
- void setContentsMargins(int left, int top, int right, int bottom);
- void setColumnStretch(int cols, int rows);
- void setSpacing(int space);
- void setFieldGrowthPolicy(int policy);
- 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;
- QWidget *emerge() const;
- void show() 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 = Building::BuilderItem<Column>;
- Column(std::initializer_list<I> ps);
- };
- class QTCREATOR_UTILS_EXPORT Row : public Layout
- {
- public:
- using Implementation = QHBoxLayout;
- using I = Building::BuilderItem<Row>;
- Row(std::initializer_list<I> ps);
- };
- class QTCREATOR_UTILS_EXPORT Form : public Layout
- {
- public:
- using Implementation = QFormLayout;
- using I = Building::BuilderItem<Form>;
- Form();
- Form(std::initializer_list<I> ps);
- };
- class QTCREATOR_UTILS_EXPORT Grid : public Layout
- {
- public:
- using Implementation = QGridLayout;
- using I = Building::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
- {
- public:
- explicit Stretch(int stretch) : stretch(stretch) {}
- int stretch;
- };
- class QTCREATOR_UTILS_EXPORT Space
- {
- public:
- explicit Space(int space) : space(space) {}
- int space;
- };
- class QTCREATOR_UTILS_EXPORT Span
- {
- public:
- Span(int cols, const Layout::I &item);
- Span(int cols, int rows, const Layout::I &item);
- Layout::I item;
- int spanCols = 1;
- int spanRows = 1;
- };
- //
- // Widgets
- //
- class QTCREATOR_UTILS_EXPORT Widget : public Object
- {
- public:
- using Implementation = QWidget;
- using I = Building::BuilderItem<Widget>;
- Widget() = default;
- Widget(std::initializer_list<I> ps);
- Widget(Implementation *w) { ptr = w; }
- QWidget *emerge() const;
- void show();
- void setLayout(const Layout &layout);
- void setSize(int, int);
- void setWindowTitle(const QString &);
- void setToolTip(const QString &);
- void setNoMargins(int = 0);
- void setNormalMargins(int = 0);
- void setContentsMargins(int left, int top, int right, int bottom);
- };
- class QTCREATOR_UTILS_EXPORT Label : public Widget
- {
- public:
- using Implementation = QLabel;
- using I = Building::BuilderItem<Label>;
- Label(std::initializer_list<I> ps);
- Label(const QString &text);
- void setText(const QString &);
- void setTextFormat(Qt::TextFormat);
- void setWordWrap(bool);
- void setTextInteractionFlags(Qt::TextInteractionFlags);
- void setOpenExternalLinks(bool);
- void onLinkHovered(const std::function<void(const QString &)> &, QObject *guard);
- };
- class QTCREATOR_UTILS_EXPORT Group : public Widget
- {
- public:
- using Implementation = QGroupBox;
- using I = Building::BuilderItem<Group>;
- Group(std::initializer_list<I> ps);
- void setTitle(const QString &);
- void setGroupChecker(const std::function<void(QObject *)> &);
- };
- class QTCREATOR_UTILS_EXPORT SpinBox : public Widget
- {
- public:
- using Implementation = QSpinBox;
- using I = Building::BuilderItem<SpinBox>;
- SpinBox(std::initializer_list<I> ps);
- void setValue(int);
- void onTextChanged(const std::function<void(QString)> &);
- };
- class QTCREATOR_UTILS_EXPORT PushButton : public Widget
- {
- public:
- using Implementation = QPushButton;
- using I = Building::BuilderItem<PushButton>;
- PushButton(std::initializer_list<I> ps);
- void setText(const QString &);
- void onClicked(const std::function<void()> &, QObject *guard);
- };
- class QTCREATOR_UTILS_EXPORT TextEdit : public Widget
- {
- public:
- using Implementation = QTextEdit;
- using I = Building::BuilderItem<TextEdit>;
- using Id = Implementation *;
- TextEdit(std::initializer_list<I> ps);
- void setText(const QString &);
- };
- class QTCREATOR_UTILS_EXPORT Splitter : public Widget
- {
- public:
- using Implementation = QSplitter;
- using I = Building::BuilderItem<Splitter>;
- Splitter(std::initializer_list<I> items);
- void setOrientation(Qt::Orientation);
- void setStretchFactor(int index, int stretch);
- void setChildrenCollapsible(bool collapsible);
- };
- class QTCREATOR_UTILS_EXPORT Stack : public Widget
- {
- public:
- using Implementation = QStackedWidget;
- using I = Building::BuilderItem<Stack>;
- Stack() : Stack({}) {}
- Stack(std::initializer_list<I> items);
- };
- class QTCREATOR_UTILS_EXPORT Tab : public Widget
- {
- public:
- using Implementation = QWidget;
- Tab(const QString &tabName, const Layout &inner);
- const QString tabName;
- const Layout inner;
- };
- class QTCREATOR_UTILS_EXPORT TabWidget : public Widget
- {
- public:
- using Implementation = QTabWidget;
- using I = Building::BuilderItem<TabWidget>;
- TabWidget(std::initializer_list<I> items);
- };
- class QTCREATOR_UTILS_EXPORT ToolBar : public Widget
- {
- public:
- using Implementation = QToolBar;
- using I = Building::BuilderItem<ToolBar>;
- ToolBar(std::initializer_list<I> items);
- };
- // Special
- class QTCREATOR_UTILS_EXPORT If
- {
- public:
- If(bool condition,
- const std::initializer_list<Layout::I> ifcase,
- const std::initializer_list<Layout::I> thencase = {});
- const std::initializer_list<Layout::I> used;
- };
- //
- // 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)
- {
- return Building::IdAndArg{BindToId{}, p};
- }
- template <typename Interface, typename P>
- void doit(Interface *x, BindToId, P p)
- {
- *p = static_cast<typename Interface::Implementation *>(x->ptr);
- }
- class IdId {};
- template<typename P>
- auto id(P p) { return Building::IdAndArg{IdId{}, p}; }
- template <typename Interface, typename P>
- void doit(Interface *x, IdId, P p)
- {
- **p = static_cast<typename Interface::Implementation *>(x->ptr);
- }
- // Setter dispatchers
- QTC_DEFINE_BUILDER_SETTER(childrenCollapsible, setChildrenCollapsible)
- QTC_DEFINE_BUILDER_SETTER(columnStretch, setColumnStretch)
- QTC_DEFINE_BUILDER_SETTER(customMargins, setContentsMargins)
- QTC_DEFINE_BUILDER_SETTER(fieldGrowthPolicy, setFieldGrowthPolicy)
- QTC_DEFINE_BUILDER_SETTER(groupChecker, setGroupChecker)
- QTC_DEFINE_BUILDER_SETTER(onClicked, onClicked)
- QTC_DEFINE_BUILDER_SETTER(onLinkHovered, onLinkHovered)
- QTC_DEFINE_BUILDER_SETTER(onTextChanged, onTextChanged)
- QTC_DEFINE_BUILDER_SETTER(openExternalLinks, setOpenExternalLinks)
- QTC_DEFINE_BUILDER_SETTER(orientation, setOrientation);
- QTC_DEFINE_BUILDER_SETTER(size, setSize)
- QTC_DEFINE_BUILDER_SETTER(text, setText)
- QTC_DEFINE_BUILDER_SETTER(textFormat, setTextFormat)
- QTC_DEFINE_BUILDER_SETTER(textInteractionFlags, setTextInteractionFlags)
- QTC_DEFINE_BUILDER_SETTER(title, setTitle)
- QTC_DEFINE_BUILDER_SETTER(toolTip, setToolTip)
- QTC_DEFINE_BUILDER_SETTER(windowTitle, setWindowTitle)
- QTC_DEFINE_BUILDER_SETTER(wordWrap, setWordWrap);
- // 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)
- {
- addToLayout(outer, std::forward<Inner>(inner));
- }
- template<typename Inner>
- void doit_nested(Widget *outer, Inner inner)
- {
- addToWidget(outer, inner);
- }
- template<typename Inner>
- void doit_nested(TabWidget *outer, Inner inner)
- {
- addToTabWidget(outer, inner);
- }
- template<typename Inner>
- void doit_nested(Stack *outer, Inner inner)
- {
- addToStack(outer, inner);
- }
- template<typename Inner>
- void doit_nested(Splitter *outer, Inner inner)
- {
- addToSplitter(outer, inner);
- }
- template <typename Outer, typename Inner>
- void doit(Outer outer, Building::NestId, Inner && inner)
- {
- doit_nested(outer, std::forward<Inner>(inner));
- }
- // Special layout items
- 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 LayoutModifier spacing(int space);
- // Convenience
- QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr);
- } // Layouting
|