2024-10-28 15:57:39 +01:00
|
|
|
// Luanti
|
|
|
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2011-10-12 13:53:38 +03:00
|
|
|
|
2017-08-17 22:19:39 +02:00
|
|
|
#pragma once
|
2011-10-12 13:53:38 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
All kinds of stuff that needs to be exposed from main.cpp
|
|
|
|
*/
|
|
|
|
#include "modalMenu.h"
|
2017-08-18 19:25:07 +02:00
|
|
|
#include <cassert>
|
2012-12-20 21:19:49 +04:00
|
|
|
#include <list>
|
2011-10-12 13:53:38 +03:00
|
|
|
|
2025-01-04 12:39:34 +01:00
|
|
|
#include "IGUIEnvironment.h"
|
|
|
|
|
|
|
|
namespace irr::gui {
|
|
|
|
class IGUIStaticText;
|
|
|
|
}
|
|
|
|
|
2014-03-04 19:57:39 +01:00
|
|
|
class IGameCallback
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual void exitToOS() = 0;
|
2014-09-21 00:21:11 -03:00
|
|
|
virtual void keyConfig() = 0;
|
2014-03-04 19:57:39 +01:00
|
|
|
virtual void disconnect() = 0;
|
|
|
|
virtual void changePassword() = 0;
|
|
|
|
virtual void changeVolume() = 0;
|
2024-03-24 17:19:23 +00:00
|
|
|
virtual void showOpenURLDialog(const std::string &url) = 0;
|
2014-11-10 12:26:19 +10:00
|
|
|
virtual void signalKeyConfigChange() = 0;
|
2024-11-24 11:33:39 +01:00
|
|
|
virtual void touchscreenLayout() = 0;
|
2014-03-04 19:57:39 +01:00
|
|
|
};
|
|
|
|
|
2023-08-22 19:20:49 +02:00
|
|
|
extern gui::IGUIEnvironment *guienv;
|
2023-08-22 19:21:02 +02:00
|
|
|
extern gui::IGUIStaticText *guiroot;
|
2023-08-22 19:20:49 +02:00
|
|
|
|
2011-10-12 13:53:38 +03:00
|
|
|
// Handler for the modal menus
|
|
|
|
|
|
|
|
class MainMenuManager : public IMenuManager
|
|
|
|
{
|
|
|
|
public:
|
2016-02-27 15:51:09 -05:00
|
|
|
virtual void createdMenu(gui::IGUIElement *menu)
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
2024-04-30 20:14:20 +02:00
|
|
|
for (gui::IGUIElement *e : m_stack) {
|
|
|
|
if (e == menu)
|
|
|
|
return;
|
2011-10-12 13:53:38 +03:00
|
|
|
}
|
|
|
|
|
2014-12-12 19:55:40 +05:00
|
|
|
if(!m_stack.empty())
|
2012-12-20 21:19:49 +04:00
|
|
|
m_stack.back()->setVisible(false);
|
2024-04-30 20:14:20 +02:00
|
|
|
|
2011-10-12 13:53:38 +03:00
|
|
|
m_stack.push_back(menu);
|
2023-10-22 15:31:42 +02:00
|
|
|
guienv->setFocus(m_stack.back());
|
2011-10-12 13:53:38 +03:00
|
|
|
}
|
|
|
|
|
2016-02-27 15:51:09 -05:00
|
|
|
virtual void deletingMenu(gui::IGUIElement *menu)
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
|
|
|
// Remove all entries if there are duplicates
|
2019-03-05 01:13:15 -06:00
|
|
|
m_stack.remove(menu);
|
2011-10-12 13:53:38 +03:00
|
|
|
|
2023-10-22 15:31:42 +02:00
|
|
|
if(!m_stack.empty()) {
|
2012-12-20 21:19:49 +04:00
|
|
|
m_stack.back()->setVisible(true);
|
2023-10-22 15:31:42 +02:00
|
|
|
guienv->setFocus(m_stack.back());
|
|
|
|
}
|
2011-10-12 13:53:38 +03:00
|
|
|
}
|
|
|
|
|
2013-08-19 11:26:51 +02:00
|
|
|
// Returns true to prevent further processing
|
|
|
|
virtual bool preprocessEvent(const SEvent& event)
|
|
|
|
{
|
2016-02-27 15:51:09 -05:00
|
|
|
if (m_stack.empty())
|
2013-08-19 11:26:51 +02:00
|
|
|
return false;
|
2016-02-27 15:51:09 -05:00
|
|
|
GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
|
|
|
|
return mm && mm->preprocessEvent(event);
|
2013-08-19 11:26:51 +02:00
|
|
|
}
|
|
|
|
|
2024-04-11 13:54:09 +02:00
|
|
|
size_t menuCount() const
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
|
|
|
return m_stack.size();
|
|
|
|
}
|
|
|
|
|
2024-11-12 12:52:37 +03:00
|
|
|
void deleteFront()
|
|
|
|
{
|
|
|
|
m_stack.front()->setVisible(false);
|
|
|
|
deletingMenu(m_stack.front());
|
|
|
|
}
|
|
|
|
|
2014-01-06 17:37:23 +02:00
|
|
|
bool pausesGame()
|
|
|
|
{
|
2017-08-18 18:18:25 +02:00
|
|
|
for (gui::IGUIElement *i : m_stack) {
|
|
|
|
GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(i);
|
2016-02-27 15:51:09 -05:00
|
|
|
if (mm && mm->pausesGame())
|
2014-01-06 17:37:23 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2024-11-12 12:52:37 +03:00
|
|
|
private:
|
2016-02-27 15:51:09 -05:00
|
|
|
std::list<gui::IGUIElement*> m_stack;
|
2011-10-12 13:53:38 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
extern MainMenuManager g_menumgr;
|
|
|
|
|
2024-04-11 13:54:09 +02:00
|
|
|
static inline bool isMenuActive()
|
|
|
|
{
|
|
|
|
return g_menumgr.menuCount() != 0;
|
|
|
|
}
|
2011-10-12 13:53:38 +03:00
|
|
|
|
|
|
|
class MainGameCallback : public IGameCallback
|
|
|
|
{
|
|
|
|
public:
|
2017-08-18 18:18:25 +02:00
|
|
|
MainGameCallback() = default;
|
|
|
|
virtual ~MainGameCallback() = default;
|
2011-10-12 13:53:38 +03:00
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void exitToOS() override
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
2014-04-21 14:10:59 +02:00
|
|
|
shutdown_requested = true;
|
2011-10-12 13:53:38 +03:00
|
|
|
}
|
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void disconnect() override
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
|
|
|
disconnect_requested = true;
|
|
|
|
}
|
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void changePassword() override
|
2011-10-12 13:53:38 +03:00
|
|
|
{
|
|
|
|
changepassword_requested = true;
|
|
|
|
}
|
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void changeVolume() override
|
2013-02-23 16:01:35 +01:00
|
|
|
{
|
|
|
|
changevolume_requested = true;
|
|
|
|
}
|
2014-09-21 00:21:11 -03:00
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void keyConfig() override
|
2014-09-21 00:21:11 -03:00
|
|
|
{
|
|
|
|
keyconfig_requested = true;
|
|
|
|
}
|
|
|
|
|
2024-03-24 17:19:23 +00:00
|
|
|
void signalKeyConfigChange() override
|
2014-11-10 12:26:19 +10:00
|
|
|
{
|
|
|
|
keyconfig_changed = true;
|
|
|
|
}
|
|
|
|
|
2024-11-24 11:33:39 +01:00
|
|
|
void touchscreenLayout() override
|
|
|
|
{
|
|
|
|
touchscreenlayout_requested = true;
|
|
|
|
}
|
|
|
|
|
2024-04-11 13:54:09 +02:00
|
|
|
void showOpenURLDialog(const std::string &url) override
|
|
|
|
{
|
2024-03-24 17:19:23 +00:00
|
|
|
show_open_url_dialog = url;
|
|
|
|
}
|
2017-05-13 11:05:16 +02:00
|
|
|
|
2017-06-17 19:11:28 +02:00
|
|
|
bool disconnect_requested = false;
|
|
|
|
bool changepassword_requested = false;
|
|
|
|
bool changevolume_requested = false;
|
|
|
|
bool keyconfig_requested = false;
|
2024-11-24 11:33:39 +01:00
|
|
|
bool touchscreenlayout_requested = false;
|
2017-06-17 19:11:28 +02:00
|
|
|
bool shutdown_requested = false;
|
|
|
|
bool keyconfig_changed = false;
|
2024-03-24 17:19:23 +00:00
|
|
|
std::string show_open_url_dialog = "";
|
2011-10-12 13:53:38 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
extern MainGameCallback *g_gamecallback;
|