aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guiPauseMenu.cpp120
-rw-r--r--src/guiPauseMenu.h53
2 files changed, 173 insertions, 0 deletions
diff --git a/src/guiPauseMenu.cpp b/src/guiPauseMenu.cpp
new file mode 100644
index 000000000..676c145f2
--- /dev/null
+++ b/src/guiPauseMenu.cpp
@@ -0,0 +1,120 @@
+/*
+Minetest-c55
+Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Original author Kabak Dmitry <userdima@gmail.com>, contributed under
+the minetest contributor agreement.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+
+#include "guiPauseMenu.h"
+
+void guiPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size
+{
+ core::dimension2du screen=dev->getVideoDriver()->getScreenSize();
+ core::vector2di real=root->getAbsolutePosition().LowerRightCorner; // determine gui size stored in file (which is size of my menu root node)
+ float factorX=(float)screen.Width/(float)real.X;
+ float factorY=(float)screen.Height/(float)real.Y;
+ scaleGui(guienv->getRootGUIElement(),factorX,factorY);
+}
+void guiPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale
+{
+ if((node->getParent() && node->getParent()->getID()==255) || node->getID()==255) // modify only menu's elements
+ {
+ int lx,rx,ly,ry;
+ lx=(float)node->getRelativePosition().UpperLeftCorner.X*factorX;
+ ly=(float)node->getRelativePosition().UpperLeftCorner.Y*factorY;
+ rx=(float)node->getRelativePosition().LowerRightCorner.X*factorX;
+ ry=(float)node->getRelativePosition().LowerRightCorner.Y*factorY;
+ node->setRelativePosition(core::recti(lx,ly,rx,ry));
+ }
+
+ core::list<gui::IGUIElement*>::ConstIterator it = node->getChildren().begin();
+ for(; it != node->getChildren().end(); ++it)
+ scaleGui((*it),factorX,factorY);
+}
+
+bool guiPauseMenu::loadMenu()
+{
+ guienv->loadGUI("../data/pauseMenu.gui");
+
+ root=(gui::IGUIStaticText*)guienv->getRootGUIElement()->getElementFromId(255,true);
+ if(!root) // if there is no my root node then menu file not found or corrupted
+ return false;
+
+ scaleGui(); // scale gui to our screen size
+
+ root->setVisible(false); // hide our menu
+ // make it transparent
+ //root->setBackgroundColor(video::SColor(100,128,100,128));
+ root->setBackgroundColor(video::SColor(140,0,0,0));
+
+ return true;
+}
+
+guiPauseMenu::guiPauseMenu(IrrlichtDevice *device, IEventReceiver *recv) : dev(device), oldRecv(recv)
+{
+ if(!dev)
+ return;
+ guienv=dev->getGUIEnvironment();
+
+ if (!loadMenu())
+ return;
+
+ device->setEventReceiver(this); // now WE are the input receiver! ahhaha!
+}
+
+bool guiPauseMenu::OnEvent(const SEvent& event)
+{
+ if(!dev->isWindowFocused())
+ setVisible(true);
+
+ bool ret=false;
+ if(oldRecv && !isVisible()) // call master if we have it and if we are inactive
+ ret=oldRecv->OnEvent(event);
+
+ if(ret==true)
+ return true; // if the master receiver does the work
+
+ if(event.EventType==EET_KEY_INPUT_EVENT)
+ {
+ if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
+ {
+ setVisible(!isVisible());
+ }
+ }
+ if(event.EventType==EET_GUI_EVENT)
+ {
+ if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
+ {
+ switch(event.GUIEvent.Caller->getID())
+ {
+ case 256: // continue
+ setVisible(false);
+ break;
+ case 257: // exit
+ dev->closeDevice();
+ break;
+ }
+ }
+ }
+
+ return false;
+}
+
+guiPauseMenu::~guiPauseMenu(void)
+{
+}
diff --git a/src/guiPauseMenu.h b/src/guiPauseMenu.h
new file mode 100644
index 000000000..28ac02bc9
--- /dev/null
+++ b/src/guiPauseMenu.h
@@ -0,0 +1,53 @@
+/*
+Minetest-c55
+Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Original author Kabak Dmitry <userdima@gmail.com>, contributed under
+the minetest contributor agreement.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+
+#ifndef GUIPAUSEMENU_HEADER
+#define GUIPAUSEMENU_HEADER
+
+#include <irrlicht.h>
+using namespace irr;
+
+class guiPauseMenu : public IEventReceiver
+{
+private:
+ IrrlichtDevice *dev;
+ gui::IGUIEnvironment *guienv;
+ IEventReceiver *oldRecv;
+
+ gui::IGUIStaticText *root;
+
+ bool loadMenu();
+ void scaleGui();
+ void scaleGui(gui::IGUIElement *node,float factorX,float factorY);
+public:
+ guiPauseMenu(IrrlichtDevice *device,IEventReceiver *recv);
+
+ void setVisible(bool visible){root->setVisible(visible);};
+ bool isVisible(){return root->isVisible();};
+
+ bool OnEvent(const SEvent& event);
+
+ ~guiPauseMenu(void);
+};
+
+#endif
+