X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2FguiFormSpecMenu.h;h=2fb55070dac82806b41252f728a02a266aae7e5e;hb=d1df09841d0eac7a88f638676b80ec848522cca5;hp=da0826681ec8276353ff0475f21ebbf55dd26a93;hpb=27538ecef51ebcc7622f13956d2f8e101d0f71a7;p=dragonfireclient.git diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h index da0826681..2fb55070d 100644 --- a/src/guiFormSpecMenu.h +++ b/src/guiFormSpecMenu.h @@ -28,10 +28,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventorymanager.h" #include "modalMenu.h" #include "guiTable.h" +#include "network/networkprotocol.h" +#include "client/joystick_controller.h" +#include "util/string.h" +#include "util/enriched_string.h" class IGameDef; class InventoryManager; class ISimpleTextureSource; +class Client; typedef enum { f_Button, @@ -39,6 +44,7 @@ typedef enum { f_TabHeader, f_CheckBox, f_DropDown, + f_ScrollBar, f_Unknown } FormspecFieldType; @@ -53,7 +59,7 @@ struct TextDest virtual ~TextDest() {}; // This is deprecated I guess? -celeron55 virtual void gotText(std::wstring text){} - virtual void gotText(std::map fields) = 0; + virtual void gotText(const StringMap &fields) = 0; virtual void setFormName(std::string formname) { m_formname = formname;}; @@ -118,27 +124,71 @@ class GUIFormSpecMenu : public GUIModalMenu s32 start_item_i; }; + struct ListRingSpec + { + ListRingSpec() + { + } + ListRingSpec(const InventoryLocation &a_inventoryloc, + const std::string &a_listname): + inventoryloc(a_inventoryloc), + listname(a_listname) + { + } + + InventoryLocation inventoryloc; + std::string listname; + }; + struct ImageDrawSpec { - ImageDrawSpec() + ImageDrawSpec(): + parent_button(NULL) { } ImageDrawSpec(const std::string &a_name, - v2s32 a_pos, v2s32 a_geom): + const std::string &a_item_name, + gui::IGUIButton *a_parent_button, + const v2s32 &a_pos, const v2s32 &a_geom): name(a_name), + item_name(a_item_name), + parent_button(a_parent_button), pos(a_pos), - geom(a_geom) + geom(a_geom), + scale(true) { - scale = true; } ImageDrawSpec(const std::string &a_name, - v2s32 a_pos): + const std::string &a_item_name, + const v2s32 &a_pos, const v2s32 &a_geom): name(a_name), - pos(a_pos) + item_name(a_item_name), + parent_button(NULL), + pos(a_pos), + geom(a_geom), + scale(true) + { + } + ImageDrawSpec(const std::string &a_name, + const v2s32 &a_pos, const v2s32 &a_geom): + name(a_name), + parent_button(NULL), + pos(a_pos), + geom(a_geom), + scale(true) + { + } + ImageDrawSpec(const std::string &a_name, + const v2s32 &a_pos): + name(a_name), + parent_button(NULL), + pos(a_pos), + scale(false) { - scale = false; } std::string name; + std::string item_name; + gui::IGUIButton *parent_button; v2s32 pos; v2s32 geom; bool scale; @@ -149,18 +199,19 @@ class GUIFormSpecMenu : public GUIModalMenu FieldSpec() { } - FieldSpec(const std::wstring &name, const std::wstring &label, - const std::wstring &fdeflt, int id) : + FieldSpec(const std::string &name, const std::wstring &label, + const std::wstring &default_text, int id) : fname(name), - flabel(label), - fdefault(fdeflt), fid(id) { + //flabel = unescape_enriched(label); + flabel = label; + fdefault = unescape_enriched(default_text); send = false; ftype = f_Unknown; is_exit = false; } - std::wstring fname; + std::string fname; std::wstring flabel; std::wstring fdefault; int fid; @@ -188,18 +239,47 @@ class GUIFormSpecMenu : public GUIModalMenu } TooltipSpec(std::string a_tooltip, irr::video::SColor a_bgcolor, irr::video::SColor a_color): - tooltip(a_tooltip), bgcolor(a_bgcolor), color(a_color) { + //tooltip = unescape_enriched(utf8_to_wide(a_tooltip)); + tooltip = utf8_to_wide(a_tooltip); } - std::string tooltip; + std::wstring tooltip; irr::video::SColor bgcolor; irr::video::SColor color; }; + struct StaticTextSpec { + StaticTextSpec(): + parent_button(NULL) + { + } + StaticTextSpec(const std::wstring &a_text, + const core::rect &a_rect): + rect(a_rect), + parent_button(NULL) + { + //text = unescape_enriched(a_text); + text = a_text; + } + StaticTextSpec(const std::wstring &a_text, + const core::rect &a_rect, + gui::IGUIButton *a_parent_button): + rect(a_rect), + parent_button(a_parent_button) + { + //text = unescape_enriched(a_text); + text = a_text; + } + std::wstring text; + core::rect rect; + gui::IGUIButton *parent_button; + }; + public: GUIFormSpecMenu(irr::IrrlichtDevice* dev, + JoystickController *joystick, gui::IGUIElement* parent, s32 id, IMenuManager *menumgr, InventoryManager *invmgr, @@ -207,8 +287,8 @@ class GUIFormSpecMenu : public GUIModalMenu ISimpleTextureSource *tsrc, IFormSource* fs_src, TextDest* txt_dst, - GUIFormSpecMenu** ext_ptr - ); + Client* client, + bool remap_dbl_click = true); ~GUIFormSpecMenu(); @@ -243,20 +323,27 @@ class GUIFormSpecMenu : public GUIModalMenu m_allowclose = value; } - void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0)) { + void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0)) + { m_lock = lock; m_lockscreensize = basescreensize; } void removeChildren(); void setInitialFocus(); + + void setFocus(std::string &elementname) + { + m_focused_element = elementname; + } + /* Remove and re-add (or reposition) stuff */ void regenerateGui(v2u32 screensize); ItemSpec getItemAtPos(v2s32 p) const; - void drawList(const ListDrawSpec &s, int phase); + void drawList(const ListDrawSpec &s, int phase, bool &item_hovered); void drawSelectedItem(); void drawMenu(); void updateSelectedItem(); @@ -268,10 +355,12 @@ class GUIFormSpecMenu : public GUIModalMenu bool doPause; bool pausesGame() { return doPause; } - GUITable* getTable(std::wstring tablename); + GUITable* getTable(const std::string &tablename); + std::vector* getDropDownValues(const std::string &name); - static bool parseColor(const std::string &value, - video::SColor &color, bool quiet); +#ifdef __ANDROID__ + bool getAndroidUIInput(); +#endif protected: v2s32 getBasePos() const @@ -288,21 +377,29 @@ class GUIFormSpecMenu : public GUIModalMenu InventoryManager *m_invmgr; IGameDef *m_gamedef; ISimpleTextureSource *m_tsrc; + Client *m_client; std::string m_formspec_string; InventoryLocation m_current_inventory_location; + std::vector m_inventorylists; + std::vector m_inventory_rings; std::vector m_backgrounds; std::vector m_images; std::vector m_itemimages; std::vector m_boxes; std::vector m_fields; + std::vector m_static_texts; std::vector > m_tables; std::vector > m_checkboxes; - std::map m_tooltips; - + std::map m_tooltips; + std::vector > m_scrollbars; + std::vector > > m_dropdowns; + ItemSpec *m_selected_item; + f32 m_timer1; + f32 m_timer2; u32 m_selected_amount; bool m_selected_dragging; @@ -313,11 +410,15 @@ class GUIFormSpecMenu : public GUIModalMenu InventoryLocation m_selected_content_guess_inventory; v2s32 m_pointer; + v2s32 m_old_pointer; // Mouse position after previous mouse event gui::IGUIStaticText *m_tooltip_element; - s32 m_hoovered_time; + u32 m_tooltip_show_delay; + s32 m_hovered_time; s32 m_old_tooltip_id; - std::string m_old_tooltip; + std::wstring m_old_tooltip; + + bool m_rmouse_auto_place; bool m_allowclose; bool m_lock; @@ -334,22 +435,24 @@ class GUIFormSpecMenu : public GUIModalMenu video::SColor m_default_tooltip_color; private: - IFormSource *m_form_src; - TextDest *m_text_dst; - GUIFormSpecMenu **m_ext_ptr; - gui::IGUIFont *m_font; + IFormSource *m_form_src; + TextDest *m_text_dst; + unsigned int m_formspec_version; + std::string m_focused_element; + JoystickController *m_joystick; typedef struct { + bool explicit_size; + v2f invsize; v2s32 size; core::rect rect; v2s32 basepos; - int bp_set; v2u32 screensize; - std::wstring focused_fieldname; + std::string focused_fieldname; GUITable::TableOptions table_options; GUITable::TableColumns table_columns; // used to restore table selection/scroll/treeview state - std::map table_dyndata; + std::map table_dyndata; } parserData; typedef struct { @@ -365,6 +468,7 @@ class GUIFormSpecMenu : public GUIModalMenu void parseSize(parserData* data,std::string element); void parseList(parserData* data,std::string element); + void parseListRing(parserData* data,std::string element); void parseCheckbox(parserData* data,std::string element); void parseImage(parserData* data,std::string element); void parseItemImage(parserData* data,std::string element); @@ -389,6 +493,11 @@ class GUIFormSpecMenu : public GUIModalMenu void parseBackgroundColor(parserData* data,std::string element); void parseListColors(parserData* data,std::string element); void parseTooltip(parserData* data,std::string element); + bool parseVersionDirect(std::string data); + bool parseSizeDirect(parserData* data, std::string element); + void parseScrollBar(parserData* data, std::string element); + + void tryClose(); /** * check if event is part of a double click @@ -405,6 +514,23 @@ class GUIFormSpecMenu : public GUIModalMenu clickpos m_doubleclickdetect[2]; int m_btn_height; + gui::IGUIFont *m_font; + + std::wstring getLabelByID(s32 id); + std::string getNameByID(s32 id); +#ifdef __ANDROID__ + v2s32 m_down_pos; + std::string m_JavaDialogFieldName; +#endif + + /* 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 @@ -419,7 +545,7 @@ class FormspecFormSource: public IFormSource {} void setForm(std::string formspec) { - m_formspec = formspec; + m_formspec = FORMSPEC_VERSION_STRING + formspec; } std::string getForm()