X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgui%2Ftouchscreengui.h;h=6b36c0d599eaab0ed34eb357acc90bdcbe600a77;hb=e80f695bb96923a718890ccfec37f39e12d8d235;hp=9d4150ea64a5f6e914ab51e3c59fbed88c3ece6d;hpb=22a891a925d68a096420d3383a2e31b58e3eb244;p=minetest.git diff --git a/src/gui/touchscreengui.h b/src/gui/touchscreengui.h index 9d4150ea6..6b36c0d59 100644 --- a/src/gui/touchscreengui.h +++ b/src/gui/touchscreengui.h @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "irrlichttypes.h" #include #include #include @@ -27,19 +28,18 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "client/tile.h" -#include "game.h" +#include "client/game.h" using namespace irr; using namespace irr::core; using namespace irr::gui; -typedef enum { - forward_id = 0, - backward_id, - left_id, - right_id, - jump_id, +typedef enum +{ + jump_id = 0, crunch_id, + zoom_id, + aux1_id, after_last_element_id, settings_starter_id, rare_controls_starter_id, @@ -49,12 +49,31 @@ typedef enum { debug_id, camera_id, range_id, + minimap_id, + toggle_chat_id, chat_id, inventory_id, - drop_id + drop_id, + forward_id, + backward_id, + left_id, + right_id, + joystick_off_id, + joystick_bg_id, + joystick_center_id } touch_gui_button_id; -typedef enum { +typedef enum +{ + j_forward = 0, + j_backward, + j_left, + j_right, + j_aux1 +} touch_gui_joystick_move_id; + +typedef enum +{ AHBB_Dir_Top_Bottom, AHBB_Dir_Bottom_Top, AHBB_Dir_Left_Right, @@ -62,22 +81,28 @@ typedef enum { } autohide_button_bar_dir; #define MIN_DIG_TIME_MS 500 -#define MAX_TOUCH_COUNT 64 #define BUTTON_REPEAT_DELAY 0.2f +#define SETTINGS_BAR_Y_OFFSET 5 +#define RARE_CONTROLS_BAR_Y_OFFSET 5 -#define SETTINGS_BAR_Y_OFFSET 6.5 -#define RARE_CONTROLS_BAR_Y_OFFSET 4 +// Very slow button repeat frequency +#define SLOW_BUTTON_REPEAT 1.0f -extern const char **touchgui_button_imagenames; +extern const char **button_imagenames; +extern const char **joystick_imagenames; struct button_info { float repeatcounter; float repeatdelay; irr::EKEY_CODE keycode; - std::vector ids; + std::vector ids; IGUIButton *guibutton = nullptr; bool immediate_release; + + // 0: false, 1: (true) first texture, 2: (true) second texture + int togglable = 0; + std::vector textures; }; class AutoHideButtonBar @@ -86,31 +111,32 @@ class AutoHideButtonBar AutoHideButtonBar(IrrlichtDevice *device, IEventReceiver *receiver); void init(ISimpleTextureSource *tsrc, const char *starter_img, int button_id, - v2s32 UpperLeft, v2s32 LowerRight, autohide_button_bar_dir dir, - float timeout); + const v2s32 &UpperLeft, const v2s32 &LowerRight, + autohide_button_bar_dir dir, float timeout); ~AutoHideButtonBar(); - /* add button to be shown */ + // add button to be shown void addButton(touch_gui_button_id id, const wchar_t *caption, const char *btn_image); - /* detect settings bar button events */ - bool isButton(const SEvent &event); + // add toggle button to be shown + void addToggleButton(touch_gui_button_id id, const wchar_t *caption, + const char *btn_image_1, const char *btn_image_2); - /* handle released hud buttons */ - bool isReleaseButton(int eventID); + // detect settings bar button events + bool isButton(const SEvent &event); - /* step handler */ + // step handler void step(float dtime); - /* deactivate button bar */ + // deactivate button bar void deactivate(); - /* hide the whole buttonbar */ + // hide the whole buttonbar void hide(); - /* unhide the buttonbar */ + // unhide the buttonbar void show(); private: @@ -124,12 +150,12 @@ class AutoHideButtonBar v2s32 m_upper_left; v2s32 m_lower_right; - /* show settings bar */ + // show settings bar bool m_active = false; bool m_visible = true; - /* settings bar timeout */ + // settings bar timeout float m_timeout = 0.0f; float m_timeout_value = 3.0f; bool m_initialized = false; @@ -155,7 +181,7 @@ class TouchScreenGUI double getPitch() { return m_camera_pitch; } - /*! + /* * Returns a line which describes what the player is pointing at. * The starting point and looking direction are significant, * the line should be scaled to match its length to the actual distance @@ -179,15 +205,22 @@ class TouchScreenGUI IEventReceiver *m_receiver; ISimpleTextureSource *m_texturesource; v2u32 m_screensize; + s32 button_size; + double m_touchscreen_threshold; std::map> m_hud_rects; - std::map m_hud_ids; + std::map m_hud_ids; bool m_visible; // is the gui visible - /* value in degree */ + // value in degree double m_camera_yaw_change = 0.0; double m_camera_pitch = 0.0; - /*! + // forward, backward, left, right + touch_gui_button_id m_joystick_names[5] = { + forward_id, backward_id, left_id, right_id, aux1_id}; + bool m_joystick_status[5] = {false, false, false, false, false}; + + /* * A line starting at the camera and pointing towards the * selected object. * The line ends on the camera's far plane. @@ -195,74 +228,87 @@ class TouchScreenGUI */ line3d m_shootline; - int m_move_id = -1; + bool m_has_move_id = false; + size_t m_move_id; bool m_move_has_really_moved = false; - s64 m_move_downtime = 0; + u64 m_move_downtime = 0; bool m_move_sent_as_mouse_event = false; v2s32 m_move_downlocation = v2s32(-10000, -10000); + bool m_has_joystick_id = false; + size_t m_joystick_id; + bool m_joystick_has_really_moved = false; + bool m_fixed_joystick = false; + bool m_joystick_triggers_aux1 = false; + button_info *m_joystick_btn_off = nullptr; + button_info *m_joystick_btn_bg = nullptr; + button_info *m_joystick_btn_center = nullptr; + button_info m_buttons[after_last_element_id]; - /* gui button detection */ + // gui button detection touch_gui_button_id getButtonID(s32 x, s32 y); - /* gui button by eventID */ - touch_gui_button_id getButtonID(int eventID); + // gui button by eventID + touch_gui_button_id getButtonID(size_t eventID); - /* check if a button has changed */ + // check if a button has changed void handleChangedButton(const SEvent &event); - /* initialize a button */ - void initButton(touch_gui_button_id id, rect button_rect, - std::wstring caption, bool immediate_release, + // initialize a button + void initButton(touch_gui_button_id id, const rect &button_rect, + const std::wstring &caption, bool immediate_release, float repeat_delay = BUTTON_REPEAT_DELAY); + // initialize a joystick button + button_info *initJoystickButton(touch_gui_button_id id, + const rect &button_rect, int texture_id, + bool visible = true); + struct id_status { - int id; + size_t id; int X; int Y; }; - /* vector to store known ids and their initial touch positions*/ + // vector to store known ids and their initial touch positions std::vector m_known_ids; - /* handle a button event */ - void handleButtonEvent(touch_gui_button_id bID, int eventID, bool action); + // handle a button event + void handleButtonEvent(touch_gui_button_id bID, size_t eventID, bool action); - /* handle pressed hud buttons */ + // handle pressed hud buttons bool isHUDButton(const SEvent &event); - /* handle released hud buttons */ - bool isReleaseHUDButton(int eventID); - - /* handle double taps */ + // handle double taps bool doubleTapDetection(); - /* handle release event */ - void handleReleaseEvent(int evt_id); + // handle release event + void handleReleaseEvent(size_t evt_id); - /* get size of regular gui control button */ - int getGuiButtonSize(); + // apply joystick status + void applyJoystickStatus(); - /* doubleclick detection variables */ + // double-click detection variables struct key_event { - unsigned int down_time; + u64 down_time; s32 x; s32 y; }; - /* array for saving last known position of a pointer */ - v2s32 m_pointerpos[MAX_TOUCH_COUNT]; + // array for saving last known position of a pointer + std::map m_pointerpos; - /* array for doubletap detection */ + // array for double tap detection key_event m_key_events[2]; - /* settings bar */ + // settings bar AutoHideButtonBar m_settingsbar; - /* rare controls bar */ + // rare controls bar AutoHideButtonBar m_rarecontrolsbar; }; + extern TouchScreenGUI *g_touchscreengui;