From 964c8da31a8595e7528d4732f5a5d4ea804022c6 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 20 Aug 2024 08:38:43 +0200 Subject: [PATCH] Lua: Fix Span bindings Change-Id: I335d5cae55a7cec7edb824b131bec185143ad583 Reviewed-by: Cristian Adam --- src/plugins/lua/bindings/gui.cpp | 38 +++++++++++++++++++++++--------- src/plugins/lua/meta/gui.lua | 26 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/plugins/lua/bindings/gui.cpp b/src/plugins/lua/bindings/gui.cpp index b52a840c96c..0ea039d0757 100644 --- a/src/plugins/lua/bindings/gui.cpp +++ b/src/plugins/lua/bindings/gui.cpp @@ -191,24 +191,40 @@ std::unique_ptr constructTab(const QString &tabName, const Layout &layout) std::unique_ptr constructSpanFromTable(const sol::table &children) { - if (children.size() != 2) - throw sol::error("Span must have exactly two children"); + if (children.size() != 2 && children.size() != 3) + throw sol::error("Span must have two or three children"); auto spanSize = children[1]; if (spanSize.get_type() != sol::type::number) - throw sol::error("Span size (first argument) must be a number"); + throw sol::error("Span columns (first argument) must be a number"); - const auto &layout = children[2]; - if (!layout.is()) - throw sol::error("Span child (second argument) must be a Layout"); + const auto &layout_or_row = children[2]; + if (!layout_or_row.is() && layout_or_row.get_type() != sol::type::number) + throw sol::error("Span child (second argument) must be a Layout or number"); - std::unique_ptr item = std::make_unique(spanSize, *layout.get()); + if (layout_or_row.get_type() == sol::type::number) { + const auto &layout = children[3]; + if (!layout.is()) + throw sol::error("Span child (third argument) must be a Layout"); + + std::unique_ptr item = std::make_unique( + spanSize.get(), layout_or_row.get(), *layout.get()); + return item; + } + + std::unique_ptr item = std::make_unique(spanSize, *layout_or_row.get()); return item; } -std::unique_ptr constructSpan(int n, const Layout &layout) +std::unique_ptr constructSpan(int c, const Layout &layout) { - std::unique_ptr item = std::make_unique(n, layout); + std::unique_ptr item = std::make_unique(c, layout); + return item; +} + +std::unique_ptr constructSpanWithRow(int c, int r, const Layout &layout) +{ + std::unique_ptr item = std::make_unique(c, r, layout); return item; } @@ -252,7 +268,9 @@ void setupGuiModule() sol::table gui = l.create_table(); gui.new_usertype( - "Span", sol::call_constructor, sol::factories(&constructSpan, &constructSpanFromTable)); + "Span", + sol::call_constructor, + sol::factories(&constructSpan, &constructSpanWithRow, &constructSpanFromTable)); gui.new_usertype("Space", sol::call_constructor, sol::constructors()); diff --git a/src/plugins/lua/meta/gui.lua b/src/plugins/lua/meta/gui.lua index 4e7297047f1..c7f0d383e83 100644 --- a/src/plugins/lua/meta/gui.lua +++ b/src/plugins/lua/meta/gui.lua @@ -220,4 +220,30 @@ gui.WindowType = { WindowFullscreenButtonHint = 0, } +---@class Span : Layout +gui.span = {} + +---@class SpanOptions +---@field [1] integer The number of columns to span. +---@field [2] Layout The inner layout to span. + +---@class SpanOptionsWithRow +---@field [1] integer The number of columns to span. +---@field [2] integer The number of rows to span. +---@field [3] Layout The inner layout. + +---@param options SpanOptions|SpanOptionsWithRow +---@return Span +function gui.Span(options) end + +---@param col integer The number of columns to span. +---@param layout Layout The inner layout. +---@return Span +function gui.Span(col, layout) end + +---@param col integer The number of columns to span. +---@param row integer The number of rows to span. +---@param layout Layout The inner layout. +---@return Span +function gui.Span(col, row, layout) end return gui