]> git.lizzy.rs Git - dragonfireclient.git/blob - src/guiPauseMenu.cpp
fixed crack animation timing in client
[dragonfireclient.git] / src / guiPauseMenu.cpp
1 /*\r
2 Minetest-c55\r
3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>\r
4 Original author Kabak Dmitry <userdima@gmail.com>, contributed under\r
5 the minetest contributor agreement.\r
6 \r
7 This program is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 This program is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License along\r
18 with this program; if not, write to the Free Software Foundation, Inc.,\r
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
20 */\r
21 \r
22 \r
23 #include "guiPauseMenu.h"\r
24 #include "debug.h"\r
25 #include "serialization.h"\r
26 \r
27 GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,\r
28                 gui::IGUIElement* parent, s32 id,\r
29                 IrrlichtDevice *dev):\r
30         IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,\r
31                         core::rect<s32>(0,0,100,100))\r
32 {\r
33         m_dev = dev;\r
34         m_screensize_old = v2u32(0,0);\r
35         \r
36         resizeGui();\r
37 \r
38         setVisible(false);\r
39 }\r
40 \r
41 GUIPauseMenu::~GUIPauseMenu()\r
42 {\r
43 }\r
44 \r
45 void GUIPauseMenu::resizeGui()\r
46 {\r
47         video::IVideoDriver* driver = Environment->getVideoDriver();\r
48         v2u32 screensize = driver->getScreenSize();\r
49         if(screensize == m_screensize_old)\r
50                 return;\r
51         m_screensize_old = screensize;\r
52 \r
53         /*\r
54                 Remove stuff\r
55         */\r
56         {\r
57                 gui::IGUIElement *e = getElementFromId(256);\r
58                 if(e != NULL)\r
59                         e->remove();\r
60         }\r
61         {\r
62                 gui::IGUIElement *e = getElementFromId(257);\r
63                 if(e != NULL)\r
64                         e->remove();\r
65         }\r
66         {\r
67                 gui::IGUIElement *e = getElementFromId(258);\r
68                 if(e != NULL)\r
69                         e->remove();\r
70         }\r
71         {\r
72                 gui::IGUIElement *e = getElementFromId(259);\r
73                 if(e != NULL)\r
74                         e->remove();\r
75         }\r
76 \r
77         core::rect<s32> rect(\r
78                         screensize.X/2 - 580/2,\r
79                         screensize.Y/2 - 300/2,\r
80                         screensize.X/2 + 580/2,\r
81                         screensize.Y/2 + 300/2\r
82         );\r
83         \r
84         DesiredRect = rect;\r
85         recalculateAbsolutePosition(false);\r
86 \r
87         v2s32 size = rect.getSize();\r
88 \r
89         /*\r
90                 Add stuff\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, 256, L"Continue");\r
96         }\r
97         {\r
98                 core::rect<s32> rect(0, 0, 140, 30);\r
99                 rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2+25);\r
100                 Environment->addButton(rect, this, 257, L"Exit");\r
101         }\r
102         {\r
103                 core::rect<s32> rect(0, 0, 180, 220);\r
104                 rect = rect + v2s32(size.X/2 + 90, size.Y/2-rect.getHeight()/2);\r
105                 const wchar_t *text =\r
106                 L"Keys:\n"\r
107                 L"- WASD: Walk\n"\r
108                 L"- Mouse left: dig blocks\n"\r
109                 L"- Mouse right: place blocks\n"\r
110                 L"- Mouse wheel: select item\n"\r
111                 L"- R: Toggle viewing all loaded chunks\n"\r
112                 L"- I: Inventory menu\n"\r
113                 L"- ESC: This menu\n"\r
114                 L"\n"\r
115                 L"To generate a new map, remove the map directory.\n";\r
116                 Environment->addStaticText(text, rect, false, true, this, 258);\r
117         }\r
118         {\r
119                 core::rect<s32> rect(0, 0, 180, 220);\r
120                 rect = rect + v2s32(size.X/2 - 90 - rect.getWidth(), size.Y/2-rect.getHeight()/2);\r
121                 wchar_t text[200];\r
122                 swprintf(text, 200,\r
123                                 L"Minetest-c55\n"\r
124                                 L"SER_FMT_VER_HIGHEST=%i",\r
125                                 (int)SER_FMT_VER_HIGHEST\r
126                 );\r
127         \r
128                 Environment->addStaticText(text, rect, false, true, this, 259);\r
129         }\r
130 }\r
131 \r
132 void GUIPauseMenu::draw()\r
133 {\r
134         if(!IsVisible)\r
135                 return;\r
136                 \r
137         gui::IGUISkin* skin = Environment->getSkin();\r
138         if (!skin)\r
139                 return;\r
140         video::IVideoDriver* driver = Environment->getVideoDriver();\r
141         \r
142         video::SColor bgcolor(140,0,0,0);\r
143         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\r
144 \r
145         gui::IGUIElement::draw();\r
146 }\r
147 \r
148 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
149 {\r
150         if(event.EventType==EET_KEY_INPUT_EVENT)\r
151         {\r
152                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)\r
153                 {\r
154                         setVisible(false);\r
155                         return true;\r
156                 }\r
157         }\r
158         if(event.EventType==EET_GUI_EVENT)\r
159         {\r
160                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST\r
161                                 && isVisible())\r
162                 {\r
163                         if(!canTakeFocus(event.GUIEvent.Element))\r
164                         {\r
165                                 dstream<<"GUIPauseMenu: Not allowing focus change."\r
166                                                 <<std::endl;\r
167                                 // Returning true disables focus change\r
168                                 return true;\r
169                         }\r
170                 }\r
171                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
172                 {\r
173                         switch(event.GUIEvent.Caller->getID())\r
174                         {\r
175                         case 256: // continue\r
176                                 setVisible(false);\r
177                                 break;\r
178                         case 257: // exit\r
179                                 m_dev->closeDevice();\r
180                                 break;\r
181                         }\r
182                 }\r
183         }\r
184 \r
185         return Parent ? Parent->OnEvent(event) : false;\r
186 }\r
187 \r
188 #if 0\r
189 GUIPauseMenu::GUIPauseMenu(IrrlichtDevice *device, IEventReceiver *recv):\r
190         dev(device),\r
191         oldRecv(recv)\r
192 {\r
193         if(!dev)\r
194                 return;\r
195         guienv=dev->getGUIEnvironment();\r
196 \r
197         if (!loadMenu())\r
198                 return;\r
199 \r
200         device->setEventReceiver(this); // now WE are the input receiver! ahhaha! \r
201 }\r
202 \r
203 GUIPauseMenu::~GUIPauseMenu(void)\r
204 {\r
205 }\r
206 \r
207 void GUIPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size\r
208 {\r
209         core::dimension2du screen=dev->getVideoDriver()->getScreenSize();\r
210         core::vector2di real=root->getAbsolutePosition().LowerRightCorner; // determine gui size stored in file (which is size of my menu root node)\r
211         float factorX=(float)screen.Width/(float)real.X;\r
212         float factorY=(float)screen.Height/(float)real.Y;\r
213         scaleGui(guienv->getRootGUIElement(),factorX,factorY);\r
214 }\r
215 void GUIPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale\r
216 {\r
217         if((node->getParent() && node->getParent()->getID()==255) || node->getID()==255) // modify only menu's elements\r
218         {\r
219                 int lx,rx,ly,ry;\r
220                 lx=(float)node->getRelativePosition().UpperLeftCorner.X*factorX;\r
221                 ly=(float)node->getRelativePosition().UpperLeftCorner.Y*factorY;\r
222                 rx=(float)node->getRelativePosition().LowerRightCorner.X*factorX;\r
223                 ry=(float)node->getRelativePosition().LowerRightCorner.Y*factorY;\r
224                 node->setRelativePosition(core::recti(lx,ly,rx,ry));\r
225         }\r
226 \r
227         core::list<gui::IGUIElement*>::ConstIterator it = node->getChildren().begin();\r
228         for(; it != node->getChildren().end(); ++it)\r
229                 scaleGui((*it),factorX,factorY);\r
230 }\r
231 \r
232 bool GUIPauseMenu::loadMenu()\r
233 {\r
234         guienv->loadGUI("../data/pauseMenu.gui");\r
235 \r
236         root=(gui::IGUIStaticText*)guienv->getRootGUIElement()->getElementFromId(255,true);\r
237         if(!root) // if there is no my root node then menu file not found or corrupted\r
238                 return false;\r
239 \r
240         scaleGui(); // scale gui to our screen size\r
241 \r
242         root->setVisible(false); // hide our menu\r
243         // make it transparent\r
244         //root->setBackgroundColor(video::SColor(100,128,100,128));\r
245         root->setBackgroundColor(video::SColor(140,0,0,0));\r
246 \r
247         return true;\r
248 }\r
249 \r
250 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
251 {\r
252         if(!dev->isWindowFocused())\r
253                 setVisible(true);\r
254 \r
255         bool ret=false;\r
256         if(oldRecv && !isVisible()) // call master if we have it and if we are inactive\r
257                 ret=oldRecv->OnEvent(event);\r
258 \r
259         if(ret==true)\r
260                 return true; // if the master receiver does the work\r
261 \r
262         if(event.EventType==EET_KEY_INPUT_EVENT)\r
263         {\r
264                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)\r
265                 {\r
266                         setVisible(!isVisible());\r
267                 }\r
268         }\r
269         if(event.EventType==EET_GUI_EVENT)\r
270         {\r
271                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
272                 {\r
273                         switch(event.GUIEvent.Caller->getID())\r
274                         {\r
275                         case 256: // continue\r
276                                 setVisible(false);\r
277                                 break;\r
278                         case 257: // exit\r
279                                 dev->closeDevice();\r
280                                 break;\r
281                         }\r
282                 }\r
283         }\r
284 \r
285         return false;\r
286 }\r
287 #endif\r
288 \r