]> git.lizzy.rs Git - minetest.git/blobdiff - src/guiPauseMenu.cpp
Add Client::getEnv() and remove some unnecessary wrappers
[minetest.git] / src / guiPauseMenu.cpp
index 676c145f25a10163e39e8925d0a631dd7753c366..e542a28e90ce63e1baed8637a483933715718b73 100644 (file)
@@ -1,8 +1,6 @@
 /*\r
 Minetest-c55\r
 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>\r
-Original author Kabak Dmitry <userdima@gmail.com>, contributed under\r
-the minetest contributor agreement.\r
 \r
 This program is free software; you can redistribute it and/or modify\r
 it under the terms of the GNU General Public License as published by\r
@@ -19,102 +17,252 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
 */\r
 \r
-\r
 #include "guiPauseMenu.h"\r
+#include "debug.h"\r
+#include "serialization.h"\r
+#include "porting.h"\r
+#include "config.h"\r
+#include "main.h"\r
+#include <IGUICheckBox.h>\r
+#include <IGUIEditBox.h>\r
+#include <IGUIButton.h>\r
+#include <IGUIStaticText.h>\r
+#include <IGUIFont.h>\r
+\r
+#include "gettext.h"\r
 \r
-void guiPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size\r
+GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,\r
+               gui::IGUIElement* parent, s32 id,\r
+               IGameCallback *gamecallback,\r
+               IMenuManager *menumgr,\r
+               bool simple_singleplayer_mode):\r
+       GUIModalMenu(env, parent, id, menumgr),\r
+       m_gamecallback(gamecallback),\r
+       m_simple_singleplayer_mode(simple_singleplayer_mode)\r
 {\r
-       core::dimension2du screen=dev->getVideoDriver()->getScreenSize();\r
-       core::vector2di real=root->getAbsolutePosition().LowerRightCorner; // determine gui size stored in file (which is size of my menu root node)\r
-       float factorX=(float)screen.Width/(float)real.X;\r
-       float factorY=(float)screen.Height/(float)real.Y;\r
-       scaleGui(guienv->getRootGUIElement(),factorX,factorY);\r
 }\r
-void guiPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale\r
+\r
+GUIPauseMenu::~GUIPauseMenu()\r
+{\r
+       removeChildren();\r
+}\r
+\r
+void GUIPauseMenu::removeChildren()\r
 {\r
-       if((node->getParent() && node->getParent()->getID()==255) || node->getID()==255) // modify only menu's elements\r
        {\r
-               int lx,rx,ly,ry;\r
-               lx=(float)node->getRelativePosition().UpperLeftCorner.X*factorX;\r
-               ly=(float)node->getRelativePosition().UpperLeftCorner.Y*factorY;\r
-               rx=(float)node->getRelativePosition().LowerRightCorner.X*factorX;\r
-               ry=(float)node->getRelativePosition().LowerRightCorner.Y*factorY;\r
-               node->setRelativePosition(core::recti(lx,ly,rx,ry));\r
+               gui::IGUIElement *e = getElementFromId(256);\r
+               if(e != NULL)\r
+                       e->remove();\r
+       }\r
+       {\r
+               gui::IGUIElement *e = getElementFromId(257);\r
+               if(e != NULL)\r
+                       e->remove();\r
+       }\r
+       {\r
+               gui::IGUIElement *e = getElementFromId(258);\r
+               if(e != NULL)\r
+                       e->remove();\r
+       }\r
+       {\r
+               gui::IGUIElement *e = getElementFromId(259);\r
+               if(e != NULL)\r
+                       e->remove();\r
+       }\r
+       {\r
+               gui::IGUIElement *e = getElementFromId(260);\r
+               if(e != NULL)\r
+                       e->remove();\r
+       }\r
+       {\r
+               gui::IGUIElement *e = getElementFromId(261);\r
+               if(e != NULL)\r
+                       e->remove();\r
        }\r
-\r
-       core::list<gui::IGUIElement*>::ConstIterator it = node->getChildren().begin();\r
-       for(; it != node->getChildren().end(); ++it)\r
-               scaleGui((*it),factorX,factorY);\r
 }\r
 \r
-bool guiPauseMenu::loadMenu()\r
+void GUIPauseMenu::regenerateGui(v2u32 screensize)\r
 {\r
-       guienv->loadGUI("../data/pauseMenu.gui");\r
+       /*\r
+               Remove stuff\r
+       */\r
+       removeChildren();\r
+       \r
+       /*\r
+               Calculate new sizes and positions\r
+       */\r
+       core::rect<s32> rect(\r
+                       screensize.X/2 - 580/2,\r
+                       screensize.Y/2 - 300/2,\r
+                       screensize.X/2 + 580/2,\r
+                       screensize.Y/2 + 300/2\r
+       );\r
+       \r
+       DesiredRect = rect;\r
+       recalculateAbsolutePosition(false);\r
 \r
-       root=(gui::IGUIStaticText*)guienv->getRootGUIElement()->getElementFromId(255,true);\r
-       if(!root) // if there is no my root node then menu file not found or corrupted\r
-               return false;\r
+       v2s32 size = rect.getSize();\r
 \r
-       scaleGui(); // scale gui to our screen size\r
+       /*\r
+               Add stuff\r
+       */\r
+       const s32 btn_height = 30;\r
+       const s32 btn_gap = 20;\r
+       const s32 btn_num = m_simple_singleplayer_mode ? 3 : 4;\r
+       s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;\r
+       changeCtype("");\r
+       {\r
+               core::rect<s32> rect(0, 0, 140, btn_height);\r
+               rect = rect + v2s32(size.X/2-140/2, btn_y);\r
+               Environment->addButton(rect, this, 256,\r
+                       wgettext("Continue"));\r
+       }\r
+       btn_y += btn_height + btn_gap;\r
+       if(!m_simple_singleplayer_mode)\r
+       {\r
+               {\r
+                       core::rect<s32> rect(0, 0, 140, btn_height);\r
+                       rect = rect + v2s32(size.X/2-140/2, btn_y);\r
+                       Environment->addButton(rect, this, 261,\r
+                               wgettext("Change Password"));\r
+               }\r
+               btn_y += btn_height + btn_gap;\r
+       }\r
+       {\r
+               core::rect<s32> rect(0, 0, 140, btn_height);\r
+               rect = rect + v2s32(size.X/2-140/2, btn_y);\r
+               Environment->addButton(rect, this, 260,\r
+                       wgettext("Exit to Menu"));\r
+       }\r
+       btn_y += btn_height + btn_gap;\r
+       {\r
+               core::rect<s32> rect(0, 0, 140, btn_height);\r
+               rect = rect + v2s32(size.X/2-140/2, btn_y);\r
+               Environment->addButton(rect, this, 257,\r
+                       wgettext("Exit to OS"));\r
+       }\r
+\r
+       {\r
+               core::rect<s32> rect(0, 0, 180, 240);\r
+               rect = rect + v2s32(size.X/2 + 90, size.Y/2-rect.getHeight()/2);\r
+               Environment->addStaticText(chartowchar_t(gettext(\r
+               "Default Controls:\n"\r
+               "- WASD: Walk\n"\r
+               "- Mouse left: dig/hit\n"\r
+               "- Mouse right: place/use\n"\r
+               "- Mouse wheel: select item\n"\r
+               "- 0...9: select item\n"\r
+               "- Shift: sneak\n"\r
+               "- R: Toggle viewing all loaded chunks\n"\r
+               "- I: Inventory menu\n"\r
+               "- ESC: This menu\n"\r
+               "- T: Chat\n"\r
+               )), rect, false, true, this, 258);\r
+       }\r
+       {\r
+               core::rect<s32> rect(0, 0, 180, 220);\r
+               rect = rect + v2s32(size.X/2 - 90 - rect.getWidth(), size.Y/2-rect.getHeight()/2);\r
+       \r
+               v2u32 max_texture_size;\r
+               {\r
+                       video::IVideoDriver* driver = Environment->getVideoDriver();\r
+                       max_texture_size = driver->getMaxTextureSize();\r
+               }\r
 \r
-       root->setVisible(false); // hide our menu\r
-       // make it transparent\r
-       //root->setBackgroundColor(video::SColor(100,128,100,128));\r
-       root->setBackgroundColor(video::SColor(140,0,0,0));\r
+               /*wchar_t text[200];\r
+               swprintf(text, 200,\r
+                               L"Minetest-c55\n"\r
+                               L"by Perttu Ahola\n"\r
+                               L"celeron55@gmail.com\n\n"\r
+                               SWPRINTF_CHARSTRING L"\n"\r
+                               L"userdata path = "\r
+                               SWPRINTF_CHARSTRING\r
+                               ,\r
+                               BUILD_INFO,\r
+                               porting::path_user.c_str()\r
+               );*/\r
 \r
-       return true;\r
+               std::ostringstream os;\r
+               os<<"Minetest\n";\r
+               os<<"by Perttu Ahola and contributors\n";\r
+               os<<"celeron55@gmail.com\n";\r
+               os<<BUILD_INFO<<"\n";\r
+               os<<"path_user = "<<wrap_rows(porting::path_user, 20)<<"\n";\r
+       \r
+               Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);\r
+       }\r
+       changeCtype("C");\r
 }\r
 \r
-guiPauseMenu::guiPauseMenu(IrrlichtDevice *device, IEventReceiver *recv) : dev(device), oldRecv(recv)\r
+void GUIPauseMenu::drawMenu()\r
 {\r
-       if(!dev)\r
+       gui::IGUISkin* skin = Environment->getSkin();\r
+       if (!skin)\r
                return;\r
-       guienv=dev->getGUIEnvironment();\r
+       video::IVideoDriver* driver = Environment->getVideoDriver();\r
+       \r
+       video::SColor bgcolor(140,0,0,0);\r
+       driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\r
 \r
-       if (!loadMenu())\r
-               return;\r
-\r
-       device->setEventReceiver(this); // now WE are the input receiver! ahhaha! \r
+       gui::IGUIElement::draw();\r
 }\r
 \r
-bool guiPauseMenu::OnEvent(const SEvent& event)\r
+bool GUIPauseMenu::OnEvent(const SEvent& event)\r
 {\r
-       if(!dev->isWindowFocused())\r
-               setVisible(true);\r
-\r
-       bool ret=false;\r
-       if(oldRecv && !isVisible()) // call master if we have it and if we are inactive\r
-               ret=oldRecv->OnEvent(event);\r
-\r
-       if(ret==true)\r
-               return true; // if the master receiver does the work\r
 \r
        if(event.EventType==EET_KEY_INPUT_EVENT)\r
        {\r
-               if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)\r
+               if(event.KeyInput.PressedDown)\r
                {\r
-                       setVisible(!isVisible());\r
+                       if(event.KeyInput.Key==KEY_ESCAPE)\r
+                       {\r
+                               quitMenu();\r
+                               return true;\r
+                       }\r
+                       else if(event.KeyInput.Key==KEY_RETURN)\r
+                       {\r
+                               quitMenu();\r
+                               return true;\r
+                       }\r
                }\r
        }\r
        if(event.EventType==EET_GUI_EVENT)\r
        {\r
+               if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST\r
+                               && isVisible())\r
+               {\r
+                       if(!canTakeFocus(event.GUIEvent.Element))\r
+                       {\r
+                               dstream<<"GUIPauseMenu: Not allowing focus change."\r
+                                               <<std::endl;\r
+                               // Returning true disables focus change\r
+                               return true;\r
+                       }\r
+               }\r
                if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)\r
                {\r
                        switch(event.GUIEvent.Caller->getID())\r
                        {\r
                        case 256: // continue\r
-                               setVisible(false);\r
-                               break;\r
+                               quitMenu();\r
+                               // ALWAYS return immediately after quitMenu()\r
+                               return true;\r
+                       case 261:\r
+                               quitMenu();\r
+                               m_gamecallback->changePassword();\r
+                               return true;\r
+                       case 260: // disconnect\r
+                               m_gamecallback->disconnect();\r
+                               quitMenu();\r
+                               return true;\r
                        case 257: // exit\r
-                               dev->closeDevice();\r
-                               break;\r
+                               m_gamecallback->exitToOS();\r
+                               quitMenu();\r
+                               return true;\r
                        }\r
                }\r
        }\r
-\r
-       return false;\r
+       \r
+       return Parent ? Parent->OnEvent(event) : false;\r
 }\r
 \r
-guiPauseMenu::~guiPauseMenu(void)\r
-{\r
-}\r