utility.h: Change Buffer's interface to be more compatible with SharedBuffer's interf...
[oweals/minetest.git] / src / guiPauseMenu.cpp
1 /*\r
2 Minetest-c55\r
3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>\r
4 \r
5 This program is free software; you can redistribute it and/or modify\r
6 it under the terms of the GNU General Public License as published by\r
7 the Free Software Foundation; either version 2 of the License, or\r
8 (at your option) any later version.\r
9 \r
10 This program is distributed in the hope that it will be useful,\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 GNU General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU General Public License along\r
16 with this program; if not, write to the Free Software Foundation, Inc.,\r
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 */\r
19 \r
20 #include "guiPauseMenu.h"\r
21 #include "debug.h"\r
22 #include "serialization.h"\r
23 #include "porting.h"\r
24 #include "config.h"\r
25 #include "main.h"\r
26 #include <IGUICheckBox.h>\r
27 #include <IGUIEditBox.h>\r
28 #include <IGUIButton.h>\r
29 #include <IGUIStaticText.h>\r
30 #include <IGUIFont.h>\r
31 \r
32 #include "gettext.h"\r
33 \r
34 GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,\r
35                 gui::IGUIElement* parent, s32 id,\r
36                 IGameCallback *gamecallback,\r
37                 IMenuManager *menumgr):\r
38         GUIModalMenu(env, parent, id, menumgr)\r
39 {\r
40         m_gamecallback = gamecallback;\r
41 }\r
42 \r
43 GUIPauseMenu::~GUIPauseMenu()\r
44 {\r
45         removeChildren();\r
46 }\r
47 \r
48 void GUIPauseMenu::removeChildren()\r
49 {\r
50         {\r
51                 gui::IGUIElement *e = getElementFromId(256);\r
52                 if(e != NULL)\r
53                         e->remove();\r
54         }\r
55         {\r
56                 gui::IGUIElement *e = getElementFromId(257);\r
57                 if(e != NULL)\r
58                         e->remove();\r
59         }\r
60         {\r
61                 gui::IGUIElement *e = getElementFromId(258);\r
62                 if(e != NULL)\r
63                         e->remove();\r
64         }\r
65         {\r
66                 gui::IGUIElement *e = getElementFromId(259);\r
67                 if(e != NULL)\r
68                         e->remove();\r
69         }\r
70         {\r
71                 gui::IGUIElement *e = getElementFromId(260);\r
72                 if(e != NULL)\r
73                         e->remove();\r
74         }\r
75         {\r
76                 gui::IGUIElement *e = getElementFromId(261);\r
77                 if(e != NULL)\r
78                         e->remove();\r
79         }\r
80 }\r
81 \r
82 void GUIPauseMenu::regenerateGui(v2u32 screensize)\r
83 {\r
84         /*\r
85                 Remove stuff\r
86         */\r
87         removeChildren();\r
88         \r
89         /*\r
90                 Calculate new sizes and positions\r
91         */\r
92         core::rect<s32> rect(\r
93                         screensize.X/2 - 580/2,\r
94                         screensize.Y/2 - 300/2,\r
95                         screensize.X/2 + 580/2,\r
96                         screensize.Y/2 + 300/2\r
97         );\r
98         \r
99         DesiredRect = rect;\r
100         recalculateAbsolutePosition(false);\r
101 \r
102         v2s32 size = rect.getSize();\r
103 \r
104         /*\r
105                 Add stuff\r
106         */\r
107         const s32 btn_height = 30;\r
108         const s32 btn_gap = 20;\r
109         const s32 btn_num = 4;\r
110         s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;\r
111         changeCtype("");\r
112         {\r
113                 core::rect<s32> rect(0, 0, 140, btn_height);\r
114                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
115                 Environment->addButton(rect, this, 256,\r
116                         wgettext("Continue"));\r
117         }\r
118         btn_y += btn_height + btn_gap;\r
119         {\r
120                 core::rect<s32> rect(0, 0, 140, btn_height);\r
121                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
122                 Environment->addButton(rect, this, 261,\r
123                         wgettext("Change Password"));\r
124         }\r
125         btn_y += btn_height + btn_gap;\r
126         {\r
127                 core::rect<s32> rect(0, 0, 140, btn_height);\r
128                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
129                 Environment->addButton(rect, this, 260,\r
130                         wgettext("Disconnect"));\r
131         }\r
132         btn_y += btn_height + btn_gap;\r
133         {\r
134                 core::rect<s32> rect(0, 0, 140, btn_height);\r
135                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
136                 Environment->addButton(rect, this, 257,\r
137                         wgettext("Exit to OS"));\r
138         }\r
139 \r
140         {\r
141                 core::rect<s32> rect(0, 0, 180, 240);\r
142                 rect = rect + v2s32(size.X/2 + 90, size.Y/2-rect.getHeight()/2);\r
143                 Environment->addStaticText(chartowchar_t(gettext(\r
144                 "Default Controls:\n"\r
145                 "- WASD: Walk\n"\r
146                 "- Mouse left: dig/hit\n"\r
147                 "- Mouse right: place/use\n"\r
148                 "- Mouse wheel: select item\n"\r
149                 "- 0...9: select item\n"\r
150                 "- Shift: sneak\n"\r
151                 "- R: Toggle viewing all loaded chunks\n"\r
152                 "- I: Inventory menu\n"\r
153                 "- ESC: This menu\n"\r
154                 "- T: Chat\n"\r
155                 )), rect, false, true, this, 258);\r
156         }\r
157         {\r
158                 core::rect<s32> rect(0, 0, 180, 220);\r
159                 rect = rect + v2s32(size.X/2 - 90 - rect.getWidth(), size.Y/2-rect.getHeight()/2);\r
160         \r
161                 v2u32 max_texture_size;\r
162                 {\r
163                         video::IVideoDriver* driver = Environment->getVideoDriver();\r
164                         max_texture_size = driver->getMaxTextureSize();\r
165                 }\r
166 \r
167                 /*wchar_t text[200];\r
168                 swprintf(text, 200,\r
169                                 L"Minetest-c55\n"\r
170                                 L"by Perttu Ahola\n"\r
171                                 L"celeron55@gmail.com\n\n"\r
172                                 SWPRINTF_CHARSTRING L"\n"\r
173                                 L"userdata path = "\r
174                                 SWPRINTF_CHARSTRING\r
175                                 ,\r
176                                 BUILD_INFO,\r
177                                 porting::path_userdata.c_str()\r
178                 );*/\r
179 \r
180                 std::ostringstream os;\r
181                 os<<"Minetest\n";\r
182                 os<<"by Perttu Ahola and contributors\n";\r
183                 os<<"celeron55@gmail.com\n";\r
184                 os<<BUILD_INFO<<"\n";\r
185                 os<<"ud_path = "<<wrap_rows(porting::path_userdata, 20)<<"\n";\r
186         \r
187                 Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);\r
188         }\r
189         changeCtype("C");\r
190 }\r
191 \r
192 void GUIPauseMenu::drawMenu()\r
193 {\r
194         gui::IGUISkin* skin = Environment->getSkin();\r
195         if (!skin)\r
196                 return;\r
197         video::IVideoDriver* driver = Environment->getVideoDriver();\r
198         \r
199         video::SColor bgcolor(140,0,0,0);\r
200         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\r
201 \r
202         gui::IGUIElement::draw();\r
203 }\r
204 \r
205 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
206 {\r
207 \r
208         if(event.EventType==EET_KEY_INPUT_EVENT)\r
209         {\r
210                 if(event.KeyInput.PressedDown)\r
211                 {\r
212                         if(event.KeyInput.Key==KEY_ESCAPE)\r
213                         {\r
214                                 quitMenu();\r
215                                 return true;\r
216                         }\r
217                         else if(event.KeyInput.Key==KEY_RETURN)\r
218                         {\r
219                                 quitMenu();\r
220                                 return true;\r
221                         }\r
222                 }\r
223         }\r
224         if(event.EventType==EET_GUI_EVENT)\r
225         {\r
226                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST\r
227                                 && isVisible())\r
228                 {\r
229                         if(!canTakeFocus(event.GUIEvent.Element))\r
230                         {\r
231                                 dstream<<"GUIPauseMenu: Not allowing focus change."\r
232                                                 <<std::endl;\r
233                                 // Returning true disables focus change\r
234                                 return true;\r
235                         }\r
236                 }\r
237                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
238                 {\r
239                         switch(event.GUIEvent.Caller->getID())\r
240                         {\r
241                         case 256: // continue\r
242                                 quitMenu();\r
243                                 // ALWAYS return immediately after quitMenu()\r
244                                 return true;\r
245                         case 261:\r
246                                 quitMenu();\r
247                                 m_gamecallback->changePassword();\r
248                                 return true;\r
249                         case 260: // disconnect\r
250                                 m_gamecallback->disconnect();\r
251                                 quitMenu();\r
252                                 return true;\r
253                         case 257: // exit\r
254                                 m_gamecallback->exitToOS();\r
255                                 quitMenu();\r
256                                 return true;\r
257                         }\r
258                 }\r
259         }\r
260         \r
261         return Parent ? Parent->OnEvent(event) : false;\r
262 }\r
263 \r