Switch the license to be LGPLv2/later, with small parts still remaining as GPLv2...
[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 Lesser General Public License as published by\r
7 the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU Lesser 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                 bool simple_singleplayer_mode):\r
39         GUIModalMenu(env, parent, id, menumgr),\r
40         m_gamecallback(gamecallback),\r
41         m_simple_singleplayer_mode(simple_singleplayer_mode)\r
42 {\r
43 }\r
44 \r
45 GUIPauseMenu::~GUIPauseMenu()\r
46 {\r
47         removeChildren();\r
48 }\r
49 \r
50 void GUIPauseMenu::removeChildren()\r
51 {\r
52         {\r
53                 gui::IGUIElement *e = getElementFromId(256);\r
54                 if(e != NULL)\r
55                         e->remove();\r
56         }\r
57         {\r
58                 gui::IGUIElement *e = getElementFromId(257);\r
59                 if(e != NULL)\r
60                         e->remove();\r
61         }\r
62         {\r
63                 gui::IGUIElement *e = getElementFromId(258);\r
64                 if(e != NULL)\r
65                         e->remove();\r
66         }\r
67         {\r
68                 gui::IGUIElement *e = getElementFromId(259);\r
69                 if(e != NULL)\r
70                         e->remove();\r
71         }\r
72         {\r
73                 gui::IGUIElement *e = getElementFromId(260);\r
74                 if(e != NULL)\r
75                         e->remove();\r
76         }\r
77         {\r
78                 gui::IGUIElement *e = getElementFromId(261);\r
79                 if(e != NULL)\r
80                         e->remove();\r
81         }\r
82 }\r
83 \r
84 void GUIPauseMenu::regenerateGui(v2u32 screensize)\r
85 {\r
86         /*\r
87                 Remove stuff\r
88         */\r
89         removeChildren();\r
90         \r
91         /*\r
92                 Calculate new sizes and positions\r
93         */\r
94         core::rect<s32> rect(\r
95                         screensize.X/2 - 580/2,\r
96                         screensize.Y/2 - 300/2,\r
97                         screensize.X/2 + 580/2,\r
98                         screensize.Y/2 + 300/2\r
99         );\r
100         \r
101         DesiredRect = rect;\r
102         recalculateAbsolutePosition(false);\r
103 \r
104         v2s32 size = rect.getSize();\r
105 \r
106         /*\r
107                 Add stuff\r
108         */\r
109         const s32 btn_height = 30;\r
110         const s32 btn_gap = 20;\r
111         const s32 btn_num = m_simple_singleplayer_mode ? 3 : 4;\r
112         s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;\r
113         changeCtype("");\r
114         {\r
115                 core::rect<s32> rect(0, 0, 140, btn_height);\r
116                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
117                 Environment->addButton(rect, this, 256,\r
118                         wgettext("Continue"));\r
119         }\r
120         btn_y += btn_height + btn_gap;\r
121         if(!m_simple_singleplayer_mode)\r
122         {\r
123                 {\r
124                         core::rect<s32> rect(0, 0, 140, btn_height);\r
125                         rect = rect + v2s32(size.X/2-140/2, btn_y);\r
126                         Environment->addButton(rect, this, 261,\r
127                                 wgettext("Change Password"));\r
128                 }\r
129                 btn_y += btn_height + btn_gap;\r
130         }\r
131         {\r
132                 core::rect<s32> rect(0, 0, 140, btn_height);\r
133                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
134                 Environment->addButton(rect, this, 260,\r
135                         wgettext("Exit to Menu"));\r
136         }\r
137         btn_y += btn_height + btn_gap;\r
138         {\r
139                 core::rect<s32> rect(0, 0, 140, btn_height);\r
140                 rect = rect + v2s32(size.X/2-140/2, btn_y);\r
141                 Environment->addButton(rect, this, 257,\r
142                         wgettext("Exit to OS"));\r
143         }\r
144 \r
145         {\r
146                 core::rect<s32> rect(0, 0, 180, 240);\r
147                 rect = rect + v2s32(size.X/2 + 90, size.Y/2-rect.getHeight()/2);\r
148                 Environment->addStaticText(chartowchar_t(gettext(\r
149                 "Default Controls:\n"\r
150                 "- WASD: Walk\n"\r
151                 "- Mouse left: dig/hit\n"\r
152                 "- Mouse right: place/use\n"\r
153                 "- Mouse wheel: select item\n"\r
154                 "- 0...9: select item\n"\r
155                 "- Shift: sneak\n"\r
156                 "- R: Toggle viewing all loaded chunks\n"\r
157                 "- I: Inventory menu\n"\r
158                 "- ESC: This menu\n"\r
159                 "- T: Chat\n"\r
160                 )), rect, false, true, this, 258);\r
161         }\r
162         {\r
163                 core::rect<s32> rect(0, 0, 180, 220);\r
164                 rect = rect + v2s32(size.X/2 - 90 - rect.getWidth(), size.Y/2-rect.getHeight()/2);\r
165         \r
166                 v2u32 max_texture_size;\r
167                 {\r
168                         video::IVideoDriver* driver = Environment->getVideoDriver();\r
169                         max_texture_size = driver->getMaxTextureSize();\r
170                 }\r
171 \r
172                 /*wchar_t text[200];\r
173                 swprintf(text, 200,\r
174                                 L"Minetest-c55\n"\r
175                                 L"by Perttu Ahola\n"\r
176                                 L"celeron55@gmail.com\n\n"\r
177                                 SWPRINTF_CHARSTRING L"\n"\r
178                                 L"userdata path = "\r
179                                 SWPRINTF_CHARSTRING\r
180                                 ,\r
181                                 BUILD_INFO,\r
182                                 porting::path_user.c_str()\r
183                 );*/\r
184 \r
185                 std::ostringstream os;\r
186                 os<<"Minetest\n";\r
187                 os<<"by Perttu Ahola and contributors\n";\r
188                 os<<"celeron55@gmail.com\n";\r
189                 os<<BUILD_INFO<<"\n";\r
190                 os<<"path_user = "<<wrap_rows(porting::path_user, 20)<<"\n";\r
191         \r
192                 Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);\r
193         }\r
194         changeCtype("C");\r
195 }\r
196 \r
197 void GUIPauseMenu::drawMenu()\r
198 {\r
199         gui::IGUISkin* skin = Environment->getSkin();\r
200         if (!skin)\r
201                 return;\r
202         video::IVideoDriver* driver = Environment->getVideoDriver();\r
203         \r
204         video::SColor bgcolor(140,0,0,0);\r
205         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\r
206 \r
207         gui::IGUIElement::draw();\r
208 }\r
209 \r
210 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
211 {\r
212 \r
213         if(event.EventType==EET_KEY_INPUT_EVENT)\r
214         {\r
215                 if(event.KeyInput.PressedDown)\r
216                 {\r
217                         if(event.KeyInput.Key==KEY_ESCAPE)\r
218                         {\r
219                                 quitMenu();\r
220                                 return true;\r
221                         }\r
222                         else if(event.KeyInput.Key==KEY_RETURN)\r
223                         {\r
224                                 quitMenu();\r
225                                 return true;\r
226                         }\r
227                 }\r
228         }\r
229         if(event.EventType==EET_GUI_EVENT)\r
230         {\r
231                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST\r
232                                 && isVisible())\r
233                 {\r
234                         if(!canTakeFocus(event.GUIEvent.Element))\r
235                         {\r
236                                 dstream<<"GUIPauseMenu: Not allowing focus change."\r
237                                                 <<std::endl;\r
238                                 // Returning true disables focus change\r
239                                 return true;\r
240                         }\r
241                 }\r
242                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
243                 {\r
244                         switch(event.GUIEvent.Caller->getID())\r
245                         {\r
246                         case 256: // continue\r
247                                 quitMenu();\r
248                                 // ALWAYS return immediately after quitMenu()\r
249                                 return true;\r
250                         case 261:\r
251                                 quitMenu();\r
252                                 m_gamecallback->changePassword();\r
253                                 return true;\r
254                         case 260: // disconnect\r
255                                 m_gamecallback->disconnect();\r
256                                 quitMenu();\r
257                                 return true;\r
258                         case 257: // exit\r
259                                 m_gamecallback->exitToOS();\r
260                                 quitMenu();\r
261                                 return true;\r
262                         }\r
263                 }\r
264         }\r
265         \r
266         return Parent ? Parent->OnEvent(event) : false;\r
267 }\r
268 \r