]> git.lizzy.rs Git - dragonfireclient.git/blob - src/guiPauseMenu.cpp
99347b052197c8282460f3875b0556ba0bf5657e
[dragonfireclient.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 \r
26 GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,\r
27                 gui::IGUIElement* parent, s32 id,\r
28                 IGameCallback *gamecallback,\r
29                 IMenuManager *menumgr):\r
30         GUIModalMenu(env, parent, id, menumgr)\r
31 {\r
32         m_gamecallback = gamecallback;\r
33 }\r
34 \r
35 GUIPauseMenu::~GUIPauseMenu()\r
36 {\r
37         removeChildren();\r
38 }\r
39 \r
40 void GUIPauseMenu::removeChildren()\r
41 {\r
42         {\r
43                 gui::IGUIElement *e = getElementFromId(256);\r
44                 if(e != NULL)\r
45                         e->remove();\r
46         }\r
47         {\r
48                 gui::IGUIElement *e = getElementFromId(257);\r
49                 if(e != NULL)\r
50                         e->remove();\r
51         }\r
52         {\r
53                 gui::IGUIElement *e = getElementFromId(258);\r
54                 if(e != NULL)\r
55                         e->remove();\r
56         }\r
57         {\r
58                 gui::IGUIElement *e = getElementFromId(259);\r
59                 if(e != NULL)\r
60                         e->remove();\r
61         }\r
62         {\r
63                 gui::IGUIElement *e = getElementFromId(260);\r
64                 if(e != NULL)\r
65                         e->remove();\r
66         }\r
67 }\r
68 \r
69 void GUIPauseMenu::regenerateGui(v2u32 screensize)\r
70 {\r
71         /*\r
72                 Remove stuff\r
73         */\r
74         removeChildren();\r
75         \r
76         /*\r
77                 Calculate new sizes and positions\r
78         */\r
79         core::rect<s32> rect(\r
80                         screensize.X/2 - 580/2,\r
81                         screensize.Y/2 - 300/2,\r
82                         screensize.X/2 + 580/2,\r
83                         screensize.Y/2 + 300/2\r
84         );\r
85         \r
86         DesiredRect = rect;\r
87         recalculateAbsolutePosition(false);\r
88 \r
89         v2s32 size = rect.getSize();\r
90 \r
91         /*\r
92                 Add stuff\r
93         */\r
94         {\r
95                 core::rect<s32> rect(0, 0, 140, 30);\r
96                 rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2-50);\r
97                 Environment->addButton(rect, this, 256, L"Continue");\r
98         }\r
99         {\r
100                 core::rect<s32> rect(0, 0, 140, 30);\r
101                 rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2+0);\r
102                 Environment->addButton(rect, this, 260, L"Disconnect");\r
103         }\r
104         {\r
105                 core::rect<s32> rect(0, 0, 140, 30);\r
106                 rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2+50);\r
107                 Environment->addButton(rect, this, 257, L"Exit to OS");\r
108         }\r
109         {\r
110                 core::rect<s32> rect(0, 0, 180, 240);\r
111                 rect = rect + v2s32(size.X/2 + 90, size.Y/2-rect.getHeight()/2);\r
112                 const wchar_t *text =\r
113                 L"Keys:\n"\r
114                 L"- WASD: Walk\n"\r
115                 L"- Mouse left: dig blocks\n"\r
116                 L"- Mouse right: place blocks\n"\r
117                 L"- Mouse wheel: select item\n"\r
118                 L"- 0...9: select item\n"\r
119                 L"- R: Toggle viewing all loaded chunks\n"\r
120                 L"- I: Inventory menu\n"\r
121                 L"- ESC: This menu\n"\r
122                 L"- T: Chat\n";\r
123                 Environment->addStaticText(text, rect, false, true, this, 258);\r
124         }\r
125         {\r
126                 core::rect<s32> rect(0, 0, 180, 220);\r
127                 rect = rect + v2s32(size.X/2 - 90 - rect.getWidth(), size.Y/2-rect.getHeight()/2);\r
128         \r
129                 v2u32 max_texture_size;\r
130                 {\r
131                         video::IVideoDriver* driver = Environment->getVideoDriver();\r
132                         max_texture_size = driver->getMaxTextureSize();\r
133                 }\r
134 \r
135                 /*wchar_t text[200];\r
136                 swprintf(text, 200,\r
137                                 L"Minetest-c55\n"\r
138                                 L"by Perttu Ahola\n"\r
139                                 L"celeron55@gmail.com\n\n"\r
140                                 SWPRINTF_CHARSTRING L"\n"\r
141                                 L"userdata path = "\r
142                                 SWPRINTF_CHARSTRING\r
143                                 ,\r
144                                 BUILD_INFO,\r
145                                 porting::path_userdata.c_str()\r
146                 );*/\r
147 \r
148                 std::ostringstream os;\r
149                 os<<"Minetest-c55\n";\r
150                 os<<"by Perttu Ahola\n";\r
151                 os<<"celeron55@gmail.com\n";\r
152                 os<<BUILD_INFO<<"\n";\r
153                 os<<"ud_path = "<<wrap_rows(porting::path_userdata, 20)<<"\n";\r
154         \r
155                 Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);\r
156         }\r
157 }\r
158 \r
159 void GUIPauseMenu::drawMenu()\r
160 {\r
161         gui::IGUISkin* skin = Environment->getSkin();\r
162         if (!skin)\r
163                 return;\r
164         video::IVideoDriver* driver = Environment->getVideoDriver();\r
165         \r
166         video::SColor bgcolor(140,0,0,0);\r
167         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\r
168 \r
169         gui::IGUIElement::draw();\r
170 }\r
171 \r
172 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
173 {\r
174         if(event.EventType==EET_KEY_INPUT_EVENT)\r
175         {\r
176                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)\r
177                 {\r
178                         quitMenu();\r
179                         return true;\r
180                 }\r
181         }\r
182         if(event.EventType==EET_GUI_EVENT)\r
183         {\r
184                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST\r
185                                 && isVisible())\r
186                 {\r
187                         if(!canTakeFocus(event.GUIEvent.Element))\r
188                         {\r
189                                 dstream<<"GUIPauseMenu: Not allowing focus change."\r
190                                                 <<std::endl;\r
191                                 // Returning true disables focus change\r
192                                 return true;\r
193                         }\r
194                 }\r
195                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
196                 {\r
197                         switch(event.GUIEvent.Caller->getID())\r
198                         {\r
199                         case 256: // continue\r
200                                 quitMenu();\r
201                                 // ALWAYS return immediately after quitMenu()\r
202                                 return true;\r
203                         case 260: // disconnect\r
204                                 m_gamecallback->disconnect();\r
205                                 quitMenu();\r
206                                 return true;\r
207                         case 257: // exit\r
208                                 m_gamecallback->exitToOS();\r
209                                 quitMenu();\r
210                                 return true;\r
211                         }\r
212                 }\r
213         }\r
214         \r
215         return Parent ? Parent->OnEvent(event) : false;\r
216 }\r
217 \r