From 8f73ec6c6c18ea5676261064399a650911333da5 Mon Sep 17 00:00:00 2001 From: DS Date: Sun, 8 Dec 2019 18:59:30 +0100 Subject: [PATCH] Formspec: make bgcolor element less confusing and allow setting fullscreen color (#8996) --- doc/lua_api.txt | 16 ++++++++++---- src/gui/guiFormSpecMenu.cpp | 40 ++++++++++++++++++++++++----------- src/gui/guiFormSpecMenu.h | 1 + src/network/networkprotocol.h | 1 + 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index f3e21bbc5..7ba3ad77d 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2104,11 +2104,19 @@ Elements * Show an inventory image of registered item/node -### `bgcolor[;]` +### `bgcolor[;;]` -* Sets background color of formspec as `ColorString` -* If `true`, a fullscreen background is drawn and the color is ignored - (does not affect the size of the formspec) +* Sets background color of formspec. +* `bgcolor` and `fbgcolor` (optional) are `ColorString`s, they define the color + of the non-fullscreen and the fullscreen background. +* `fullscreen` (optional) can be one of the following: + * `false`: Only the non-fullscreen background color is drawn. (default) + * `true`: Only the fullscreen background color is drawn. + * `both`: The non-fullscreen and the fullscreen background color are drawn. + * `neither`: No background color is drawn. +* Note: Leave a parameter empty to not modify the value. +* Note: `fbgcolor`, leaving parameters empty and values for `fullscreen` that + are not bools are only available since formspec version 3. ### `background[,;,;]` diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 26ca525c8..ed3445b5b 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -2178,21 +2178,36 @@ void GUIFormSpecMenu::parseBox(parserData* data, const std::string &element) void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string &element) { std::vector parts = split(element,';'); + const u32 parameter_count = parts.size(); - if (((parts.size() == 1) || (parts.size() == 2)) || - ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION))) { - parseColorString(parts[0], m_bgcolor, false); - - if (parts.size() == 2) { - std::string fullscreen = parts[1]; - m_bgfullscreen = is_yes(fullscreen); - } - + if ((parameter_count > 2 && m_formspec_version < 3) || + (parameter_count > 3 && m_formspec_version <= FORMSPEC_API_VERSION)) { + errorstream << "Invalid bgcolor element(" << parameter_count << "): '" + << element << "'" << std::endl; return; } - errorstream << "Invalid bgcolor element(" << parts.size() << "): '" << element << "'" - << std::endl; + // bgcolor + if (parameter_count >= 1 && parts[0] != "") + parseColorString(parts[0], m_bgcolor, false); + + // fullscreen + if (parameter_count >= 2) { + if (parts[1] == "both") { + m_bgnonfullscreen = true; + m_bgfullscreen = true; + } else if (parts[1] == "neither") { + m_bgnonfullscreen = false; + m_bgfullscreen = false; + } else if (parts[1] != "" || m_formspec_version < 3) { + m_bgfullscreen = is_yes(parts[1]); + m_bgnonfullscreen = !m_bgfullscreen; + } + } + + // fbgcolor + if (parameter_count >= 3 && parts[2] != "") + parseColorString(parts[2], m_fullscreen_bgcolor, false); } void GUIFormSpecMenu::parseListColors(parserData* data, const std::string &element) @@ -2735,6 +2750,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) theme_by_name.clear(); theme_by_type.clear(); + m_bgnonfullscreen = true; m_bgfullscreen = false; m_formspec_version = 1; @@ -3312,7 +3328,7 @@ void GUIFormSpecMenu::drawMenu() if (m_bgfullscreen) driver->draw2DRectangle(m_fullscreen_bgcolor, allbg, &allbg); - else + if (m_bgnonfullscreen) driver->draw2DRectangle(m_bgcolor, AbsoluteRect, &AbsoluteClippingRect); /* diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 3a3a74c05..d6c762866 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -369,6 +369,7 @@ protected: bool m_lock = false; v2u32 m_lockscreensize; + bool m_bgnonfullscreen; bool m_bgfullscreen; bool m_slotborder; video::SColor m_bgcolor; diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index f74027828..a2be181fb 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -231,6 +231,7 @@ with this program; if not, write to the Free Software Foundation, Inc., background9[]: 9-slice scaling parameters FORMSPEC VERSION 3: Formspec elements are drawn in the order of definition + bgcolor[]: use 3 parameters (bgcolor, formspec (now an enum), fbgcolor) */ #define FORMSPEC_API_VERSION 3