]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Formspec: Add options to set background color and opacity (fullscreen mode + default...
authorLoïc Blot <nerzhul@users.noreply.github.com>
Tue, 29 Aug 2017 17:25:16 +0000 (19:25 +0200)
committerGitHub <noreply@github.com>
Tue, 29 Aug 2017 17:25:16 +0000 (19:25 +0200)
* Formspec: Add options to set background color and opacity (fullscreen mode)

* Enhance previous comment: Set formspec background when regenerate UI.

* This permit to do the calcul only at regen and override it with bgcolor tag
* Add a setting for default background color into formspec, separated from fullscreen
* Add a little performance gain on formspecs using a const ref instead of copying formspec string

builtin/settingtypes.txt
minetest.conf.example
src/defaultsettings.cpp
src/game.cpp
src/guiFormSpecMenu.cpp
src/guiFormSpecMenu.h

index a3a4e961a75bdad87b403bbcb9b44d614f605bf6..9dedd8b8dd90d403f7d78aa7154368d6932d1606 100644 (file)
@@ -606,6 +606,18 @@ console_color (Console color) string (0,0,0)
 #    In-game chat console background alpha (opaqueness, between 0 and 255).
 console_alpha (Console alpha) int 200 0 255
 
+#    Formspec full-screen background opacity (between 0 and 255).
+formspec_fullscreen_bg_opacity (Formspec Full-Screen Background Opacity) int 140 0 255
+
+#    Formspec full-screen background color (R,G,B).
+formspec_fullscreen_bg_color (Formspec Full-Screen Background Color) string (0,0,0)
+
+#    Formspec default background opacity (between 0 and 255).
+formspec_default_bg_opacity (Formspec Default Background Opacity) int 140 0 255
+
+#    Formspec default background color (R,G,B).
+formspec_default_bg_color (Formspec Default Background Color) string (0,0,0)
+
 #    Selection box border color (R,G,B).
 selectionbox_color (Selection box color) string (0,0,0)
 
index 6413d136a9e05a319da7d8100d3b736a6c96cb8c..9ce5bbd497e3aa90664592567d11b6ef82bcf7ca 100644 (file)
 #    type: int min: 0 max: 255
 # console_alpha = 200
 
+#    Formspec full-screen background opacity (between 0 and 255).
+#    type: int
+# formspec_fullscreen_bg_opacity = 140
+
+#    Formspec full-screen background color (R,G,B).
+#    type: string
+# formspec_fullscreen_bg_color = (0,0,0)
+
+#    Formspec default background opacity (between 0 and 255).
+#    type: int
+# formspec_default_bg_opacity = 140
+
+#    Formspec default background color (R,G,B).
+#    type: string
+# formspec_default_bg_color = (0,0,0)
+
 #    Selection box border color (R,G,B).
 #    type: string
 # selectionbox_color = (0,0,0)
index 502223fcd86b12d37bb6df7121b889a441e11101..2a3003f76ee2d2d6dc799d7394e039cedc2410d2 100644 (file)
@@ -187,6 +187,10 @@ void set_default_settings(Settings *settings)
        settings->setDefault("console_height", "1.0");
        settings->setDefault("console_color", "(0,0,0)");
        settings->setDefault("console_alpha", "200");
+       settings->setDefault("formspec_fullscreen_bg_color", "(0,0,0)");
+       settings->setDefault("formspec_fullscreen_bg_opacity", "140");
+       settings->setDefault("formspec_default_bg_color", "(0,0,0)");
+       settings->setDefault("formspec_default_bg_opacity", "140");
        settings->setDefault("selectionbox_color", "(0,0,0)");
        settings->setDefault("selectionbox_width", "2");
        settings->setDefault("node_highlighting", "box");
index 17ab68e7c8e4e81dea3b5038c8d663ff1cd2b14d..8a2ca00a25b7185ff70d56ca8b1ea7690b648fe1 100644 (file)
@@ -185,6 +185,7 @@ struct LocalFormspecHandler : public TextDest
 
 /* Form update callback */
 
+static const std::string empty_string = "";
 class NodeMetadataFormSource: public IFormSource
 {
 public:
@@ -193,12 +194,12 @@ class NodeMetadataFormSource: public IFormSource
                m_p(p)
        {
        }
-       std::string getForm()
+       const std::string &getForm() const
        {
                NodeMetadata *meta = m_map->getNodeMetadata(m_p);
 
                if (!meta)
-                       return "";
+                       return empty_string;
 
                return meta->getString("formspec");
        }
@@ -224,7 +225,8 @@ class PlayerInventoryFormSource: public IFormSource
                m_client(client)
        {
        }
-       std::string getForm()
+
+       const std::string &getForm() const
        {
                LocalPlayer *player = m_client->getEnv().getLocalPlayer();
                return player->inventory_formspec;
index 5ae6526017f2d8d7bdcf51e3ab93823e6778a92e..7b7bd7c29d2329ac2d8b3c8d48bca0a7d896e692 100644 (file)
@@ -79,6 +79,11 @@ static unsigned int font_line_height(gui::IGUIFont *font)
        return font->getDimension(L"Ay").Height + font->getKerningHeight();
 }
 
+inline u32 clamp_u8(s32 value)
+{
+       return (u32) MYMIN(MYMAX(value, 0), 255);
+}
+
 GUIFormSpecMenu::GUIFormSpecMenu(JoystickController *joystick,
                gui::IGUIElement *parent, s32 id, IMenuManager *menumgr,
                Client *client, ISimpleTextureSource *tsrc, IFormSource *fsrc, TextDest *tdst,
@@ -1567,17 +1572,19 @@ void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string &
        std::vector<std::string> parts = split(element,';');
 
        if (((parts.size() == 1) || (parts.size() == 2)) ||
-               ((parts.size() > 2) && (m_formspec_version > FORMSPEC_API_VERSION)))
-       {
-               parseColorString(parts[0],m_bgcolor,false);
+                       ((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);
                }
+
                return;
        }
-       errorstream<< "Invalid bgcolor element(" << parts.size() << "): '" << element << "'"  << std::endl;
+
+       errorstream << "Invalid bgcolor element(" << parts.size() << "): '" << element << "'"
+                       << std::endl;
 }
 
 void GUIFormSpecMenu::parseListColors(parserData* data, const std::string &element)
@@ -1908,9 +1915,8 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element)
        }
 
        // Ignore others
-       infostream
-               << "Unknown DrawSpec: type="<<type<<", data=\""<<description<<"\""
-               <<std::endl;
+       infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\""
+                       << std::endl;
 }
 
 void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
@@ -1978,10 +1984,29 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
        m_static_texts.clear();
        m_dropdowns.clear();
 
-       // Set default values (fits old formspec values)
-       m_bgcolor = video::SColor(140,0,0,0);
        m_bgfullscreen = false;
 
+       {
+               v3f formspec_bgcolor = g_settings->getV3F("formspec_default_bg_color");
+               m_bgcolor = video::SColor(
+                       (u8) clamp_u8(g_settings->getS32("formspec_default_bg_opacity")),
+                       clamp_u8(myround(formspec_bgcolor.X)),
+                       clamp_u8(myround(formspec_bgcolor.Y)),
+                       clamp_u8(myround(formspec_bgcolor.Z))
+               );
+       }
+
+       {
+               v3f formspec_bgcolor = g_settings->getV3F("formspec_fullscreen_bg_color");
+               m_fullscreen_bgcolor = video::SColor(
+                       (u8) clamp_u8(g_settings->getS32("formspec_fullscreen_bg_opacity")),
+                       clamp_u8(myround(formspec_bgcolor.X)),
+                       clamp_u8(myround(formspec_bgcolor.Y)),
+                       clamp_u8(myround(formspec_bgcolor.Z))
+               );
+       }
+
+
        m_slotbg_n = video::SColor(255,128,128,128);
        m_slotbg_h = video::SColor(255,192,192,192);
 
@@ -2401,9 +2426,9 @@ void GUIFormSpecMenu::drawSelectedItem()
 
 void GUIFormSpecMenu::drawMenu()
 {
-       if(m_form_src){
-               std::string newform = m_form_src->getForm();
-               if(newform != m_formspec_string){
+       if (m_form_src) {
+               const std::string &newform = m_form_src->getForm();
+               if (newform != m_formspec_string) {
                        m_formspec_string = newform;
                        regenerateGui(m_screensize_old);
                }
@@ -2419,9 +2444,10 @@ void GUIFormSpecMenu::drawMenu()
        video::IVideoDriver* driver = Environment->getVideoDriver();
 
        v2u32 screenSize = driver->getScreenSize();
-       core::rect<s32> allbg(0, 0, screenSize.X ,      screenSize.Y);
+       core::rect<s32> allbg(0, 0, screenSize.X, screenSize.Y);
+
        if (m_bgfullscreen)
-               driver->draw2DRectangle(m_bgcolor, allbg, &allbg);
+               driver->draw2DRectangle(m_fullscreen_bgcolor, allbg, &allbg);
        else
                driver->draw2DRectangle(m_bgcolor, AbsoluteRect, &AbsoluteClippingRect);
 
index 02f367fbfb162cd7c051284f71c674e69ee95c96..c86d596b7df1e140abbebe049a23a637b127e85c 100644 (file)
@@ -66,7 +66,7 @@ class IFormSource
 {
 public:
        virtual ~IFormSource() = default;
-       virtual std::string getForm() = 0;
+       virtual const std::string &getForm() const = 0;
        // Fill in variables in field text
        virtual std::string resolveText(const std::string &str) { return str; }
 };
@@ -419,6 +419,7 @@ class GUIFormSpecMenu : public GUIModalMenu
        bool m_bgfullscreen;
        bool m_slotborder;
        video::SColor m_bgcolor;
+       video::SColor m_fullscreen_bgcolor;
        video::SColor m_slotbg_n;
        video::SColor m_slotbg_h;
        video::SColor m_slotbordercolor;
@@ -554,7 +555,10 @@ class FormspecFormSource: public IFormSource
                m_formspec = FORMSPEC_VERSION_STRING + formspec;
        }
 
-       std::string getForm() { return m_formspec; }
+       const std::string &getForm() const
+       {
+               return m_formspec;
+       }
 
        std::string m_formspec;
 };