Luanti 5.18.0-dev
Loading...
Searching...
No Matches
mainmenumanager.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7/*
8 All kinds of stuff that needs to be exposed from main.cpp
9*/
10#include "modalMenu.h"
11#include "touchcontrols.h" // g_touchcontrols
12#include <cassert>
13#include <list>
14
15#include <IGUIEnvironment.h>
16
17namespace gui {
18 class IGUIStaticText;
19}
20
22{
23public:
24 virtual void exitToOS() = 0;
25 virtual void openSettings() = 0;
26 virtual void disconnect() = 0;
27 virtual void changePassword() = 0;
28 virtual void changeVolume() = 0;
29 virtual void showOpenURLDialog(const std::string &url) = 0;
30 virtual void touchscreenLayout() = 0;
31};
32
33extern gui::IGUIEnvironment *guienv;
34extern gui::IGUIStaticText *guiroot;
35
36// Handler for the modal menus
37
39{
40public:
41 void createdMenu(gui::IGUIElement *menu) override
42 {
43 for (gui::IGUIElement *e : m_stack) {
44 if (e == menu)
45 return;
46 }
47
48 if(!m_stack.empty())
49 m_stack.back()->setVisible(false);
50
51 m_stack.push_back(menu);
52 guienv->setFocus(m_stack.back());
53 }
54
58 void deletingMenu(gui::IGUIElement *menu) override
59 {
60 // Remove all entries if there are duplicates
61 m_stack.remove(menu);
62
63 // Reference count reduction (-1) due to focus loss
64 if (!m_stack.empty()) {
65 m_stack.back()->setVisible(true);
66 guienv->setFocus(m_stack.back());
67 } else {
68 guienv->removeFocus(menu);
70 g_touchcontrols->show();
71 }
72 }
73
74 void inhibitKeyPress(EKEY_CODE key) override
75 {
76 m_inhibited_key = key;
77 }
78
79 // Returns true to prevent further processing
80 bool runPreprocessEvent(const SEvent &event)
81 {
82 if (event.EventType == EET_KEY_INPUT_EVENT) {
83 bool ret = event.KeyInput.Key == m_inhibited_key && m_inhibited_key != KEY_UNKNOWN;
84 if (!event.KeyInput.PressedDown) {
85 // The OS may repeat key down events, hence only reset upon release.
86 m_inhibited_key = KEY_UNKNOWN;
87 }
88 if (ret)
89 return true;
90 }
91
92 if (m_stack.empty())
93 return false;
94
95 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
96 return mm && mm->preprocessEvent(event);
97 }
98
99 size_t menuCount() const
100 {
101 return m_stack.size();
102 }
103
105 {
106 if (m_stack.empty())
107 return nullptr;
108 return dynamic_cast<GUIModalMenu *>(m_stack.back());
109 }
110
112 {
113 assert(!m_stack.empty());
114 gui::IGUIElement *e = m_stack.front();
115 e->setVisible(false);
116 deletingMenu(e);
117 e->remove();
118 }
119
121 {
122 for (gui::IGUIElement *i : m_stack) {
123 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(i);
124 if (mm && mm->pausesGame())
125 return true;
126 }
127 return false;
128 }
129
130private:
131 EKEY_CODE m_inhibited_key = KEY_UNKNOWN;
132 std::list<gui::IGUIElement*> m_stack;
133};
134
136
137static inline bool isMenuActive()
138{
139 return g_menumgr.menuCount() != 0;
140}
141
143{
144public:
145 MainGameCallback() = default;
146 virtual ~MainGameCallback() = default;
147
148 void exitToOS() override
149 {
150 shutdown_requested = true;
151 }
152
153 void openSettings() override
154 {
155 settings_requested = true;
156 }
157
158 void disconnect() override
159 {
161 }
162
163 void changePassword() override
164 {
166 }
167
168 void changeVolume() override
169 {
171 }
172
173 void touchscreenLayout() override
174 {
176 }
177
178 void showOpenURLDialog(const std::string &url) override
179 {
181 }
182
184 bool settings_requested = false;
188 bool shutdown_requested = false;
189 std::string show_open_url_dialog = "";
190};
191
Definition modalMenu.h:39
virtual bool preprocessEvent(const SEvent &event)
Definition modalMenu.cpp:233
virtual bool pausesGame()
Definition modalMenu.h:54
Definition mainmenumanager.h:22
virtual void exitToOS()=0
virtual void touchscreenLayout()=0
virtual void changePassword()=0
virtual void showOpenURLDialog(const std::string &url)=0
virtual void disconnect()=0
virtual void changeVolume()=0
virtual void openSettings()=0
Definition modalMenu.h:26
Definition mainmenumanager.h:143
bool touchscreenlayout_requested
Definition mainmenumanager.h:187
MainGameCallback()=default
void openSettings() override
Definition mainmenumanager.h:153
bool shutdown_requested
Definition mainmenumanager.h:188
void touchscreenLayout() override
Definition mainmenumanager.h:173
std::string show_open_url_dialog
Definition mainmenumanager.h:189
bool disconnect_requested
Definition mainmenumanager.h:183
void changeVolume() override
Definition mainmenumanager.h:168
void showOpenURLDialog(const std::string &url) override
Definition mainmenumanager.h:178
virtual ~MainGameCallback()=default
void exitToOS() override
Definition mainmenumanager.h:148
bool changevolume_requested
Definition mainmenumanager.h:186
void disconnect() override
Definition mainmenumanager.h:158
bool settings_requested
Definition mainmenumanager.h:184
bool changepassword_requested
Definition mainmenumanager.h:185
void changePassword() override
Definition mainmenumanager.h:163
Definition mainmenumanager.h:39
EKEY_CODE m_inhibited_key
Definition mainmenumanager.h:131
void deletingMenu(gui::IGUIElement *menu) override
Note that it may be called multiple times on GUIModalMenu (or GUIFormSpecMenu): 1x Explicit close req...
Definition mainmenumanager.h:58
void deleteFront()
Definition mainmenumanager.h:111
bool pausesGame()
Definition mainmenumanager.h:120
GUIModalMenu * tryGetTopMenu() const
Definition mainmenumanager.h:104
size_t menuCount() const
Definition mainmenumanager.h:99
void inhibitKeyPress(EKEY_CODE key) override
Ignores all events of the specified key until (and including) it is released.
Definition mainmenumanager.h:74
void createdMenu(gui::IGUIElement *menu) override
Definition mainmenumanager.h:41
std::list< gui::IGUIElement * > m_stack
Definition mainmenumanager.h:132
bool runPreprocessEvent(const SEvent &event)
Definition mainmenumanager.h:80
gui::IGUIEnvironment * guienv
Definition clientlauncher.cpp:36
MainMenuManager g_menumgr
Definition clientlauncher.cpp:38
MainGameCallback * g_gamecallback
Definition clientlauncher.cpp:41
gui::IGUIStaticText * guiroot
Definition clientlauncher.cpp:37
gui::IGUIEnvironment * guienv
Definition clientlauncher.cpp:36
static bool isMenuActive()
Definition mainmenumanager.h:137
Definition fontengine.h:15
TouchControls * g_touchcontrols
Definition touchcontrols.cpp:30