3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #ifndef GUIINVENTORYMENU_HEADER
22 #define GUIINVENTORYMENU_HEADER
26 #include "irrlichttypes_extrabloated.h"
27 #include "inventory.h"
28 #include "inventorymanager.h"
29 #include "modalMenu.h"
31 #include "network/networkprotocol.h"
32 #include "util/string.h"
33 #include "util/enriched_string.h"
36 class InventoryManager;
37 class ISimpleTextureSource;
58 virtual ~TextDest() {};
59 // This is deprecated I guess? -celeron55
60 virtual void gotText(std::wstring text){}
61 virtual void gotText(const StringMap &fields) = 0;
62 virtual void setFormName(std::string formname)
63 { m_formname = formname;};
65 std::string m_formname;
71 virtual ~IFormSource(){}
72 virtual std::string getForm() = 0;
73 // Fill in variables in field text
74 virtual std::string resolveText(std::string str){ return str; }
77 class GUIFormSpecMenu : public GUIModalMenu
85 ItemSpec(const InventoryLocation &a_inventoryloc,
86 const std::string &a_listname,
89 inventoryloc = a_inventoryloc;
90 listname = a_listname;
98 InventoryLocation inventoryloc;
108 ListDrawSpec(const InventoryLocation &a_inventoryloc,
109 const std::string &a_listname,
110 v2s32 a_pos, v2s32 a_geom, s32 a_start_item_i):
111 inventoryloc(a_inventoryloc),
112 listname(a_listname),
115 start_item_i(a_start_item_i)
119 InventoryLocation inventoryloc;
120 std::string listname;
131 ListRingSpec(const InventoryLocation &a_inventoryloc,
132 const std::string &a_listname):
133 inventoryloc(a_inventoryloc),
138 InventoryLocation inventoryloc;
139 std::string listname;
148 ImageDrawSpec(const std::string &a_name,
149 const std::string &a_item_name,
150 gui::IGUIButton *a_parent_button,
151 const v2s32 &a_pos, const v2s32 &a_geom):
153 item_name(a_item_name),
154 parent_button(a_parent_button),
160 ImageDrawSpec(const std::string &a_name,
161 const std::string &a_item_name,
162 const v2s32 &a_pos, const v2s32 &a_geom):
164 item_name(a_item_name),
171 ImageDrawSpec(const std::string &a_name,
172 const v2s32 &a_pos, const v2s32 &a_geom):
180 ImageDrawSpec(const std::string &a_name,
189 std::string item_name;
190 gui::IGUIButton *parent_button;
201 FieldSpec(const std::string &name, const std::wstring &label,
202 const std::wstring &default_text, int id) :
206 //flabel = unescape_enriched(label);
208 fdefault = unescape_enriched(default_text);
215 std::wstring fdefault;
218 FormspecFieldType ftype;
220 core::rect<s32> rect;
224 BoxDrawSpec(v2s32 a_pos, v2s32 a_geom,irr::video::SColor a_color):
232 irr::video::SColor color;
239 TooltipSpec(std::string a_tooltip, irr::video::SColor a_bgcolor,
240 irr::video::SColor a_color):
244 //tooltip = unescape_enriched(utf8_to_wide(a_tooltip));
245 tooltip = utf8_to_wide(a_tooltip);
247 std::wstring tooltip;
248 irr::video::SColor bgcolor;
249 irr::video::SColor color;
252 struct StaticTextSpec {
257 StaticTextSpec(const std::wstring &a_text,
258 const core::rect<s32> &a_rect):
262 //text = unescape_enriched(a_text);
265 StaticTextSpec(const std::wstring &a_text,
266 const core::rect<s32> &a_rect,
267 gui::IGUIButton *a_parent_button):
269 parent_button(a_parent_button)
271 //text = unescape_enriched(a_text);
275 core::rect<s32> rect;
276 gui::IGUIButton *parent_button;
280 GUIFormSpecMenu(irr::IrrlichtDevice* dev,
281 gui::IGUIElement* parent, s32 id,
282 IMenuManager *menumgr,
283 InventoryManager *invmgr,
285 ISimpleTextureSource *tsrc,
289 bool remap_dbl_click = true);
293 void setFormSpec(const std::string &formspec_string,
294 InventoryLocation current_inventory_location)
296 m_formspec_string = formspec_string;
297 m_current_inventory_location = current_inventory_location;
298 regenerateGui(m_screensize_old);
301 // form_src is deleted by this GUIFormSpecMenu
302 void setFormSource(IFormSource *form_src)
304 if (m_form_src != NULL) {
307 m_form_src = form_src;
310 // text_dst is deleted by this GUIFormSpecMenu
311 void setTextDest(TextDest *text_dst)
313 if (m_text_dst != NULL) {
316 m_text_dst = text_dst;
319 void allowClose(bool value)
321 m_allowclose = value;
324 void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0))
327 m_lockscreensize = basescreensize;
330 void removeChildren();
331 void setInitialFocus();
333 void setFocus(std::string &elementname)
335 m_focused_element = elementname;
339 Remove and re-add (or reposition) stuff
341 void regenerateGui(v2u32 screensize);
343 ItemSpec getItemAtPos(v2s32 p) const;
344 void drawList(const ListDrawSpec &s, int phase, bool &item_hovered);
345 void drawSelectedItem();
347 void updateSelectedItem();
348 ItemStack verifySelectedItem();
350 void acceptInput(FormspecQuitMode quitmode);
351 bool preprocessEvent(const SEvent& event);
352 bool OnEvent(const SEvent& event);
354 bool pausesGame() { return doPause; }
356 GUITable* getTable(const std::string &tablename);
357 std::vector<std::string>* getDropDownValues(const std::string &name);
360 bool getAndroidUIInput();
364 v2s32 getBasePos() const
366 return padding + offset + AbsoluteRect.UpperLeftCorner;
374 irr::IrrlichtDevice* m_device;
375 InventoryManager *m_invmgr;
377 ISimpleTextureSource *m_tsrc;
380 std::string m_formspec_string;
381 InventoryLocation m_current_inventory_location;
384 std::vector<ListDrawSpec> m_inventorylists;
385 std::vector<ListRingSpec> m_inventory_rings;
386 std::vector<ImageDrawSpec> m_backgrounds;
387 std::vector<ImageDrawSpec> m_images;
388 std::vector<ImageDrawSpec> m_itemimages;
389 std::vector<BoxDrawSpec> m_boxes;
390 std::vector<FieldSpec> m_fields;
391 std::vector<StaticTextSpec> m_static_texts;
392 std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
393 std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
394 std::map<std::string, TooltipSpec> m_tooltips;
395 std::vector<std::pair<FieldSpec,gui::IGUIScrollBar*> > m_scrollbars;
396 std::vector<std::pair<FieldSpec, std::vector<std::string> > > m_dropdowns;
398 ItemSpec *m_selected_item;
401 u32 m_selected_amount;
402 bool m_selected_dragging;
404 // WARNING: BLACK MAGIC
405 // Used to guess and keep up with some special things the server can do.
406 // If name is "", no guess exists.
407 ItemStack m_selected_content_guess;
408 InventoryLocation m_selected_content_guess_inventory;
411 v2s32 m_old_pointer; // Mouse position after previous mouse event
412 gui::IGUIStaticText *m_tooltip_element;
414 u32 m_tooltip_show_delay;
416 s32 m_old_tooltip_id;
417 std::wstring m_old_tooltip;
419 bool m_rmouse_auto_place;
423 v2u32 m_lockscreensize;
427 bool m_clipbackground;
428 video::SColor m_bgcolor;
429 video::SColor m_slotbg_n;
430 video::SColor m_slotbg_h;
431 video::SColor m_slotbordercolor;
432 video::SColor m_default_tooltip_bgcolor;
433 video::SColor m_default_tooltip_color;
436 IFormSource *m_form_src;
437 TextDest *m_text_dst;
438 unsigned int m_formspec_version;
439 std::string m_focused_element;
445 core::rect<s32> rect;
448 std::string focused_fieldname;
449 GUITable::TableOptions table_options;
450 GUITable::TableColumns table_columns;
451 // used to restore table selection/scroll/treeview state
452 std::map<std::string, GUITable::DynamicData> table_dyndata;
462 fs_key_pendig current_keys_pending;
464 void parseElement(parserData* data,std::string element);
466 void parseSize(parserData* data,std::string element);
467 void parseList(parserData* data,std::string element);
468 void parseListRing(parserData* data,std::string element);
469 void parseCheckbox(parserData* data,std::string element);
470 void parseImage(parserData* data,std::string element);
471 void parseItemImage(parserData* data,std::string element);
472 void parseButton(parserData* data,std::string element,std::string typ);
473 void parseBackground(parserData* data,std::string element);
474 void parseTableOptions(parserData* data,std::string element);
475 void parseTableColumns(parserData* data,std::string element);
476 void parseTable(parserData* data,std::string element);
477 void parseTextList(parserData* data,std::string element);
478 void parseDropDown(parserData* data,std::string element);
479 void parsePwdField(parserData* data,std::string element);
480 void parseField(parserData* data,std::string element,std::string type);
481 void parseSimpleField(parserData* data,std::vector<std::string> &parts);
482 void parseTextArea(parserData* data,std::vector<std::string>& parts,
484 void parseLabel(parserData* data,std::string element);
485 void parseVertLabel(parserData* data,std::string element);
486 void parseImageButton(parserData* data,std::string element,std::string type);
487 void parseItemImageButton(parserData* data,std::string element);
488 void parseTabHeader(parserData* data,std::string element);
489 void parseBox(parserData* data,std::string element);
490 void parseBackgroundColor(parserData* data,std::string element);
491 void parseListColors(parserData* data,std::string element);
492 void parseTooltip(parserData* data,std::string element);
493 bool parseVersionDirect(std::string data);
494 bool parseSizeDirect(parserData* data, std::string element);
495 void parseScrollBar(parserData* data, std::string element);
498 * check if event is part of a double click
499 * @param event event to evaluate
500 * @return true/false if a doubleclick was detected
502 bool DoubleClickDetection(const SEvent event);
509 clickpos m_doubleclickdetect[2];
512 gui::IGUIFont *m_font;
514 std::wstring getLabelByID(s32 id);
515 std::string getNameByID(s32 id);
518 std::string m_JavaDialogFieldName;
521 /* If true, remap a double-click (or double-tap) action to ESC. This is so
522 * that, for example, Android users can double-tap to close a formspec.
524 * This value can (currently) only be set by the class constructor
525 * and the default value for the setting is true.
527 bool m_remap_dbl_click;
531 class FormspecFormSource: public IFormSource
534 FormspecFormSource(std::string formspec)
536 m_formspec = formspec;
539 ~FormspecFormSource()
542 void setForm(std::string formspec) {
543 m_formspec = FORMSPEC_VERSION_STRING + formspec;
546 std::string getForm()
551 std::string m_formspec;