]> git.lizzy.rs Git - dragonfireclient.git/blob - src/guiFormSpecMenu.h
Use bit shifts rather than multiplication in block position encoding
[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         bool doPause;
246         bool pausesGame() { return doPause; }
247
248         GUITable* getTable(std::wstring tablename);
249
250         static bool parseColor(const std::string &value,
251                         video::SColor &color, bool quiet);
252
253 protected:
254         v2s32 getBasePos() const
255         {
256                         return padding + offset + AbsoluteRect.UpperLeftCorner;
257         }
258
259         v2s32 padding;
260         v2s32 spacing;
261         v2s32 imgsize;
262         v2s32 offset;
263         
264         irr::IrrlichtDevice* m_device;
265         InventoryManager *m_invmgr;
266         IGameDef *m_gamedef;
267         ISimpleTextureSource *m_tsrc;
268
269         std::string m_formspec_string;
270         InventoryLocation m_current_inventory_location;
271         IFormSource *m_form_src;
272         TextDest *m_text_dst;
273
274         std::vector<ListDrawSpec> m_inventorylists;
275         std::vector<ImageDrawSpec> m_backgrounds;
276         std::vector<ImageDrawSpec> m_images;
277         std::vector<ImageDrawSpec> m_itemimages;
278         std::vector<BoxDrawSpec> m_boxes;
279         std::vector<FieldSpec> m_fields;
280         std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
281         std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
282
283         ItemSpec *m_selected_item;
284         u32 m_selected_amount;
285         bool m_selected_dragging;
286         
287         // WARNING: BLACK MAGIC
288         // Used to guess and keep up with some special things the server can do.
289         // If name is "", no guess exists.
290         ItemStack m_selected_content_guess;
291         InventoryLocation m_selected_content_guess_inventory;
292
293         v2s32 m_pointer;
294         gui::IGUIStaticText *m_tooltip_element;
295
296         bool m_allowclose;
297         bool m_lock;
298         v2u32 m_lockscreensize;
299
300         bool m_bgfullscreen;
301         bool m_slotborder;
302         bool m_clipbackground;
303         video::SColor m_bgcolor;
304         video::SColor m_slotbg_n;
305         video::SColor m_slotbg_h;
306         video::SColor m_slotbordercolor;
307 private:
308         typedef struct {
309                 v2s32 size;
310                 s32 helptext_h;
311                 core::rect<s32> rect;
312                 v2s32 basepos;
313                 int bp_set;
314                 v2u32 screensize;
315                 std::wstring focused_fieldname;
316                 GUITable::TableOptions table_options;
317                 GUITable::TableColumns table_columns;
318                 // used to restore table selection/scroll/treeview state
319                 std::map<std::wstring,GUITable::DynamicData> table_dyndata;
320         } parserData;
321
322         typedef struct {
323                 bool key_up;
324                 bool key_down;
325                 bool key_enter;
326                 bool key_escape;
327         } fs_key_pendig;
328
329         fs_key_pendig current_keys_pending;
330
331         void parseElement(parserData* data,std::string element);
332
333         void parseSize(parserData* data,std::string element);
334         void parseList(parserData* data,std::string element);
335         void parseCheckbox(parserData* data,std::string element);
336         void parseImage(parserData* data,std::string element);
337         void parseItemImage(parserData* data,std::string element);
338         void parseButton(parserData* data,std::string element,std::string typ);
339         void parseBackground(parserData* data,std::string element);
340         void parseTableOptions(parserData* data,std::string element);
341         void parseTableColumns(parserData* data,std::string element);
342         void parseTable(parserData* data,std::string element);
343         void parseTextList(parserData* data,std::string element);
344         void parseDropDown(parserData* data,std::string element);
345         void parsePwdField(parserData* data,std::string element);
346         void parseField(parserData* data,std::string element,std::string type);
347         void parseSimpleField(parserData* data,std::vector<std::string> &parts);
348         void parseTextArea(parserData* data,std::vector<std::string>& parts,
349                         std::string type);
350         void parseLabel(parserData* data,std::string element);
351         void parseVertLabel(parserData* data,std::string element);
352         void parseImageButton(parserData* data,std::string element,std::string type);
353         void parseItemImageButton(parserData* data,std::string element);
354         void parseTabHeader(parserData* data,std::string element);
355         void parseBox(parserData* data,std::string element);
356         void parseBackgroundColor(parserData* data,std::string element);
357         void parseListColors(parserData* data,std::string element);
358 };
359
360 class FormspecFormSource: public IFormSource
361 {
362 public:
363         FormspecFormSource(std::string formspec,FormspecFormSource** game_formspec)
364         {
365                 m_formspec = formspec;
366                 m_game_formspec = game_formspec;
367         }
368
369         ~FormspecFormSource()
370         {
371                 *m_game_formspec = 0;
372         }
373
374         void setForm(std::string formspec) {
375                 m_formspec = formspec;
376         }
377
378         std::string getForm()
379         {
380                 return m_formspec;
381         }
382
383         std::string m_formspec;
384         FormspecFormSource** m_game_formspec;
385 };
386
387 #endif
388