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
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
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
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
23 #include "guiPauseMenu.h"
\r
25 #include "serialization.h"
\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
34 m_screensize_old = v2u32(0,0);
\r
41 GUIPauseMenu::~GUIPauseMenu()
\r
45 void GUIPauseMenu::resizeGui()
\r
47 video::IVideoDriver* driver = Environment->getVideoDriver();
\r
48 v2u32 screensize = driver->getScreenSize();
\r
49 if(screensize == m_screensize_old)
\r
51 m_screensize_old = screensize;
\r
57 gui::IGUIElement *e = getElementFromId(256);
\r
62 gui::IGUIElement *e = getElementFromId(257);
\r
67 gui::IGUIElement *e = getElementFromId(258);
\r
72 gui::IGUIElement *e = getElementFromId(259);
\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
85 recalculateAbsolutePosition(false);
\r
87 v2s32 size = rect.getSize();
\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
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
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
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
115 L"To generate a new map, remove the map directory.\n";
\r
116 Environment->addStaticText(text, rect, false, true, this, 258);
\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
122 swprintf(text, 200,
\r
124 L"SER_FMT_VER_HIGHEST=%i",
\r
125 (int)SER_FMT_VER_HIGHEST
\r
128 Environment->addStaticText(text, rect, false, true, this, 259);
\r
132 void GUIPauseMenu::draw()
\r
137 gui::IGUISkin* skin = Environment->getSkin();
\r
140 video::IVideoDriver* driver = Environment->getVideoDriver();
\r
142 video::SColor bgcolor(140,0,0,0);
\r
143 driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
\r
145 gui::IGUIElement::draw();
\r
148 bool GUIPauseMenu::OnEvent(const SEvent& event)
\r
150 if(event.EventType==EET_KEY_INPUT_EVENT)
\r
152 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
\r
158 if(event.EventType==EET_GUI_EVENT)
\r
160 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
\r
163 if(!canTakeFocus(event.GUIEvent.Element))
\r
165 dstream<<"GUIPauseMenu: Not allowing focus change."
\r
167 // Returning true disables focus change
\r
171 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
\r
173 switch(event.GUIEvent.Caller->getID())
\r
175 case 256: // continue
\r
179 m_dev->closeDevice();
\r
185 return Parent ? Parent->OnEvent(event) : false;
\r
189 GUIPauseMenu::GUIPauseMenu(IrrlichtDevice *device, IEventReceiver *recv):
\r
195 guienv=dev->getGUIEnvironment();
\r
200 device->setEventReceiver(this); // now WE are the input receiver! ahhaha!
\r
203 GUIPauseMenu::~GUIPauseMenu(void)
\r
207 void GUIPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size
\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
215 void GUIPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale
\r
217 if((node->getParent() && node->getParent()->getID()==255) || node->getID()==255) // modify only menu's elements
\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
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
232 bool GUIPauseMenu::loadMenu()
\r
234 guienv->loadGUI("../data/pauseMenu.gui");
\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
240 scaleGui(); // scale gui to our screen size
\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
250 bool GUIPauseMenu::OnEvent(const SEvent& event)
\r
252 if(!dev->isWindowFocused())
\r
256 if(oldRecv && !isVisible()) // call master if we have it and if we are inactive
\r
257 ret=oldRecv->OnEvent(event);
\r
260 return true; // if the master receiver does the work
\r
262 if(event.EventType==EET_KEY_INPUT_EVENT)
\r
264 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
\r
266 setVisible(!isVisible());
\r
269 if(event.EventType==EET_GUI_EVENT)
\r
271 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
\r
273 switch(event.GUIEvent.Caller->getID())
\r
275 case 256: // continue
\r
279 dev->closeDevice();
\r