diff --git a/src/plugins/lua/bindings/settings.cpp b/src/plugins/lua/bindings/settings.cpp index fedbdff2320..03a29ded881 100644 --- a/src/plugins/lua/bindings/settings.cpp +++ b/src/plugins/lua/bindings/settings.cpp @@ -305,10 +305,58 @@ void addSettingsModule() addTypedAspect(settings, "BoolAspect"); addTypedAspect(settings, "ColorAspect"); - addTypedAspect(settings, "SelectionAspect"); addTypedAspect(settings, "MultiSelectionAspect"); addTypedAspect(settings, "StringAspect"); + settings.new_usertype( + "SelectionAspect", + "create", + [](const sol::table &options) { + return createAspectFromTable( + options, + [](SelectionAspect *aspect, const std::string &key, const sol::object &value) { + if (key == "options") { + sol::table options = value.as(); + for (size_t i = 1; i <= options.size(); ++i) { + sol::optional optiontable + = options[i].get>(); + if (optiontable) { + sol::table option = *optiontable; + sol::optional data = option["data"]; + if (data) { + aspect->addOption( + {option["name"], + option["tooltip"].get_or(QString()), + *data}); + } else { + aspect->addOption( + option["name"], option["tooltip"].get_or(QString())); + } + } else if ( + sol::optional name + = options[i].get>()) { + aspect->addOption(*name); + } else { + throw sol::error("Invalid option type"); + } + } + } else if (key == "displayStyle") { + aspect->setDisplayStyle((SelectionAspect::DisplayStyle) value.as()); + } else + typedAspectCreate(aspect, key, value); + }); + }, + "stringValue", + sol::property(&SelectionAspect::stringValue, &SelectionAspect::setStringValue), + "addOption", + sol::overload( + [](SelectionAspect &self, const QString &name) { self.addOption(name); }, + [](SelectionAspect &self, const QString &name, const QString &tooltip) { + self.addOption(name, tooltip); + }), + sol::base_classes, + sol::bases, BaseAspect>()); + auto filePathAspectType = addTypedAspect(settings, "FilePathAspect"); filePathAspectType.set( "setValue", @@ -524,6 +572,11 @@ void addSettingsModule() "PasswordLineEdit", StringAspect::DisplayStyle::PasswordLineEditDisplay ); + settings["SelectionDisplayStyle"] = l.create_table_with( + "RadioButtons", SelectionAspect::DisplayStyle::RadioButtons, + "ComboBox", SelectionAspect::DisplayStyle::ComboBox + ); + settings["CheckBoxPlacement"] = l.create_table_with( "Top", CheckBoxPlacement::Top, "Right", CheckBoxPlacement::Right diff --git a/src/plugins/lua/meta/settings.lua b/src/plugins/lua/meta/settings.lua index 714b5d29f96..4a4cd3ee7d9 100644 --- a/src/plugins/lua/meta/settings.lua +++ b/src/plugins/lua/meta/settings.lua @@ -73,9 +73,34 @@ function settings.BoolAspect.create(options) end settings.ColorAspect = {} function settings.ColorAspect.create(options) end +---@class SelectionAspect : TypedAspect +---@field stringValue string The string value of the aspect. settings.SelectionAspect = {} +---@enum SelectionDisplayStyle +settings.SelectionDisplayStyle = { + RadioButtons = 0, + ComboBox = 0 +}; + +---@class SelectionOption +---@field name string The name of the option. +---@field tooltip? string The tooltip of the option. +---@field data? any The data of the option. +SelectionOption = {} + +---@class SelectionAspectCreate : TypedAspectCreate +---@field displayStyle? SelectionDisplayStyle The display type of the aspect. +---@field options? string[]|SelectionOption[] The available options. +SelectionAspectCreate = {} + +---Creates a new SelectionAspect +---@param options SelectionAspectCreate +---@return SelectionAspect aspect The Aspect function settings.SelectionAspect.create(options) end +function settings.SelectionAspect:addOption(option) end + +function settings.SelectionAspect:addOption(option, tooltip) end settings.MultiSelectionAspect = {} function settings.MultiSelectionAspect.create(options) end