]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/gui/modalMenu.h
Fix GCC class-memaccess warnings (#10239)
[dragonfireclient.git] / src / gui / modalMenu.h
index f41591c3f83df155ecb21f582f282100bea74b25..1cb687f82782255aac539dc462e76cd418a556ca 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,103 +32,71 @@ 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();
-       }
-
-       /*
-               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
-       }
+               IMenuManager *menumgr, bool remap_dbl_click = true);
+       virtual ~GUIModalMenu();
 
-       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 OnEvent(const SEvent& event) { return false; };
-       virtual bool pausesGame(){ return false; } // Used for pause menu
+       virtual bool preprocessEvent(const SEvent &event);
+       virtual bool OnEvent(const SEvent &event) { return false; };
+       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;
+
+       /**
+        * check if event is part of a double click
+        * @param event event to evaluate
+        * @return true/false if a doubleclick was detected
+        */
+       bool DoubleClickDetection(const SEvent &event);
+
+       v2s32 m_pointer;
+       v2s32 m_old_pointer;  // Mouse position after previous mouse event
        v2u32 m_screensize_old;
+       float m_gui_scale;
+#ifdef __ANDROID__
+       v2s32 m_down_pos;
+       std::string m_jni_field_name;
+#endif
+#ifdef HAVE_TOUCHSCREENGUI
+       bool m_touchscreen_visible = true;
+#endif
+
 private:
+       struct clickpos
+       {
+               v2s32 pos;
+               s64 time;
+       };
+       clickpos m_doubleclickdetect[2];
+
        IMenuManager *m_menumgr;
+       /* If true, remap a double-click (or double-tap) action to ESC. This is so
+        * that, for example, Android users can double-tap to close a formspec.
+       *
+        * This value can (currently) only be set by the class constructor
+        * and the default value for the setting is true.
+        */
+       bool m_remap_dbl_click;
        // This might be necessary to expose to the implementation if it
        // wants to launch other menus
        bool m_allow_focus_removal = false;