From 7dffd08c1a068e5e0748a046fd8a1e884947b597 Mon Sep 17 00:00:00 2001 From: v-rob Date: Sun, 1 Mar 2020 06:39:57 -0800 Subject: [PATCH] Add multiple element selection to `style` and `style_type` (#9380) --- doc/lua_api.txt | 17 +++++++++++------ games/minimal/mods/test/formspec.lua | 15 +++------------ src/gui/guiFormSpecMenu.cpp | 26 +++++++++++++++----------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6ff7f802a..4b7132828 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2495,16 +2495,16 @@ Elements * `span=`: number of following columns to affect (default: infinite). -### `style[;;;...]` +### `style[,,...;;;...]` -* Set the style for the named element `name`. +* Set the style for the named element(s) `name`. * Note: this **must** be before the element is defined. * See [Styling Formspecs]. -### `style_type[;;;...]` +### `style_type[,,...;;;...]` -* Sets the style for all elements of type `type` which appear after this element. +* Sets the style for all elements of type(s) `type` which appear after this element. * See [Styling Formspecs]. Migrating to Real Coordinates @@ -2547,13 +2547,18 @@ Styling Formspecs Formspec elements can be themed using the style elements: - style[;;;...] - style_type[;;;...] + style[,,...;;;...] + style_type[,,...;;;...] Where a prop is: property_name=property_value +A name/type can optionally be a comma separated list of names/types, like so: + + world_delete,world_create,world_configure + button,image_button + For example: style_type[button;bgcolor=#006699] diff --git a/games/minimal/mods/test/formspec.lua b/games/minimal/mods/test/formspec.lua index 50c506899..a836a811d 100644 --- a/games/minimal/mods/test/formspec.lua +++ b/games/minimal/mods/test/formspec.lua @@ -1,18 +1,9 @@ local color = minetest.colorize local clip_fs = [[ - style_type[label;noclip=%c] - style_type[button;noclip=%c] - style_type[image_button;noclip=%c] - style_type[item_image_button;noclip=%c] - style_type[tabheader;noclip=%c] - style_type[field;noclip=%c] - style_type[textarea;noclip=%c] - style_type[checkbox;noclip=%c] - style_type[dropdown;noclip=%c] - style_type[scrollbar;noclip=%c] - style_type[table;noclip=%c] - style_type[animated_image;noclip=%c] + style_type[label,button,image_button,item_image_button, + tabheader,scrollbar,table,animated_image + ,field,textarea,checkbox,dropdown;noclip=%c] label[0,0;A clipping test] button[0,1;3,0.8;x;A clipping test] diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 40c3bbdae..d892555b3 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -2450,13 +2450,6 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b return false; } - std::string selector = trim(parts[0]); - if (selector.empty()) { - errorstream << "Invalid style element (Selector required): '" << element - << "'" << std::endl; - return false; - } - StyleSpec spec; for (size_t i = 1; i < parts.size(); i++) { @@ -2486,10 +2479,21 @@ bool GUIFormSpecMenu::parseStyle(parserData *data, const std::string &element, b spec.set(prop, value); } - if (style_type) { - theme_by_type[selector] |= spec; - } else { - theme_by_name[selector] |= spec; + std::vector selectors = split(parts[0], ','); + for (size_t sel = 0; sel < selectors.size(); sel++) { + std::string selector = trim(selectors[sel]); + + if (selector.empty()) { + errorstream << "Invalid style element (Empty selector): '" << element + << "'" << std::endl; + continue; + } + + if (style_type) { + theme_by_type[selector] |= spec; + } else { + theme_by_name[selector] |= spec; + } } return true; -- 2.25.1