// Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "../luaengine.h" #include "inheritance.h" #include #include using namespace Layouting; using namespace Utils; namespace Lua::Internal { static void processChildren(LayoutItem *item, sol::table children) { for (size_t i = 1; i <= children.size(); ++i) { sol::object v = children[i]; if (v.is()) { item->addItem(*v.as()); } else if (v.is()) { v.as()->addToLayout(*item); } else if (v.is()) { item->addItem(v.as()); } else if (v.is()) { sol::function f = v.as(); auto res = LuaEngine::safe_call(f); QTC_ASSERT_EXPECTED(res, continue); item->addItem(**res); } else { qWarning() << "Incompatible object added to layout item: " << (int) v.get_type() << " (expected LayoutItem, Aspect or function returning LayoutItem)"; } } } template static std::unique_ptr construct(Args &&...args, sol::table children) { std::unique_ptr item(new T(std::forward(args)..., {})); processChildren(item.get(), children); return item; } void addLayoutModule() { LuaEngine::registerProvider("Layout", [](sol::state_view l) -> sol::object { sol::table layout = l.create_table(); layout.new_usertype("LayoutItem", "attachTo", &LayoutItem::attachTo); layout["Span"] = [](int span, LayoutItem *item) { return createItem(item, Span(span, *item)); }; layout["Space"] = [](int space) { return createItem(nullptr, Space(space)); }; layout["Stretch"] = [](int stretch) { return createItem(nullptr, Stretch(stretch)); }; layout.new_usertype("Column", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Row", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Flow", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Grid", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype
("Form", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Widget", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Stack", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype( "Tab", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("TextEdit", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("PushButton", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("SpinBox", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Splitter", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("ToolBar", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("TabWidget", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout.new_usertype("Group", sol::call_constructor, sol::factories(&construct), sol::base_classes, sol::bases()); layout["br"] = &br; layout["st"] = &st; layout["empty"] = ∅ layout["hr"] = &hr; layout["noMargin"] = &noMargin; layout["normalMargin"] = &normalMargin; layout["customMargin"] = [](int left, int top, int right, int bottom) { return customMargin(QMargins(left, top, right, bottom)); }; layout["withFormAlignment"] = &withFormAlignment; layout["title"] = &title; layout["text"] = &text; layout["tooltip"] = &tooltip; layout["resize"] = &resize; layout["columnStretch"] = &columnStretch; layout["spacing"] = &spacing; layout["windowTitle"] = &windowTitle; layout["fieldGrowthPolicy"] = &fieldGrowthPolicy; layout["id"] = &id; layout["setText"] = &setText; layout["onClicked"] = [](sol::function f) { return onClicked([f]() { auto res = LuaEngine::void_safe_call(f); QTC_CHECK_EXPECTED(res); }); }; layout["onTextChanged"] = [](sol::function f) { return onTextChanged([f](const QString &text) { auto res = LuaEngine::void_safe_call(f, text); QTC_CHECK_EXPECTED(res); }); }; return layout; }); } } // namespace Lua::Internal