]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/gui/modalMenu.h
Move touchscreen input handling to base GUIModalMenu class
[dragonfireclient.git] / src / gui / modalMenu.h
index f41591c3f83df155ecb21f582f282100bea74b25..8d32ad1590228bd148c090af12ca8c652c5c1488 100644 (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 @@ class IMenuManager
        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;
-
-               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();
-       }
+               IMenuManager *menumgr);
+       virtual ~GUIModalMenu();
 
-       /*
-               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