]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/gui/guiFormSpecMenu.h
Formspecs: volume and key settings windows can now be closed by doubleclicking/tappin...
[dragonfireclient.git] / src / gui / guiFormSpecMenu.h
index 67be4268a89a6b6701f54762b121d7e161173b44..613acaa043fb926656ae2555bbb19afa35e29485 100644 (file)
@@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "inventorymanager.h"
 #include "modalMenu.h"
 #include "guiInventoryList.h"
+#include "guiScrollBar.h"
 #include "guiTable.h"
 #include "network/networkprotocol.h"
 #include "client/joystick_controller.h"
@@ -37,7 +38,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 class InventoryManager;
 class ISimpleTextureSource;
 class Client;
-class GUIScrollBar;
+class TexturePool;
+class GUIScrollContainer;
 
 typedef enum {
        f_Button,
@@ -48,6 +50,8 @@ typedef enum {
        f_ScrollBar,
        f_Box,
        f_ItemImage,
+       f_HyperText,
+       f_AnimatedImage,
        f_Unknown
 } FormspecFieldType;
 
@@ -164,6 +168,7 @@ class GUIFormSpecMenu : public GUIModalMenu
        {
                m_formspec_string = formspec_string;
                m_current_inventory_location = current_inventory_location;
+               m_is_form_regenerated = false;
                regenerateGui(m_screensize_old);
        }
 
@@ -271,11 +276,13 @@ class GUIFormSpecMenu : public GUIModalMenu
        v2s32 getRealCoordinateBasePos(const std::vector<std::string> &v_pos);
        v2s32 getRealCoordinateGeometry(const std::vector<std::string> &v_geom);
 
-       std::unordered_map<std::string, StyleSpec> theme_by_type;
-       std::unordered_map<std::string, StyleSpec> theme_by_name;
+       std::unordered_map<std::string, std::vector<StyleSpec>> theme_by_type;
+       std::unordered_map<std::string, std::vector<StyleSpec>> theme_by_name;
        std::unordered_set<std::string> property_warned;
 
-       StyleSpec getStyleForElement(const std::string &type,
+       StyleSpec getDefaultStyleForElement(const std::string &type,
+                       const std::string &name="", const std::string &parent_type="");
+       std::array<StyleSpec, StyleSpec::NUM_STATES> getStyleForElement(const std::string &type,
                        const std::string &name="", const std::string &parent_type="");
 
        v2s32 padding;
@@ -293,10 +300,15 @@ class GUIFormSpecMenu : public GUIModalMenu
        std::string m_formspec_prepend;
        InventoryLocation m_current_inventory_location;
 
+       // Default true because we can't control regeneration on resizing, but
+       // we can control cases when the formspec is shown intentionally.
+       bool m_is_form_regenerated = true;
+
        std::vector<GUIInventoryList *> m_inventorylists;
        std::vector<ListRingSpec> m_inventory_rings;
        std::vector<gui::IGUIElement *> m_backgrounds;
        std::unordered_map<std::string, bool> field_close_on_enter;
+       std::unordered_map<std::string, bool> m_dropdown_index_event;
        std::vector<FieldSpec> m_fields;
        std::vector<std::pair<FieldSpec, GUITable *>> m_tables;
        std::vector<std::pair<FieldSpec, gui::IGUICheckBox *>> m_checkboxes;
@@ -304,6 +316,8 @@ class GUIFormSpecMenu : public GUIModalMenu
        std::vector<std::pair<gui::IGUIElement *, TooltipSpec>> m_tooltip_rects;
        std::vector<std::pair<FieldSpec, GUIScrollBar *>> m_scrollbars;
        std::vector<std::pair<FieldSpec, std::vector<std::string>>> m_dropdowns;
+       std::vector<gui::IGUIElement *> m_clickthrough_elements;
+       std::vector<std::pair<std::string, GUIScrollContainer *>> m_scroll_containers;
 
        GUIInventoryList::ItemSpec *m_selected_item = nullptr;
        u16 m_selected_amount = 0;
@@ -330,13 +344,14 @@ class GUIFormSpecMenu : public GUIModalMenu
        video::SColor m_default_tooltip_bgcolor;
        video::SColor m_default_tooltip_color;
 
-
 private:
        IFormSource        *m_form_src;
        TextDest           *m_text_dst;
+       std::string         m_last_formname;
        u16                 m_formspec_version = 1;
        std::string         m_focused_element = "";
        JoystickController *m_joystick;
+       bool m_show_debug = false;
 
        typedef struct {
                bool explicit_size;
@@ -349,9 +364,9 @@ class GUIFormSpecMenu : public GUIModalMenu
                core::rect<s32> rect;
                v2s32 basepos;
                v2u32 screensize;
-               std::string focused_fieldname;
                GUITable::TableOptions table_options;
                GUITable::TableColumns table_columns;
+               gui::IGUIElement *current_parent = nullptr;
 
                GUIInventoryList::Options inventorylist_options;
 
@@ -384,10 +399,13 @@ class GUIFormSpecMenu : public GUIModalMenu
        void parseSize(parserData* data, const std::string &element);
        void parseContainer(parserData* data, const std::string &element);
        void parseContainerEnd(parserData* data);
+       void parseScrollContainer(parserData *data, const std::string &element);
+       void parseScrollContainerEnd(parserData *data);
        void parseList(parserData* data, const std::string &element);
        void parseListRing(parserData* data, const std::string &element);
        void parseCheckbox(parserData* data, const std::string &element);
        void parseImage(parserData* data, const std::string &element);
+       void parseAnimatedImage(parserData *data, const std::string &element);
        void parseItemImage(parserData* data, const std::string &element);
        void parseButton(parserData* data, const std::string &element,
                        const std::string &typ);
@@ -425,6 +443,7 @@ class GUIFormSpecMenu : public GUIModalMenu
        bool parseAnchorDirect(parserData *data, const std::string &element);
        void parseAnchor(parserData *data, const std::string &element);
        bool parseStyle(parserData *data, const std::string &element, bool style_type);
+       void parseSetFocus(const std::string &element);
 
        void tryClose();
 
@@ -438,30 +457,8 @@ class GUIFormSpecMenu : public GUIModalMenu
         */
        void legacySortElements(core::list<IGUIElement *>::Iterator from);
 
-       /**
-        * check if event is part of a double click
-        * @param event event to evaluate
-        * @return true/false if a doubleclick was detected
-        */
-       bool DoubleClickDetection(const SEvent event);
-
-       struct clickpos
-       {
-               v2s32 pos;
-               s64 time;
-       };
-       clickpos m_doubleclickdetect[2];
-
        int m_btn_height;
        gui::IGUIFont *m_font = nullptr;
-
-       /* If true, remap a double-click (or double-tap) action to ESC. This is so
-        * that, for example, Android users can double-tap to close a formspec.
-       *
-        * This value can (currently) only be set by the class constructor
-        * and the default value for the setting is true.
-        */
-       bool m_remap_dbl_click;
 };
 
 class FormspecFormSource: public IFormSource