]> git.lizzy.rs Git - minetest.git/blob - src/mainmenumanager.h
Optimize headers (part 2) (#6272)
[minetest.git] / src / mainmenumanager.h
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:
49         virtual void createdMenu(gui::IGUIElement *menu)
50         {
51                 for (gui::IGUIElement *i : m_stack) {
52                         assert(i != menu);
53                 }
54
55                 if(!m_stack.empty())
56                         m_stack.back()->setVisible(false);
57                 m_stack.push_back(menu);
58         }
59
60         virtual void deletingMenu(gui::IGUIElement *menu)
61         {
62                 // Remove all entries if there are duplicates
63                 bool removed_entry;
64                 do{
65                         removed_entry = false;
66                         for(std::list<gui::IGUIElement*>::iterator
67                                         i = m_stack.begin();
68                                         i != m_stack.end(); ++i)
69                         {
70                                 if(*i == menu)
71                                 {
72                                         m_stack.erase(i);
73                                         removed_entry = true;
74                                         break;
75                                 }
76                         }
77                 }while(removed_entry);
78
79                 /*core::list<GUIModalMenu*>::Iterator i = m_stack.getLast();
80                 assert(*i == menu);
81                 m_stack.erase(i);*/
82
83                 if(!m_stack.empty())
84                         m_stack.back()->setVisible(true);
85         }
86
87         // Returns true to prevent further processing
88         virtual bool preprocessEvent(const SEvent& event)
89         {
90                 if (m_stack.empty())
91                         return false;
92                 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
93                 return mm && mm->preprocessEvent(event);
94         }
95
96         u32 menuCount()
97         {
98                 return m_stack.size();
99         }
100
101         bool pausesGame()
102         {
103                 for (gui::IGUIElement *i : m_stack) {
104                         GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(i);
105                         if (mm && mm->pausesGame())
106                                 return true;
107                 }
108                 return false;
109         }
110
111         std::list<gui::IGUIElement*> m_stack;
112 };
113
114 extern MainMenuManager g_menumgr;
115
116 extern bool isMenuActive();
117
118 class MainGameCallback : public IGameCallback
119 {
120 public:
121         MainGameCallback() = default;
122         virtual ~MainGameCallback() = default;
123
124         virtual void exitToOS()
125         {
126                 shutdown_requested = true;
127         }
128
129         virtual void disconnect()
130         {
131                 disconnect_requested = true;
132         }
133
134         virtual void changePassword()
135         {
136                 changepassword_requested = true;
137         }
138
139         virtual void changeVolume()
140         {
141                 changevolume_requested = true;
142         }
143
144         virtual void keyConfig()
145         {
146                 keyconfig_requested = true;
147         }
148
149         virtual void signalKeyConfigChange()
150         {
151                 keyconfig_changed = true;
152         }
153
154
155         bool disconnect_requested = false;
156         bool changepassword_requested = false;
157         bool changevolume_requested = false;
158         bool keyconfig_requested = false;
159         bool shutdown_requested = false;
160
161         bool keyconfig_changed = false;
162 };
163
164 extern MainGameCallback *g_gamecallback;