]> git.lizzy.rs Git - dragonfireclient.git/blob - src/guiFormSpecMenu.h
3fc1b5746a8a293f3c9a8e14da6e0bdd89549c79
[dragonfireclient.git] / src / guiFormSpecMenu.h
1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20
21 #ifndef GUIINVENTORYMENU_HEADER
22 #define GUIINVENTORYMENU_HEADER
23
24 #include <utility>
25
26 #include "irrlichttypes_extrabloated.h"
27 #include "inventory.h"
28 #include "inventorymanager.h"
29 #include "modalMenu.h"
30 #include "guiTable.h"
31
32 class IGameDef;
33 class InventoryManager;
34 class ISimpleTextureSource;
35
36 typedef enum {
37         f_Button,
38         f_Table,
39         f_TabHeader,
40         f_CheckBox,
41         f_DropDown,
42         f_Unknown
43 } FormspecFieldType;
44
45 typedef enum {
46         quit_mode_no,
47         quit_mode_accept,
48         quit_mode_cancel
49 } FormspecQuitMode;
50
51 struct TextDest
52 {
53         virtual ~TextDest() {};
54         // This is deprecated I guess? -celeron55
55         virtual void gotText(std::wstring text){}
56         virtual void gotText(std::map<std::string, std::string> fields) = 0;
57         virtual void setFormName(std::string formname)
58         { m_formname = formname;};
59
60         std::string m_formname;
61 };
62
63 class IFormSource
64 {
65 public:
66         virtual ~IFormSource(){}
67         virtual std::string getForm() = 0;
68         // Fill in variables in field text
69         virtual std::string resolveText(std::string str){ return str; }
70 };
71
72 class GUIFormSpecMenu : public GUIModalMenu
73 {
74         struct ItemSpec
75         {
76                 ItemSpec()
77                 {
78                         i = -1;
79                 }
80                 ItemSpec(const InventoryLocation &a_inventoryloc,
81                                 const std::string &a_listname,
82                                 s32 a_i)
83                 {
84                         inventoryloc = a_inventoryloc;
85                         listname = a_listname;
86                         i = a_i;
87                 }
88                 bool isValid() const
89                 {
90                         return i != -1;
91                 }
92
93                 InventoryLocation inventoryloc;
94                 std::string listname;
95                 s32 i;
96         };
97
98         struct ListDrawSpec
99         {
100                 ListDrawSpec()
101                 {
102                 }
103                 ListDrawSpec(const InventoryLocation &a_inventoryloc,
104                                 const std::string &a_listname,
105                                 v2s32 a_pos, v2s32 a_geom, s32 a_start_item_i):
106                         inventoryloc(a_inventoryloc),
107                         listname(a_listname),
108                         pos(a_pos),
109                         geom(a_geom),
110                         start_item_i(a_start_item_i)
111                 {
112                 }
113
114                 InventoryLocation inventoryloc;
115                 std::string listname;
116                 v2s32 pos;
117                 v2s32 geom;
118                 s32 start_item_i;
119         };
120
121         struct ImageDrawSpec
122         {
123                 ImageDrawSpec()
124                 {
125                 }
126                 ImageDrawSpec(const std::string &a_name,
127                                 v2s32 a_pos, v2s32 a_geom):
128                         name(a_name),
129                         pos(a_pos),
130                         geom(a_geom)
131                 {
132                         scale = true;
133                 }
134                 ImageDrawSpec(const std::string &a_name,
135                                 v2s32 a_pos):
136                         name(a_name),
137                         pos(a_pos)
138                 {
139                         scale = false;
140                 }
141                 std::string name;
142                 v2s32 pos;
143                 v2s32 geom;
144                 bool scale;
145         };
146         
147         struct FieldSpec
148         {
149                 FieldSpec()
150                 {
151                 }
152                 FieldSpec(const std::wstring &name, const std::wstring &label,
153                           const std::wstring &fdeflt, int id) :
154                         fname(name),
155                         flabel(label),
156                         fdefault(fdeflt),
157                         fid(id)
158                 {
159                         send = false;
160                         ftype = f_Unknown;
161                         is_exit = false;
162                         tooltip="";
163                 }
164                 std::wstring fname;
165                 std::wstring flabel;
166                 std::wstring fdefault;
167                 int fid;
168                 bool send;
169                 FormspecFieldType ftype;
170                 bool is_exit;
171                 core::rect<s32> rect;
172                 std::string tooltip;
173         };
174
175         struct BoxDrawSpec {
176                 BoxDrawSpec(v2s32 a_pos, v2s32 a_geom,irr::video::SColor a_color):
177                         pos(a_pos),
178                         geom(a_geom),
179                         color(a_color)
180                 {
181                 }
182                 v2s32 pos;
183                 v2s32 geom;
184                 irr::video::SColor color;
185         };
186
187 public:
188         GUIFormSpecMenu(irr::IrrlichtDevice* dev,
189                         gui::IGUIElement* parent, s32 id,
190                         IMenuManager *menumgr,
191                         InventoryManager *invmgr,
192                         IGameDef *gamedef,
193                         ISimpleTextureSource *tsrc
194                         );
195
196         ~GUIFormSpecMenu();
197
198         void setFormSpec(const std::string &formspec_string,
199                         InventoryLocation current_inventory_location)
200         {
201                 m_formspec_string = formspec_string;
202                 m_current_inventory_location = current_inventory_location;
203                 regenerateGui(m_screensize_old);
204         }
205         
206         // form_src is deleted by this GUIFormSpecMenu
207         void setFormSource(IFormSource *form_src)
208         {
209                 m_form_src = form_src;
210         }
211
212         // text_dst is deleted by this GUIFormSpecMenu
213         void setTextDest(TextDest *text_dst)
214         {
215                 m_text_dst = text_dst;
216         }
217
218         void allowClose(bool value)
219         {
220                 m_allowclose = value;
221         }
222
223         void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0)) {
224                 m_lock = lock;
225                 m_lockscreensize = basescreensize;
226         }
227
228         void removeChildren();
229         void setInitialFocus();
230         /*
231                 Remove and re-add (or reposition) stuff
232         */
233         void regenerateGui(v2u32 screensize);
234         
235         ItemSpec getItemAtPos(v2s32 p) const;
236         void drawList(const ListDrawSpec &s, int phase);
237         void drawSelectedItem();
238         void drawMenu();
239         void updateSelectedItem();
240         ItemStack verifySelectedItem();
241
242         void acceptInput(FormspecQuitMode quitmode);
243         bool preprocessEvent(const SEvent& event);
244         bool OnEvent(const SEvent& event);
245
246         GUITable* getTable(std::wstring tablename);
247
248         static bool parseColor(const std::string &value,
249                         video::SColor &color, bool quiet);
250
251 protected:
252         v2s32 getBasePos() const
253         {
254                         return padding + offset + AbsoluteRect.UpperLeftCorner;
255         }
256
257         v2s32 padding;
258         v2s32 spacing;
259         v2s32 imgsize;
260         v2s32 offset;
261         
262         irr::IrrlichtDevice* m_device;
263         InventoryManager *m_invmgr;
264         IGameDef *m_gamedef;
265         ISimpleTextureSource *m_tsrc;
266
267         std::string m_formspec_string;
268         InventoryLocation m_current_inventory_location;
269         IFormSource *m_form_src;
270         TextDest *m_text_dst;
271
272         std::vector<ListDrawSpec> m_inventorylists;
273         std::vector<ImageDrawSpec> m_backgrounds;
274         std::vector<ImageDrawSpec> m_images;
275         std::vector<ImageDrawSpec> m_itemimages;
276         std::vector<BoxDrawSpec> m_boxes;
277         std::vector<FieldSpec> m_fields;
278         std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
279         std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
280
281         ItemSpec *m_selected_item;
282         u32 m_selected_amount;
283         bool m_selected_dragging;
284         
285         // WARNING: BLACK MAGIC
286         // Used to guess and keep up with some special things the server can do.
287         // If name is "", no guess exists.
288         ItemStack m_selected_content_guess;
289         InventoryLocation m_selected_content_guess_inventory;
290
291         v2s32 m_pointer;
292         gui::IGUIStaticText *m_tooltip_element;
293
294         bool m_allowclose;
295         bool m_lock;
296         v2u32 m_lockscreensize;
297
298         bool m_bgfullscreen;
299         bool m_slotborder;
300         bool m_clipbackground;
301         video::SColor m_bgcolor;
302         video::SColor m_slotbg_n;
303         video::SColor m_slotbg_h;
304         video::SColor m_slotbordercolor;
305 private:
306         typedef struct {
307                 v2s32 size;
308                 s32 helptext_h;
309                 core::rect<s32> rect;
310                 v2s32 basepos;
311                 int bp_set;
312                 v2u32 screensize;
313                 std::wstring focused_fieldname;
314                 GUITable::TableOptions table_options;
315                 GUITable::TableColumns table_columns;
316                 // used to restore table selection/scroll/treeview state
317                 std::map<std::wstring,GUITable::DynamicData> table_dyndata;
318         } parserData;
319
320         typedef struct {
321                 bool key_up;
322                 bool key_down;
323                 bool key_enter;
324                 bool key_escape;
325         } fs_key_pendig;
326
327         fs_key_pendig current_keys_pending;
328
329         void parseElement(parserData* data,std::string element);
330
331         void parseSize(parserData* data,std::string element);
332         void parseList(parserData* data,std::string element);
333         void parseCheckbox(parserData* data,std::string element);
334         void parseImage(parserData* data,std::string element);
335         void parseItemImage(parserData* data,std::string element);
336         void parseButton(parserData* data,std::string element,std::string typ);
337         void parseBackground(parserData* data,std::string element);
338         void parseTableOptions(parserData* data,std::string element);
339         void parseTableColumns(parserData* data,std::string element);
340         void parseTable(parserData* data,std::string element);
341         void parseTextList(parserData* data,std::string element);
342         void parseDropDown(parserData* data,std::string element);
343         void parsePwdField(parserData* data,std::string element);
344         void parseField(parserData* data,std::string element,std::string type);
345         void parseSimpleField(parserData* data,std::vector<std::string> &parts);
346         void parseTextArea(parserData* data,std::vector<std::string>& parts,
347                         std::string type);
348         void parseLabel(parserData* data,std::string element);
349         void parseVertLabel(parserData* data,std::string element);
350         void parseImageButton(parserData* data,std::string element,std::string type);
351         void parseItemImageButton(parserData* data,std::string element);
352         void parseTabHeader(parserData* data,std::string element);
353         void parseBox(parserData* data,std::string element);
354         void parseBackgroundColor(parserData* data,std::string element);
355         void parseListColors(parserData* data,std::string element);
356 };
357
358 class FormspecFormSource: public IFormSource
359 {
360 public:
361         FormspecFormSource(std::string formspec,FormspecFormSource** game_formspec)
362         {
363                 m_formspec = formspec;
364                 m_game_formspec = game_formspec;
365         }
366
367         ~FormspecFormSource()
368         {
369                 *m_game_formspec = 0;
370         }
371
372         void setForm(std::string formspec) {
373                 m_formspec = formspec;
374         }
375
376         std::string getForm()
377         {
378                 return m_formspec;
379         }
380
381         std::string m_formspec;
382         FormspecFormSource** m_game_formspec;
383 };
384
385 #endif
386