From 644e88ae2eef1e3042ef27e26a3f60141055ce85 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 12 Oct 2023 10:01:49 +0200 Subject: [PATCH] Utils: Emerge widgets from LayoutItem This allows us to call e.g. PushButton{}.emerge(); without having to add another unnecessary layout. Change-Id: Ica26f4776dee1843e1f40c238e1f3c1a54d14ea5 Reviewed-by: hjk --- src/libs/utils/layoutbuilder.cpp | 34 +++++++++++++++++-- .../tst_manual_widgets_layoutbuilder.cpp | 11 ++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/libs/utils/layoutbuilder.cpp b/src/libs/utils/layoutbuilder.cpp index a61a5fc474b..7fa3d5adf33 100644 --- a/src/libs/utils/layoutbuilder.cpp +++ b/src/libs/utils/layoutbuilder.cpp @@ -573,9 +573,26 @@ void LayoutItem::attachTo(QWidget *w) const QWidget *LayoutItem::emerge() { - auto w = new QWidget; - attachTo(w); - return w; + LayoutBuilder builder; + + builder.stack.append(Slice()); + addItemHelper(builder, *this); + + if (builder.stack.empty()) + return nullptr; + + QTC_ASSERT(builder.stack.last().pendingItems.size() == 1, return nullptr); + ResultItem ri = builder.stack.last().pendingItems.takeFirst(); + + QTC_ASSERT(ri.layout || ri.widget, return nullptr); + + if (ri.layout) { + auto w = new QWidget; + w->setLayout(ri.layout); + return w; + } + + return ri.widget; } static void layoutExit(LayoutBuilder &builder) @@ -861,6 +878,17 @@ LayoutItem title(const QString &title) }; } +LayoutItem windowTitle(const QString &windowTitle) +{ + return [windowTitle](QObject *target) { + if (auto widget = qobject_cast(target)) { + widget->setWindowTitle(windowTitle); + } else { + QTC_CHECK(false); + } + }; +} + LayoutItem text(const QString &text) { return [text](QObject *target) { diff --git a/tests/manual/widgets/layoutbuilder/tst_manual_widgets_layoutbuilder.cpp b/tests/manual/widgets/layoutbuilder/tst_manual_widgets_layoutbuilder.cpp index 03a1cbc4bef..26ffe7f80f8 100644 --- a/tests/manual/widgets/layoutbuilder/tst_manual_widgets_layoutbuilder.cpp +++ b/tests/manual/widgets/layoutbuilder/tst_manual_widgets_layoutbuilder.cpp @@ -38,5 +38,16 @@ int main(int argc, char *argv[]) }, }.emerge()->show(); + Group { + windowTitle("Group without parent layout"), + title("This group was emerged without parent layout"), + Column { + Splitter { + new QTextEdit("First Widget"), + new QTextEdit("Second Widget"), + }, + } + }.emerge()->show(); + return app.exec(); }