/*\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
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
+ IGameCallback *gamecallback,\r
+ IMenuManager *menumgr):\r
+ GUIModalMenu(env, parent, id, menumgr)\r
+{\r
+ m_gamecallback = gamecallback;\r
+}\r
\r
-void guiPauseMenu::scaleGui() // this function scales gui from the size stored in file to screen size\r
+GUIPauseMenu::~GUIPauseMenu()\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
+ removeChildren();\r
}\r
-void guiPauseMenu::scaleGui(gui::IGUIElement *node,float factorX,float factorY) // recursive set scale\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 = 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, btn_height);\r
+ rect = rect + v2s32(size.X/2-140/2, btn_y);\r
+ Environment->addButton(rect, this, 256,\r
+ chartowchar_t(gettext("Continue")));\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, 261,\r
+ 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,\r
+ 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,\r
+ 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
- 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_userdata.c_str()\r
+ );*/\r
\r
- return true;\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
-guiPauseMenu::guiPauseMenu(IrrlichtDevice *device, IEventReceiver *recv) : dev(device), oldRecv(recv)\r
+void GUIPauseMenu::drawMenu()\r
{\r
- if(!dev)\r
- return;\r
- guienv=dev->getGUIEnvironment();\r
-\r
- if (!loadMenu())\r
+ gui::IGUISkin* skin = Environment->getSkin();\r
+ if (!skin)\r
return;\r
+ video::IVideoDriver* driver = Environment->getVideoDriver();\r
+ \r
+ video::SColor bgcolor(140,0,0,0);\r
+ driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);\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