]> git.lizzy.rs Git - minetest.git/blobdiff - src/touchscreengui.cpp
Display Lua memory usage at the time of Out-of-Memory error
[minetest.git] / src / touchscreengui.cpp
index 1a5d42e9dc9f3cd7db8b434ee6be7c213665b862..f5868133f9e3faf23bec8229dd8d9ab4fbab2923 100644 (file)
@@ -25,12 +25,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gettime.h"
 #include "util/numeric.h"
 #include "porting.h"
+#include "guiscalingfilter.h"
 
 #include <iostream>
 #include <algorithm>
 
 #include <ISceneCollisionManager.h>
 
+// Very slow button repeat frequency (in seconds)
+#define SLOW_BUTTON_REPEAT     (1.0f)
+
 using namespace irr::core;
 
 extern Settings *g_settings;
@@ -121,42 +125,52 @@ TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver)
        for (unsigned int i=0; i < after_last_element_id; i++) {
                m_buttons[i].guibutton     =  0;
                m_buttons[i].repeatcounter = -1;
+               m_buttons[i].repeatdelay   = BUTTON_REPEAT_DELAY;
        }
 
        m_screensize = m_device->getVideoDriver()->getScreenSize();
 }
 
-void TouchScreenGUI::loadButtonTexture(button_info* btn, const char* path)
+void TouchScreenGUI::loadButtonTexture(button_info* btn, const char* path, rect<s32> button_rect)
 {
        unsigned int tid;
-       video::ITexture *texture = m_texturesource->getTexture(path,&tid);
+       video::ITexture *texture = guiScalingImageButton(m_device->getVideoDriver(),
+               m_texturesource->getTexture(path, &tid), button_rect.getWidth(), button_rect.getHeight());
        if (texture) {
                btn->guibutton->setUseAlphaChannel(true);
-               btn->guibutton->setImage(texture);
-               btn->guibutton->setPressedImage(texture);
-               btn->guibutton->setScaleImage(true);
+               if (g_settings->getBool("gui_scaling_filter")) {
+                       rect<s32> txr_rect = rect<s32>(0, 0, button_rect.getWidth(), button_rect.getHeight());
+                       btn->guibutton->setImage(texture, txr_rect);
+                       btn->guibutton->setPressedImage(texture, txr_rect);
+                       btn->guibutton->setScaleImage(false);
+               } else {
+                       btn->guibutton->setImage(texture);
+                       btn->guibutton->setPressedImage(texture);
+                       btn->guibutton->setScaleImage(true);
+               }
                btn->guibutton->setDrawBorder(false);
                btn->guibutton->setText(L"");
                }
 }
 
 void TouchScreenGUI::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_info* btn       = &m_buttons[id];
        btn->guibutton         = m_guienv->addButton(button_rect, 0, id, caption.c_str());
        btn->guibutton->grab();
        btn->repeatcounter     = -1;
+       btn->repeatdelay       = repeat_delay;
        btn->keycode           = id2keycode(id);
        btn->immediate_release = immediate_release;
        btn->ids.clear();
 
-       loadButtonTexture(btn,touchgui_button_imagenames[id]);
+       loadButtonTexture(btn,touchgui_button_imagenames[id], button_rect);
 }
 
 static int getMaxControlPadSize(float density) {
-       return 200 * density * g_settings->getFloat("gui_scaling");
+       return 200 * density * g_settings->getFloat("hud_scaling");
 }
 
 void TouchScreenGUI::init(ISimpleTextureSource* tsrc, float density)
@@ -240,25 +254,25 @@ void TouchScreenGUI::init(ISimpleTextureSource* tsrc, float density)
                        rect<s32>(m_screensize.X - (0.75*button_size),
                                        m_screensize.Y - (2.25*button_size),
                                        m_screensize.X, m_screensize.Y - (button_size*1.5)),
-                       L"fly", true);
+                       L"fly", false, SLOW_BUTTON_REPEAT);
 
        /* init noclip button */
        initButton(noclip_id,
                        rect<s32>(m_screensize.X - (0.75*button_size), 2.25*button_size,
                                        m_screensize.X, 3*button_size),
-                       L"clip", true);
+                       L"clip", false, SLOW_BUTTON_REPEAT);
 
        /* init fast button */
        initButton(fast_id,
                        rect<s32>(m_screensize.X - (0.75*button_size), 1.5*button_size,
                                        m_screensize.X, 2.25*button_size),
-                       L"fast", true);
+                       L"fast", false, SLOW_BUTTON_REPEAT);
 
        /* init debug button */
        initButton(debug_id,
                        rect<s32>(m_screensize.X - (0.75*button_size), 0.75*button_size,
                                        m_screensize.X, 1.5*button_size),
-                       L"dbg", true);
+                       L"dbg", false, SLOW_BUTTON_REPEAT);
 
        /* init chat button */
        initButton(chat_id,
@@ -270,13 +284,13 @@ void TouchScreenGUI::init(ISimpleTextureSource* tsrc, float density)
        initButton(camera_id,
                        rect<s32>(m_screensize.X - (1.5*button_size), 0,
                                        m_screensize.X - (0.75*button_size), 0.75*button_size),
-                       L"cam", true);
+                       L"cam", false, SLOW_BUTTON_REPEAT);
 
        /* init rangeselect button */
        initButton(range_id,
                        rect<s32>(m_screensize.X - (2.25*button_size), 0,
                                        m_screensize.X - (1.5*button_size), 0.75*button_size),
-                       L"far", true);
+                       L"far", false, SLOW_BUTTON_REPEAT);
 }
 
 touch_gui_button_id TouchScreenGUI::getButtonID(s32 x, s32 y)
@@ -683,7 +697,11 @@ void TouchScreenGUI::step(float dtime)
                if (btn->ids.size() > 0) {
                        btn->repeatcounter += dtime;
 
-                       if (btn->repeatcounter < 0.2) continue;
+                       /* in case we're moving around digging does not happen */
+                       if (m_move_id != -1)
+                               m_move_has_really_moved = true;
+
+                       if (btn->repeatcounter < btn->repeatdelay) continue;
 
                        btn->repeatcounter              = 0;
                        SEvent translated;