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 inhibitKeyEvent(EKEY_CODE key) override
75 {
76 m_inhibited_key = key;
77 }
78
79 // Returns true to prevent further processing
80 virtual bool preprocessEvent(const SEvent& event)
81 {
82 if (m_stack.empty())
83 return false;
84
85 if (event.EventType == EET_KEY_INPUT_EVENT) {
86 bool ret = event.KeyInput.Key == m_inhibited_key && m_inhibited_key != KEY_UNKNOWN;
87 m_inhibited_key = KEY_UNKNOWN;
88 if (ret)
89 return true;
90 }
91
92 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
93 return mm && mm->preprocessEvent(event);
94 }
95
96 size_t menuCount() const
97 {
98 return m_stack.size();
99 }
100
102 {
103 if (m_stack.empty())
104 return nullptr;
105 return dynamic_cast<GUIModalMenu *>(m_stack.back());
106 }
107
109 {
110 assert(!m_stack.empty());
111 gui::IGUIElement *e = m_stack.front();
112 e->setVisible(false);
113 deletingMenu(e);
114 e->remove();
115 }
116
118 {
119 for (gui::IGUIElement *i : m_stack) {
120 GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(i);
121 if (mm && mm->pausesGame())
122 return true;
123 }
124 return false;
125 }
126
127private:
128 EKEY_CODE m_inhibited_key = KEY_UNKNOWN;
129 std::list<gui::IGUIElement*> m_stack;
130};
131
133
134static inline bool isMenuActive()
135{
136 return g_menumgr.menuCount() != 0;
137}
138
140{
141public:
142 MainGameCallback() = default;
143 virtual ~MainGameCallback() = default;
144
145 void exitToOS() override
146 {
147 shutdown_requested = true;
148 }
149
150 void openSettings() override
151 {
152 settings_requested = true;
153 }
154
155 void disconnect() override
156 {
158 }
159
160 void changePassword() override
161 {
163 }
164
165 void changeVolume() override
166 {
168 }
169
170 void touchscreenLayout() override
171 {
173 }
174
175 void showOpenURLDialog(const std::string &url) override
176 {
178 }
179
181 bool settings_requested = false;
185 bool shutdown_requested = false;
186 std::string show_open_url_dialog = "";
187};
188
Definition modalMenu.h:38
virtual bool preprocessEvent(const SEvent &event)
Definition modalMenu.cpp:233
virtual bool pausesGame()
Definition modalMenu.h:53
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:140
bool touchscreenlayout_requested
Definition mainmenumanager.h:184
MainGameCallback()=default
void openSettings() override
Definition mainmenumanager.h:150
bool shutdown_requested
Definition mainmenumanager.h:185
void touchscreenLayout() override
Definition mainmenumanager.h:170
std::string show_open_url_dialog
Definition mainmenumanager.h:186
bool disconnect_requested
Definition mainmenumanager.h:180
void changeVolume() override
Definition mainmenumanager.h:165
void showOpenURLDialog(const std::string &url) override
Definition mainmenumanager.h:175
virtual ~MainGameCallback()=default
void exitToOS() override
Definition mainmenumanager.h:145
bool changevolume_requested
Definition mainmenumanager.h:183
void disconnect() override
Definition mainmenumanager.h:155
bool settings_requested
Definition mainmenumanager.h:181
bool changepassword_requested
Definition mainmenumanager.h:182
void changePassword() override
Definition mainmenumanager.h:160
Definition mainmenumanager.h:39
EKEY_CODE m_inhibited_key
Definition mainmenumanager.h:128
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
virtual bool preprocessEvent(const SEvent &event)
Definition mainmenumanager.h:80
void deleteFront()
Definition mainmenumanager.h:108
bool pausesGame()
Definition mainmenumanager.h:117
GUIModalMenu * tryGetTopMenu() const
Definition mainmenumanager.h:101
size_t menuCount() const
Definition mainmenumanager.h:96
void createdMenu(gui::IGUIElement *menu) override
Definition mainmenumanager.h:41
void inhibitKeyEvent(EKEY_CODE key) override
Definition mainmenumanager.h:74
std::list< gui::IGUIElement * > m_stack
Definition mainmenumanager.h:129
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:134
Definition fontengine.h:15
TouchControls * g_touchcontrols
Definition touchcontrols.cpp:30