From be2c7dfb97c4e617eaa2fef94da822c5e4e9ffd1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Tue, 14 Dec 2010 03:07:37 +0200 Subject: [PATCH] pausemenu stuff --- data/pauseMenu.gui | Bin 0 -> 15170 bytes src/guiPauseMenu.cpp | 120 +++++++++++++++++++++++++++++++++++++++++++ src/guiPauseMenu.h | 53 +++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 data/pauseMenu.gui create mode 100644 src/guiPauseMenu.cpp create mode 100644 src/guiPauseMenu.h diff --git a/data/pauseMenu.gui b/data/pauseMenu.gui new file mode 100644 index 0000000000000000000000000000000000000000..78fa02a9a61656cbd04cad83c7770c29263dfc2d GIT binary patch literal 15170 zcmeHOT~8ZF6rI;p>VJsx+ycfxh(sF&Xai~}X-tylsWP@nA`Doz3A8`H?Kv|HyX(1k zcJ_m)s;t$r)~-4C&Yk;l=Fa+`zjw@Yb89Zl*gQ60%*ag5%zQRi=FAO! zH$R$h%{OKT&!#y3Fdxk|KD)bo@(9oRW{zWu`=@w12iolJ8;|Vs5m2uo>oKlx@P_U%ywd$ww*83`fxsbn1jDCccE=M$fcn@Bvf(_ za+d>K^*Y&wx2NId=P#d|d4Gs8eG;|ZOhn(q|Bo*l}C0S3pm-@OJY2Z!K@~M~5c!D*+1Xr0&cTjWd`|J^HlQFDV+@)Gu8pRQ` zzrDA6OiI%jERHAc>FtduF6Wu?M>tQ68?HYuk)w*MOv#SN$dF{M#3@$hWAlsP1=Y~W zy<7xKb$Rh=ag|w3(g&NF!%<}So1p&+77$|lyQ#?ZQqP3)*>ew>=>I{S|OERg;vn~bRE1kl>rRETG`X1C%hF`YSi&r;^^~e z`@p<`pM<%A{j=0+kVkw4Up<50$%xXbPMY;R;v4v^*41)dKFTWh{R?PD{(q!KR28(r z0zc3A`bb>e5?kt9NuwWPp06;^@!3gT_sozj*^wQay#zn%CP%!C8`n8C>e-1JV&1R7 zPuYcbU9S`yr{;i*J1>a)Yiitkv@%~!jZu%MMf*l_Y4(^Zt?s(Y+^L}_7FqUL4DT)*kaejJj{ z@*bMcL@(ectawsYzJ^xxnW^#LPRGx3(?dyMKY3yv3Y|Mdt`c0dAcMVDc3X@7@(z}# zH=Qckgez0-Y)V#_5r4uw_V4hdu6K3B6N}e_Eog0OQe?v1#TsK2RkU=N+yP>LzB;Ou zcO2$1FtuI1@0G}tEy>j?R{;86Mb%N$qjc@6&&)Aqg0ac&1;@Mxe7Bcf<^^@;%6S(gSSwb{7w+BQnblA^x(dFK2#QZ*OG)3&cG@ZV-2S{ zZoJ4A_`f`_+rsi$7`JC?mjeBvP)h4T~Xy&TUHnnr^zp*>ci%V>vJ==iJyZ7~ZzHNyqCRF_enDNOJXOvxv`Ca^s6NBct@#>RZH8V^zK;=ByjcAw_8fJ9 z@B6S1I9lMWhqk}N{oD{YteixX*JK$^+UiVS;go6o+G@akX!go7xy|&~P}>-d>@RQa z2$)+ZnBhM79{*nAVAT#sQ#Q-8l--&vRrg80U%@rPC~EtdwyEr8)mmZ%4<%ol2OW+7 z7P|?1hmI4}XE(ngV%eLh5{J6KW~_$&zeQHVKG%}f`1g)eIwgz{c^$E2HTnG%7X@;5 zTC$q2&uYSb!`KWhS&e(!P0y>I$z+{pEsw@{n8rUs9#EwkXsB(BMvmwutKkYK{QZmD z$6?KA!fN=Yf%C_&)3FJ6Fq?9kD&DJmX~t#9S{Qj*e}-?JXc4&V&uDCN$z)PFpPcvp zFH9!3ZqwI<&31r@TdzYS?*Zw0He)lf`t9F=c0HD`YOmmTl&k1hu&dt3rwgp@hWHgF z-}&O({`@^9cVgJrSV2dC@2|?aQue>9bvNFJ)AnJqJ*jYn`8^kT-$kF7w4Q>la~mCn MSY_rj?RT&L0)UCY?*IS* literal 0 HcmV?d00001 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 +Original author Kabak Dmitry , 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::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 +Original author Kabak Dmitry , 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 +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 +