1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Move touchscreen input handling to base GUIModalMenu class

This commit is contained in:
stujones11 2018-06-24 20:50:57 +01:00 committed by sfan5
parent 0d54399be2
commit 323c860045
14 changed files with 425 additions and 272 deletions

View file

@ -20,9 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "irrlichttypes_extrabloated.h"
#ifdef HAVE_TOUCHSCREENGUI
#include "touchscreengui.h"
#endif
#include "util/string.h"
class GUIModalMenu;
@ -34,101 +32,46 @@ public:
virtual void deletingMenu(gui::IGUIElement *menu) = 0;
};
/*
Remember to drop() the menu after creating, so that it can
remove itself when it wants to.
*/
// Remember to drop() the menu after creating, so that it can
// remove itself when it wants to.
class GUIModalMenu : public gui::IGUIElement
{
public:
GUIModalMenu(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id,
IMenuManager *menumgr):
IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
core::rect<s32>(0,0,100,100))
{
m_menumgr = menumgr;
IMenuManager *menumgr);
virtual ~GUIModalMenu();
setVisible(true);
Environment->setFocus(this);
m_menumgr->createdMenu(this);
}
virtual ~GUIModalMenu()
{
m_menumgr->deletingMenu(this);
}
void allowFocusRemoval(bool allow)
{
m_allow_focus_removal = allow;
}
bool canTakeFocus(gui::IGUIElement *e)
{
return (e && (e == this || isMyChild(e))) || m_allow_focus_removal;
}
void draw()
{
if(!IsVisible)
return;
video::IVideoDriver* driver = Environment->getVideoDriver();
v2u32 screensize = driver->getScreenSize();
if(screensize != m_screensize_old /*|| m_force_regenerate_gui*/)
{
m_screensize_old = screensize;
regenerateGui(screensize);
//m_force_regenerate_gui = false;
}
drawMenu();
}
/*
This should be called when the menu wants to quit.
WARNING: THIS DEALLOCATES THE MENU FROM MEMORY. Return
immediately if you call this from the menu itself.
(More precisely, this decrements the reference count.)
*/
void quitMenu()
{
allowFocusRemoval(true);
// This removes Environment's grab on us
Environment->removeFocus(this);
m_menumgr->deletingMenu(this);
this->remove();
#ifdef HAVE_TOUCHSCREENGUI
if (g_touchscreengui)
g_touchscreengui->show();
#endif
}
void removeChildren()
{
const core::list<gui::IGUIElement*> &children = getChildren();
core::list<gui::IGUIElement*> children_copy;
for (gui::IGUIElement *i : children) {
children_copy.push_back(i);
}
for (gui::IGUIElement *i : children_copy) {
i->remove();
}
}
void allowFocusRemoval(bool allow);
bool canTakeFocus(gui::IGUIElement *e);
void draw();
void quitMenu();
void removeChildren();
virtual void regenerateGui(v2u32 screensize) = 0;
virtual void drawMenu() = 0;
virtual bool preprocessEvent(const SEvent& event) { return false; };
virtual bool preprocessEvent(const SEvent& event);
virtual bool OnEvent(const SEvent& event) { return false; };
virtual bool pausesGame(){ return false; } // Used for pause menu
virtual bool pausesGame() { return false; } // Used for pause menu
#ifdef __ANDROID__
virtual bool getAndroidUIInput() { return false; }
bool hasAndroidUIInput();
#endif
protected:
//bool m_force_regenerate_gui;
virtual std::wstring getLabelByID(s32 id) = 0;
virtual std::string getNameByID(s32 id) = 0;
v2s32 m_pointer;
v2s32 m_old_pointer; // Mouse position after previous mouse event
v2u32 m_screensize_old;
#ifdef __ANDROID__
v2s32 m_down_pos;
std::string m_jni_field_name;
#endif
#ifdef HAVE_TOUCHSCREENGUI
bool m_touchscreen_visible = true;
#endif
private:
IMenuManager *m_menumgr;
// This might be necessary to expose to the implementation if it