aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.cpp3
-rw-r--r--src/guiChatConsole.cpp13
-rw-r--r--src/guiChatConsole.h8
-rw-r--r--src/mainmenumanager.h21
-rw-r--r--src/modalMenu.h4
5 files changed, 26 insertions, 23 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 3d5f86e21..6fba70df6 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -2175,7 +2175,7 @@ bool Game::initGui()
// Chat backend and console
gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(),
- -1, chat_backend, client);
+ -1, chat_backend, client, &g_menumgr);
if (!gui_chat_console) {
*error_message = "Could not allocate memory for chat console";
errorstream << *error_message << std::endl;
@@ -2809,7 +2809,6 @@ void Game::openConsole(float height, const wchar_t *line)
gui_chat_console->setCloseOnEnter(true);
gui_chat_console->replaceAndAddToHistory(line);
}
- guienv->setFocus(gui_chat_console);
}
}
diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp
index 4c0039e5e..4a084a8e5 100644
--- a/src/guiChatConsole.cpp
+++ b/src/guiChatConsole.cpp
@@ -46,12 +46,14 @@ GUIChatConsole::GUIChatConsole(
gui::IGUIElement* parent,
s32 id,
ChatBackend* backend,
- Client* client
+ Client* client,
+ IMenuManager* menumgr
):
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
core::rect<s32>(0,0,100,100)),
m_chat_backend(backend),
m_client(client),
+ m_menumgr(menumgr),
m_screensize(v2u32(0,0)),
m_animate_time_old(0),
m_open(false),
@@ -120,6 +122,8 @@ void GUIChatConsole::openConsole(f32 height)
m_desired_height_fraction = height;
m_desired_height = height * m_screensize.Y;
reformatConsole();
+ Environment->setFocus(this);
+ m_menumgr->createdMenu(this);
}
bool GUIChatConsole::isOpen() const
@@ -135,11 +139,13 @@ bool GUIChatConsole::isOpenInhibited() const
void GUIChatConsole::closeConsole()
{
m_open = false;
+ Environment->removeFocus(this);
+ m_menumgr->deletingMenu(this);
}
void GUIChatConsole::closeConsoleAtOnce()
{
- m_open = false;
+ closeConsole();
m_height = 0;
recalculateConsolePosition();
}
@@ -399,7 +405,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
if(KeyPress(event.KeyInput) == getKeySetting("keymap_console"))
{
closeConsole();
- Environment->removeFocus(this);
// inhibit open so the_game doesn't reopen immediately
m_open_inhibited = 50;
@@ -409,7 +414,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
else if(event.KeyInput.Key == KEY_ESCAPE)
{
closeConsoleAtOnce();
- Environment->removeFocus(this);
m_close_on_enter = false;
// inhibit open so the_game doesn't reopen immediately
m_open_inhibited = 1; // so the ESCAPE button doesn't open the "pause menu"
@@ -432,7 +436,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
m_client->typeChatMessage(text);
if (m_close_on_enter) {
closeConsoleAtOnce();
- Environment->removeFocus(this);
m_close_on_enter = false;
}
return true;
diff --git a/src/guiChatConsole.h b/src/guiChatConsole.h
index 7b9fc6732..fe595f284 100644
--- a/src/guiChatConsole.h
+++ b/src/guiChatConsole.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define GUICHATCONSOLE_HEADER
#include "irrlichttypes_extrabloated.h"
+#include "modalMenu.h"
#include "chat.h"
#include "config.h"
@@ -33,7 +34,8 @@ public:
gui::IGUIElement* parent,
s32 id,
ChatBackend* backend,
- Client* client);
+ Client* client,
+ IMenuManager* menumgr);
virtual ~GUIChatConsole();
// Open the console (height = desired fraction of screen size)
@@ -86,11 +88,9 @@ private:
void drawPrompt();
private:
- // pointer to the chat backend
ChatBackend* m_chat_backend;
-
- // pointer to the client
Client* m_client;
+ IMenuManager* m_menumgr;
// current screen size
v2u32 m_screensize;
diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h
index 6f8aa9137..17133b164 100644
--- a/src/mainmenumanager.h
+++ b/src/mainmenumanager.h
@@ -47,9 +47,9 @@ extern gui::IGUIStaticText *guiroot;
class MainMenuManager : public IMenuManager
{
public:
- virtual void createdMenu(GUIModalMenu *menu)
+ virtual void createdMenu(gui::IGUIElement *menu)
{
- for(std::list<GUIModalMenu*>::iterator
+ for(std::list<gui::IGUIElement*>::iterator
i = m_stack.begin();
i != m_stack.end(); ++i)
{
@@ -61,13 +61,13 @@ public:
m_stack.push_back(menu);
}
- virtual void deletingMenu(GUIModalMenu *menu)
+ virtual void deletingMenu(gui::IGUIElement *menu)
{
// Remove all entries if there are duplicates
bool removed_entry;
do{
removed_entry = false;
- for(std::list<GUIModalMenu*>::iterator
+ for(std::list<gui::IGUIElement*>::iterator
i = m_stack.begin();
i != m_stack.end(); ++i)
{
@@ -91,10 +91,10 @@ public:
// Returns true to prevent further processing
virtual bool preprocessEvent(const SEvent& event)
{
- if(!m_stack.empty())
- return m_stack.back()->preprocessEvent(event);
- else
+ if (m_stack.empty())
return false;
+ GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
+ return mm && mm->preprocessEvent(event);
}
u32 menuCount()
@@ -104,16 +104,17 @@ public:
bool pausesGame()
{
- for(std::list<GUIModalMenu*>::iterator
+ for(std::list<gui::IGUIElement*>::iterator
i = m_stack.begin(); i != m_stack.end(); ++i)
{
- if((*i)->pausesGame())
+ GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(*i);
+ if (mm && mm->pausesGame())
return true;
}
return false;
}
- std::list<GUIModalMenu*> m_stack;
+ std::list<gui::IGUIElement*> m_stack;
};
extern MainMenuManager g_menumgr;
diff --git a/src/modalMenu.h b/src/modalMenu.h
index d5e975a87..43bb8e1b8 100644
--- a/src/modalMenu.h
+++ b/src/modalMenu.h
@@ -31,8 +31,8 @@ class IMenuManager
{
public:
// A GUIModalMenu calls these when this class is passed as a parameter
- virtual void createdMenu(GUIModalMenu *menu) = 0;
- virtual void deletingMenu(GUIModalMenu *menu) = 0;
+ virtual void createdMenu(gui::IGUIElement *menu) = 0;
+ virtual void deletingMenu(gui::IGUIElement *menu) = 0;
};
/*