#pragma once
#include "irrlichttypes_extrabloated.h"
-#ifdef HAVE_TOUCHSCREENGUI
-#include "touchscreengui.h"
-#endif
+#include "util/string.h"
class GUIModalMenu;
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;