diff --git a/src/plugins/lua/bindings/action.cpp b/src/plugins/lua/bindings/action.cpp index 50ab25237bb..6ef4b852302 100644 --- a/src/plugins/lua/bindings/action.cpp +++ b/src/plugins/lua/bindings/action.cpp @@ -55,8 +55,8 @@ void setupActionModule() cmd->m_contextAction->setText(text); }), "icon", - sol::property([](ScriptCommand *cmd, const FilePathOrString &&icon) { - cmd->m_contextAction->setIcon(QIcon(toFilePath(icon).toFSPathString())); + sol::property([](ScriptCommand *cmd, const IconFilePathOrString &&icon) { + cmd->m_contextAction->setIcon(toIcon(icon)->icon()); })); result["create"] = [parent = std::make_unique()]( @@ -100,7 +100,7 @@ void setupActionModule() "asMode needs an integer argument for the priority"); } } else if (key == "icon") { - b.setIcon(QIcon(toFilePath(v.as()).toFSPathString())); + b.setIcon(toIcon(v.as())->icon()); } else throw std::runtime_error("Unknown key: " + key.toStdString()); } diff --git a/src/plugins/lua/bindings/gui.cpp b/src/plugins/lua/bindings/gui.cpp index 83db3410841..ed7f67b9fdf 100644 --- a/src/plugins/lua/bindings/gui.cpp +++ b/src/plugins/lua/bindings/gui.cpp @@ -4,6 +4,7 @@ #include "../luaengine.h" #include "inheritance.h" +#include "utils.h" #include #include @@ -418,14 +419,8 @@ void setupGuiModule() sol::base_classes, sol::bases()); - auto mirrorEnum = [&gui](QMetaEnum metaEnum) { - sol::table widgetAttributes = gui.create(metaEnum.name()); - for (int i = 0; i < metaEnum.keyCount(); ++i) - widgetAttributes.set(metaEnum.key(i), metaEnum.value(i)); - }; - - mirrorEnum(QMetaEnum::fromType()); - mirrorEnum(QMetaEnum::fromType()); + mirrorEnum(gui, QMetaEnum::fromType()); + mirrorEnum(gui, QMetaEnum::fromType()); gui.new_usertype( "Stack", diff --git a/src/plugins/lua/bindings/utils.cpp b/src/plugins/lua/bindings/utils.cpp index 83345e847a8..2c76f1285d5 100644 --- a/src/plugins/lua/bindings/utils.cpp +++ b/src/plugins/lua/bindings/utils.cpp @@ -4,10 +4,13 @@ #include "../luaengine.h" #include "../luaqttypes.h" +#include "utils.h" + #include #include #include #include +#include #include #include @@ -244,6 +247,33 @@ void setupUtilsModule() return QString::fromUtf8(QByteArray::fromBase64(data)); }; + utils.new_enum( + "IconStyleOption", + {{"None", Icon::None}, + {"Tint", Icon::Tint}, + {"DropShadow", Icon::DropShadow}, + {"PunchEdges", Icon::PunchEdges}, + {"ToolBarStyle", Icon::ToolBarStyle}, + {"MenuTintedStyle", Icon::MenuTintedStyle}}); + + mirrorEnum(utils, QMetaEnum::fromType(), "ThemeColor"); + + auto iconType = utils.new_usertype( + "Icon", + "create", + sol::factories( + [](FilePathOrString path) { return std::make_shared(toFilePath(path)); }, + [](const sol::table &maskAndColor, Icon::IconStyleOption style) { + QList args; + for (const auto &it : maskAndColor) { + auto pair = it.second.as(); + args.append(qMakePair( + toFilePath(pair.get(1)), + pair.get(2))); + } + return std::make_shared(args, Icon::IconStyleOptions::fromInt(style)); + })); + return utils; }); } diff --git a/src/plugins/lua/bindings/utils.h b/src/plugins/lua/bindings/utils.h index 183fb1cc29b..a6b65c762d0 100644 --- a/src/plugins/lua/bindings/utils.h +++ b/src/plugins/lua/bindings/utils.h @@ -3,7 +3,12 @@ #pragma once +#include "../luaengine.h" + #include +#include + +#include namespace Lua::Internal { @@ -22,4 +27,27 @@ inline Utils::FilePath toFilePath(const FilePathOrString &v) v); } +using IconFilePathOrString = std::variant, Utils::FilePath, QString>; + +inline std::shared_ptr toIcon(const IconFilePathOrString &v) +{ + return std::visit( + [](auto &&arg) -> std::shared_ptr { + using T = std::decay_t; + if constexpr (std::is_same_v>) + return arg; + else + return std::make_shared(toFilePath(arg)); + }, + v); +} + +inline void mirrorEnum(sol::table &target, QMetaEnum metaEnum, const QString &name = {}) +{ + sol::table widgetAttributes = target.create( + name.isEmpty() ? QString::fromUtf8(metaEnum.name()) : name, metaEnum.keyCount()); + for (int i = 0; i < metaEnum.keyCount(); ++i) + widgetAttributes.set(metaEnum.key(i), metaEnum.value(i)); +}; + } // namespace Lua::Internal