]> git.lizzy.rs Git - minetest.git/blobdiff - src/touchscreengui.h
Do not shade inventory items with textures (#5869)
[minetest.git] / src / touchscreengui.h
index a00df5c47e1971d3602fe7c1c0b7e18bef28c883..f4f1766c91042e1db53788d0b86535ebc7ff3b10 100644 (file)
@@ -19,15 +19,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef TOUCHSCREENGUI_HEADER
 #define TOUCHSCREENGUI_HEADER
 
-#include <IGUIEnvironment.h>
-#include <IGUIButton.h>
 #include <IEventReceiver.h>
+#include <IGUIButton.h>
+#include <IGUIEnvironment.h>
 
-#include <vector>
 #include <map>
+#include <vector>
 
-#include "game.h"
 #include "client/tile.h"
+#include "game.h"
 
 using namespace irr;
 using namespace irr::core;
@@ -38,37 +38,124 @@ typedef enum {
        backward_id,
        left_id,
        right_id,
-       inventory_id,
-       drop_id,
        jump_id,
        crunch_id,
+       after_last_element_id,
+       settings_starter_id,
+       rare_controls_starter_id,
        fly_id,
        noclip_id,
        fast_id,
        debug_id,
-       chat_id,
        camera_id,
        range_id,
-       after_last_element_id
+       chat_id,
+       inventory_id,
+       drop_id
 } touch_gui_button_id;
 
+typedef enum {
+       AHBB_Dir_Top_Bottom,
+       AHBB_Dir_Bottom_Top,
+       AHBB_Dir_Left_Right,
+       AHBB_Dir_Right_Left
+} 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 6.5
+#define RARE_CONTROLS_BAR_Y_OFFSET 4
+
+extern const char **touchgui_button_imagenames;
+
+struct button_info
+{
+       float repeatcounter;
+       float repeatdelay;
+       irr::EKEY_CODE keycode;
+       std::vector<int> ids;
+       IGUIButton *guibutton = NULL;
+       bool immediate_release;
+};
+
+class AutoHideButtonBar
+{
+public:
+       AutoHideButtonBar(IrrlichtDevice *device, IEventReceiver *receiver);
 
-extern const char** touchgui_button_imagenames;
+       void init(ISimpleTextureSource *tsrc, const char *starter_img, int button_id,
+                       v2s32 UpperLeft, v2s32 LowerRight, autohide_button_bar_dir dir,
+                       float timeout);
+
+       ~AutoHideButtonBar();
+
+       /* 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);
+
+       /* handle released hud buttons */
+       bool isReleaseButton(int eventID);
+
+       /* step handler */
+       void step(float dtime);
+
+       /* deactivate button bar */
+       void deactivate();
+
+       /* hide the whole buttonbar */
+       void hide();
+
+       /* unhide the buttonbar */
+       void show();
+
+private:
+       ISimpleTextureSource *m_texturesource;
+       irr::video::IVideoDriver *m_driver;
+       IGUIEnvironment *m_guienv;
+       IEventReceiver *m_receiver;
+       v2u32 m_screensize;
+       button_info m_starter;
+       std::vector<button_info *> m_buttons;
+
+       v2s32 m_upper_left;
+       v2s32 m_lower_right;
+
+       /* show settings bar */
+       bool m_active;
+
+       bool m_visible;
+
+       /* settings bar timeout */
+       float m_timeout;
+       float m_timeout_value;
+       bool m_initialized;
+       autohide_button_bar_dir m_dir;
+};
 
 class TouchScreenGUI
 {
 public:
-       TouchScreenGUI(IrrlichtDevice *device, IEventReceiverreceiver);
+       TouchScreenGUI(IrrlichtDevice *device, IEventReceiver *receiver);
        ~TouchScreenGUI();
 
        void translateEvent(const SEvent &event);
 
-       void init(ISimpleTextureSource* tsrc,float density);
+       void init(ISimpleTextureSource *tsrc);
+
+       double getYawChange()
+       {
+               double res = m_camera_yaw_change;
+               m_camera_yaw_change = 0;
+               return res;
+       }
 
-       double getYaw() { return m_camera_yaw; }
        double getPitch() { return m_camera_pitch; }
+
        line3d<f32> getShootline() { return m_shootline; }
 
        void step(float dtime);
@@ -76,40 +163,32 @@ class TouchScreenGUI
        void registerHudItem(int index, const rect<s32> &rect);
        void Toggle(bool visible);
 
-       void Hide();
-       void Show();
+       void hide();
+       void show();
 
 private:
-       IrrlichtDevice*         m_device;
-       IGUIEnvironment*        m_guienv;
-       IEventReceiver*         m_receiver;
-       ISimpleTextureSource*   m_texturesource;
-       v2u32                   m_screensize;
-       std::map<int,rect<s32> > m_hud_rects;
-       std::map<int,irr::EKEY_CODE> m_hud_ids;
-       bool                    m_visible; // is the gui visible
+       IrrlichtDevice *m_device;
+       IGUIEnvironment *m_guienv;
+       IEventReceiver *m_receiver;
+       ISimpleTextureSource *m_texturesource;
+       v2u32 m_screensize;
+       std::map<int, rect<s32> > m_hud_rects;
+       std::map<int, irr::EKEY_CODE> m_hud_ids;
+       bool m_visible; // is the gui visible
 
        /* value in degree */
-       double                  m_camera_yaw;
-       double                  m_camera_pitch;
-
-       line3d<f32>             m_shootline;
+       double m_camera_yaw_change;
+       double m_camera_pitch;
 
-       rect<s32>               m_control_pad_rect;
+       line3d<f32> m_shootline;
 
-       int                     m_move_id;
-       bool                    m_move_has_really_moved;
-       s32                     m_move_downtime;
-       bool                    m_move_sent_as_mouse_event;
-       v2s32                   m_move_downlocation;
+       rect<s32> m_control_pad_rect;
 
-       struct button_info {
-               float            repeatcounter;
-               irr::EKEY_CODE   keycode;
-               std::vector<int> ids;
-               IGUIButton*      guibutton;
-               bool             immediate_release;
-       };
+       int m_move_id;
+       bool m_move_has_really_moved;
+       s64 m_move_downtime;
+       bool m_move_sent_as_mouse_event;
+       v2s32 m_move_downlocation;
 
        button_info m_buttons[after_last_element_id];
 
@@ -124,12 +203,14 @@ class TouchScreenGUI
 
        /* initialize a button */
        void initButton(touch_gui_button_id id, rect<s32> button_rect,
-                       std::wstring caption, bool immediate_release );
+                       std::wstring caption, bool immediate_release,
+                       float repeat_delay = BUTTON_REPEAT_DELAY);
 
        /* load texture */
-       void loadButtonTexture(button_info* btn, const char* path);
+       void loadButtonTexture(button_info *btn, const char *path, rect<s32> button_rect);
 
-       struct id_status{
+       struct id_status
+       {
                int id;
                int X;
                int Y;
@@ -139,7 +220,7 @@ class TouchScreenGUI
        std::vector<id_status> m_known_ids;
 
        /* handle a button event */
-       void ButtonEvent(touch_gui_button_id bID, int eventID, bool action);
+       void handleButtonEvent(touch_gui_button_id bID, int eventID, bool action);
 
        /* handle pressed hud buttons */
        bool isHUDButton(const SEvent &event);
@@ -150,8 +231,15 @@ class TouchScreenGUI
        /* handle double taps */
        bool doubleTapDetection();
 
+       /* handle release event */
+       void handleReleaseEvent(int evt_id);
+
+       /* get size of regular gui control button */
+       int getGuiButtonSize();
+
        /* doubleclick detection variables */
-       struct key_event {
+       struct key_event
+       {
                unsigned int down_time;
                s32 x;
                s32 y;
@@ -162,6 +250,12 @@ class TouchScreenGUI
 
        /* array for doubletap detection */
        key_event m_key_events[2];
+
+       /* settings bar */
+       AutoHideButtonBar m_settingsbar;
+
+       /* rare controls bar */
+       AutoHideButtonBar m_rarecontrolsbar;
 };
 extern TouchScreenGUI *g_touchscreengui;
 #endif