]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/guiPauseMenu.cpp
Merged minetest-delta a624fe549bc75855a170
[dragonfireclient.git] / src / guiPauseMenu.cpp
index 73e406e18096f879949f2119e1e8bec00190f2fc..5f40a4820462decaea4dad57a86c502c470a1cac 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,36 +17,31 @@ 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
+\r
+#include "gettext.h"\r
 \r
 GUIPauseMenu::GUIPauseMenu(gui::IGUIEnvironment* env,\r
                gui::IGUIElement* parent, s32 id,\r
-               IrrlichtDevice *dev):\r
-       IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,\r
-                       core::rect<s32>(0,0,100,100))\r
+               IGameCallback *gamecallback,\r
+               IMenuManager *menumgr):\r
+       GUIModalMenu(env, parent, id, menumgr)\r
 {\r
-       m_dev = dev;\r
-       m_screensize_old = v2u32(0,0);\r
-       \r
-       resizeGui();\r
-\r
-       setVisible(false);\r
+       m_gamecallback = gamecallback;\r
 }\r
 \r
 GUIPauseMenu::~GUIPauseMenu()\r
 {\r
+       removeChildren();\r
 }\r
 \r
-void GUIPauseMenu::resizeGui()\r
+void GUIPauseMenu::removeChildren()\r
 {\r
-       video::IVideoDriver* driver = Environment->getVideoDriver();\r
-       v2u32 screensize = driver->getScreenSize();\r
-       if(screensize == m_screensize_old)\r
-               return;\r
-       m_screensize_old = screensize;\r
-\r
        {\r
                gui::IGUIElement *e = getElementFromId(256);\r
                if(e != NULL)\r
@@ -59,11 +52,42 @@ void GUIPauseMenu::resizeGui()
                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
 \r
+void GUIPauseMenu::regenerateGui(v2u32 screensize)\r
+{\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 - 560/2,\r
+                       screensize.X/2 - 580/2,\r
                        screensize.Y/2 - 300/2,\r
-                       screensize.X/2 + 560/2,\r
+                       screensize.X/2 + 580/2,\r
                        screensize.Y/2 + 300/2\r
        );\r
        \r
@@ -72,23 +96,90 @@ void GUIPauseMenu::resizeGui()
 \r
        v2s32 size = rect.getSize();\r
 \r
+       /*\r
+               Add stuff\r
+       */\r
+       const s32 btn_height = 30;\r
+       const s32 btn_gap = 20;\r
+       const s32 btn_num = 4;\r
+       s32 btn_y = size.Y/2-((btn_num*btn_height+(btn_num-1)*btn_gap))/2;\r
        {\r
-               core::rect<s32> rect(0, 0, 140, 30);\r
-               rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2-25);\r
-               Environment->addButton(rect, this, 256, L"Continue");\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, chartowchar_t(gettext("Continue")));\r
        }\r
+       btn_y += btn_height + btn_gap;\r
        {\r
-               core::rect<s32> rect(0, 0, 140, 30);\r
-               rect = rect + v2s32(size.X/2-140/2, size.Y/2-30/2+25);\r
-               Environment->addButton(rect, this, 257, L"Exit");\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, chartowchar_t(gettext("Change Password")));\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, 260, chartowchar_t(gettext("Disconnect")));\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, chartowchar_t(gettext("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
+               "Keys:\n"\r
+               "- WASD: Walk\n"\r
+               "- Mouse left: dig blocks\n"\r
+               "- Mouse right: place blocks\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
+               /*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_userdata.c_str()\r
+               );*/\r
+\r
+               std::ostringstream os;\r
+               os<<"Minetest-delta\n";\r
+               os<<"by Perttu Ahola and contributors\n";\r
+               os<<"celeron55@gmail.com\n";\r
+               os<<BUILD_INFO<<"\n";\r
+               os<<"ud_path = "<<wrap_rows(porting::path_userdata, 20)<<"\n";\r
+       \r
+               Environment->addStaticText(narrow_to_wide(os.str()).c_str(), rect, false, true, this, 259);\r
        }\r
 }\r
 \r
-void GUIPauseMenu::draw()\r
+void GUIPauseMenu::drawMenu()\r
 {\r
-       if(!IsVisible)\r
-               return;\r
-               \r
        gui::IGUISkin* skin = Environment->getSkin();\r
        if (!skin)\r
                return;\r
@@ -102,12 +193,21 @@ void GUIPauseMenu::draw()
 \r
 bool GUIPauseMenu::OnEvent(const SEvent& event)\r
 {\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(false);\r
-                       return true;\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
@@ -128,116 +228,25 @@ bool GUIPauseMenu::OnEvent(const SEvent& event)
                        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
-                               m_dev->closeDevice();\r
-                               break;\r
+                               m_gamecallback->exitToOS();\r
+                               quitMenu();\r
+                               return true;\r
                        }\r
                }\r
        }\r
-\r
+       \r
        return Parent ? Parent->OnEvent(event) : false;\r
 }\r
 \r
-#if 0\r
-GUIPauseMenu::GUIPauseMenu(IrrlichtDevice *device, IEventReceiver *recv):\r
-       dev(device),\r
-       oldRecv(recv)\r
-{\r
-       if(!dev)\r
-               return;\r
-       guienv=dev->getGUIEnvironment();\r
-\r
-       if (!loadMenu())\r
-               return;\r
-\r
-       device->setEventReceiver(this); // now WE are the input receiver! ahhaha! \r
-}\r
-\r
-GUIPauseMenu::~GUIPauseMenu(void)\r
-{\r
-}\r
-\r
-void GUIPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size\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
-       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
-       }\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
-{\r
-       guienv->loadGUI("../data/pauseMenu.gui");\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
-\r
-       scaleGui(); // scale gui to our screen size\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
-\r
-       return true;\r
-}\r
-\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
-               {\r
-                       setVisible(!isVisible());\r
-               }\r
-       }\r
-       if(event.EventType==EET_GUI_EVENT)\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
-                       case 257: // exit\r
-                               dev->closeDevice();\r
-                               break;\r
-                       }\r
-               }\r
-       }\r
-\r
-       return false;\r
-}\r
-#endif\r
-\r