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