1 /* 2 Minetest 3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com> 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU Lesser General Public License as published by 7 the Free Software Foundation; either version 2.1 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License along 16 with this program; if not, write to the Free Software Foundation, Inc., 17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 #pragma once 21 22 /* 23 All kinds of stuff that needs to be exposed from main.cpp 24 */ 25 #include "modalMenu.h" 26 #include <cassert> 27 #include <list> 28 29 class IGameCallback 30 { 31 public: 32 virtual void exitToOS() = 0; 33 virtual void keyConfig() = 0; 34 virtual void disconnect() = 0; 35 virtual void changePassword() = 0; 36 virtual void changeVolume() = 0; 37 38 virtual void signalKeyConfigChange() = 0; 39 }; 40 41 extern gui::IGUIEnvironment *guienv; 42 extern gui::IGUIStaticText *guiroot; 43 44 // Handler for the modal menus 45 46 class MainMenuManager : public IMenuManager 47 { 48 public: createdMenu(gui::IGUIElement * menu)49 virtual void createdMenu(gui::IGUIElement *menu) 50 { 51 #ifndef NDEBUG 52 for (gui::IGUIElement *i : m_stack) { 53 assert(i != menu); 54 } 55 #endif 56 57 if(!m_stack.empty()) 58 m_stack.back()->setVisible(false); 59 m_stack.push_back(menu); 60 } 61 deletingMenu(gui::IGUIElement * menu)62 virtual void deletingMenu(gui::IGUIElement *menu) 63 { 64 // Remove all entries if there are duplicates 65 m_stack.remove(menu); 66 67 /*core::list<GUIModalMenu*>::Iterator i = m_stack.getLast(); 68 assert(*i == menu); 69 m_stack.erase(i);*/ 70 71 if(!m_stack.empty()) 72 m_stack.back()->setVisible(true); 73 } 74 75 // Returns true to prevent further processing preprocessEvent(const SEvent & event)76 virtual bool preprocessEvent(const SEvent& event) 77 { 78 if (m_stack.empty()) 79 return false; 80 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back()); 81 return mm && mm->preprocessEvent(event); 82 } 83 menuCount()84 u32 menuCount() 85 { 86 return m_stack.size(); 87 } 88 pausesGame()89 bool pausesGame() 90 { 91 for (gui::IGUIElement *i : m_stack) { 92 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(i); 93 if (mm && mm->pausesGame()) 94 return true; 95 } 96 return false; 97 } 98 99 std::list<gui::IGUIElement*> m_stack; 100 }; 101 102 extern MainMenuManager g_menumgr; 103 104 extern bool isMenuActive(); 105 106 class MainGameCallback : public IGameCallback 107 { 108 public: 109 MainGameCallback() = default; 110 virtual ~MainGameCallback() = default; 111 exitToOS()112 virtual void exitToOS() 113 { 114 shutdown_requested = true; 115 } 116 disconnect()117 virtual void disconnect() 118 { 119 disconnect_requested = true; 120 } 121 changePassword()122 virtual void changePassword() 123 { 124 changepassword_requested = true; 125 } 126 changeVolume()127 virtual void changeVolume() 128 { 129 changevolume_requested = true; 130 } 131 keyConfig()132 virtual void keyConfig() 133 { 134 keyconfig_requested = true; 135 } 136 signalKeyConfigChange()137 virtual void signalKeyConfigChange() 138 { 139 keyconfig_changed = true; 140 } 141 142 143 bool disconnect_requested = false; 144 bool changepassword_requested = false; 145 bool changevolume_requested = false; 146 bool keyconfig_requested = false; 147 bool shutdown_requested = false; 148 149 bool keyconfig_changed = false; 150 }; 151 152 extern MainGameCallback *g_gamecallback; 153