Utils: Flatten LayoutBuilder related hierarchies

Originally the idea was to only expose LayoutBuilder, but we
are getting more and more related items. Be consequent now,
and have everything in Utils::Layouting, but not in nested classes.

Change-Id: Ic0f98595882e5c60a25c30ec52df4a0ea79bc0ca
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2023-01-19 13:51:52 +01:00
parent a37f2ae3a8
commit 642c593481
37 changed files with 227 additions and 218 deletions

View File

@@ -5,7 +5,6 @@
#include "utils_global.h"
#include <QList>
#include <QString>
#include <QVariant>
@@ -20,11 +19,11 @@ class QWidget;
QT_END_NAMESPACE
namespace Utils {
class BaseAspect;
class BoolAspect;
} // Utils
namespace Layouting {
namespace Utils::Layouting {
enum AttachType {
WithMargins,
@@ -32,19 +31,13 @@ enum AttachType {
WithFormAlignment, // Handle Grid similar to QFormLayout, i.e. use special alignment for the first column on Mac
};
} // Layouting
class LayoutBuilder;
class QTCREATOR_UTILS_EXPORT LayoutBuilder
// LayoutItem
class QTCREATOR_UTILS_EXPORT LayoutItem
{
public:
enum LayoutType {
HBoxLayout,
VBoxLayout,
FormLayout,
GridLayout,
StackLayout,
};
enum class AlignmentType {
DefaultAlignment,
AlignAsFormLabel,
@@ -59,29 +52,123 @@ public:
};
using Setter = std::function<void(QObject *target)>;
LayoutItem();
LayoutItem(QLayout *layout);
LayoutItem(QWidget *widget);
LayoutItem(BaseAspect *aspect); // Remove
LayoutItem(BaseAspect &aspect);
LayoutItem(const QString &text);
LayoutItem(const LayoutBuilder &builder);
LayoutItem(const Setter &setter) { this->setter = setter; }
class QTCREATOR_UTILS_EXPORT LayoutItem
{
public:
LayoutItem();
LayoutItem(QLayout *layout);
LayoutItem(QWidget *widget);
LayoutItem(BaseAspect *aspect); // Remove
LayoutItem(BaseAspect &aspect);
LayoutItem(const QString &text);
LayoutItem(const LayoutBuilder &builder);
LayoutItem(const Setter &setter) { this->setter = setter; }
QLayout *layout = nullptr;
QWidget *widget = nullptr;
BaseAspect *aspect = nullptr;
QLayout *layout = nullptr;
QWidget *widget = nullptr;
BaseAspect *aspect = nullptr;
QString text; // FIXME: Use specialValue for that
int span = 1;
AlignmentType align = AlignmentType::DefaultAlignment;
Setter setter;
SpecialType specialType = SpecialType::NotSpecial;
QVariant specialValue;
};
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 Space : public LayoutItem
{
public:
explicit Space(int space);
};
class QTCREATOR_UTILS_EXPORT Span : public LayoutItem
{
public:
Span(int span, const LayoutItem &item);
};
class QTCREATOR_UTILS_EXPORT Stretch : public LayoutItem
{
public:
explicit Stretch(int stretch = 1);
};
class QTCREATOR_UTILS_EXPORT Tab : public LayoutItem
{
public:
Tab(const QString &tabName, const LayoutBuilder &item);
};
class QTCREATOR_UTILS_EXPORT Break : public LayoutItem
{
public:
Break();
};
class QTCREATOR_UTILS_EXPORT HorizontalRule : public LayoutItem
{
public:
HorizontalRule();
};
class QTCREATOR_UTILS_EXPORT Group : public LayoutItem
{
public:
Group(std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT PushButton : public LayoutItem
{
public:
PushButton(std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT Splitter : public LayoutItem
{
public:
Splitter(std::initializer_list<LayoutItem> items);
Splitter(QSplitter *splitter, std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT TabWidget : public LayoutItem
{
public:
TabWidget(std::initializer_list<Tab> tabs);
TabWidget(QTabWidget *tabWidget, std::initializer_list<Tab> tabs);
};
// Singleton 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;
// "Properties"
QTCREATOR_UTILS_EXPORT LayoutItem::Setter title(const QString &title,
BoolAspect *checker = nullptr);
QTCREATOR_UTILS_EXPORT LayoutItem::Setter text(const QString &text);
QTCREATOR_UTILS_EXPORT LayoutItem::Setter tooltip(const QString &toolTip);
QTCREATOR_UTILS_EXPORT LayoutItem::Setter onClicked(const std::function<void()> &func,
QObject *guard = nullptr);
// Convenience
QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr);
// LayoutBuilder
class QTCREATOR_UTILS_EXPORT LayoutBuilder
{
public:
enum LayoutType {
HBoxLayout,
VBoxLayout,
FormLayout,
GridLayout,
StackLayout,
};
using LayoutItems = QList<LayoutItem>;
@@ -109,43 +196,9 @@ public:
void attachTo(QWidget *w, Layouting::AttachType attachType = Layouting::WithMargins) const;
QWidget *emerge(Layouting::AttachType attachType = Layouting::WithMargins);
class QTCREATOR_UTILS_EXPORT Space : public LayoutItem
{
public:
explicit Space(int space);
};
class QTCREATOR_UTILS_EXPORT Span : public LayoutItem
{
public:
Span(int span, const LayoutItem &item);
};
class QTCREATOR_UTILS_EXPORT Stretch : public LayoutItem
{
public:
explicit Stretch(int stretch = 1);
};
class QTCREATOR_UTILS_EXPORT Tab : public LayoutItem
{
public:
Tab(const QString &tabName, const LayoutBuilder &item);
};
class QTCREATOR_UTILS_EXPORT Break : public LayoutItem
{
public:
Break();
};
class QTCREATOR_UTILS_EXPORT HorizontalRule : public LayoutItem
{
public:
HorizontalRule();
};
protected:
friend class LayoutItem;
explicit LayoutBuilder(); // Adds to existing layout.
QLayout *createLayout() const;
@@ -167,47 +220,6 @@ private:
Layouting::AttachType m_attachType = {};
};
namespace Layouting {
using Space = LayoutBuilder::Space;
using Span = LayoutBuilder::Span;
using Tab = LayoutBuilder::Tab;
QTCREATOR_UTILS_EXPORT LayoutBuilder::Setter title(const QString &title,
BoolAspect *checker = nullptr);
QTCREATOR_UTILS_EXPORT LayoutBuilder::Setter text(const QString &text);
QTCREATOR_UTILS_EXPORT LayoutBuilder::Setter tooltip(const QString &toolTip);
QTCREATOR_UTILS_EXPORT LayoutBuilder::Setter onClicked(const std::function<void()> &func,
QObject *guard = nullptr);
QTCREATOR_UTILS_EXPORT QWidget *createHr(QWidget *parent = nullptr);
class QTCREATOR_UTILS_EXPORT Group : public LayoutBuilder::LayoutItem
{
public:
Group(std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT PushButton : public LayoutBuilder::LayoutItem
{
public:
PushButton(std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT Splitter : public LayoutBuilder::LayoutItem
{
public:
Splitter(std::initializer_list<LayoutItem> items);
Splitter(QSplitter *splitter, std::initializer_list<LayoutItem> items);
};
class QTCREATOR_UTILS_EXPORT TabWidget : public LayoutBuilder::LayoutItem
{
public:
TabWidget(std::initializer_list<Tab> tabs);
TabWidget(QTabWidget *tabWidget, std::initializer_list<Tab> tabs);
};
class QTCREATOR_UTILS_EXPORT Column : public LayoutBuilder
{
public:
@@ -243,10 +255,4 @@ public:
Stack(std::initializer_list<LayoutItem> items) : LayoutBuilder(StackLayout, items) {}
};
QTCREATOR_UTILS_EXPORT extern LayoutBuilder::Break br;
QTCREATOR_UTILS_EXPORT extern LayoutBuilder::Stretch st;
QTCREATOR_UTILS_EXPORT extern LayoutBuilder::Space empty;
QTCREATOR_UTILS_EXPORT extern LayoutBuilder::HorizontalRule hr;
} // Layouting
} // Utils
} // Utils::Layouting