guiScrollBar: move directly to clicked pos if clicked into tray
authorDS-Minetest <vorunbekannt75@web.de>
Thu, 25 Jul 2019 13:16:49 +0000 (15:16 +0200)
committersfan5 <sfan5@live.de>
Sun, 28 Jul 2019 19:43:07 +0000 (21:43 +0200)
src/gui/guiScrollBar.cpp
src/gui/guiScrollBar.h

index 40c15d6391b0d8a021662d02f5df192c9425e259..ea072aa9ec6e4baf3b07367eba5dc322888d2bca 100644 (file)
@@ -21,8 +21,7 @@ guiScrollBar::guiScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3
                is_horizontal(horizontal), is_auto_scaling(auto_scale),
                dragged_by_slider(false), tray_clicked(false), scroll_pos(0),
                draw_center(0), thumb_size(0), min_pos(0), max_pos(100), small_step(10),
-               large_step(50), desired_pos(0), last_change(0), drag_offset(0),
-               page_size(100), border_size(0)
+               large_step(50), last_change(0), drag_offset(0), page_size(100), border_size(0)
 {
        refreshControls();
        setNotClipped(false);
@@ -116,12 +115,25 @@ bool guiScrollBar::OnEvent(const SEvent &event)
                                if (is_inside) {
                                        is_dragging = true;
                                        dragged_by_slider = slider_rect.isPointInside(p);
-                                       core::vector2di corner =
-                                                       slider_rect.UpperLeftCorner;
-                                       drag_offset = is_horizontal ? p.X - corner.X
-                                                                   : p.Y - corner.Y;
+                                       core::vector2di corner = slider_rect.UpperLeftCorner;
+                                       drag_offset = is_horizontal ? p.X - corner.X : p.Y - corner.Y;
                                        tray_clicked = !dragged_by_slider;
-                                       desired_pos = getPosFromMousePos(p);
+                                       if (tray_clicked) {
+                                               const s32 new_pos = getPosFromMousePos(p);
+                                               const s32 old_pos = scroll_pos;
+                                               setPos(new_pos);
+                                               // drag in the middle
+                                               drag_offset = thumb_size / 2;
+                                               // report the scroll event
+                                               if (scroll_pos != old_pos && Parent) {
+                                                       SEvent e;
+                                                       e.EventType = EET_GUI_EVENT;
+                                                       e.GUIEvent.Caller = this;
+                                                       e.GUIEvent.Element = nullptr;
+                                                       e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
+                                                       Parent->OnEvent(e);
+                                               }
+                                       }
                                        Environment->setFocus(this);
                                        return true;
                                }
@@ -158,10 +170,7 @@ bool guiScrollBar::OnEvent(const SEvent &event)
                                const s32 new_pos = getPosFromMousePos(p);
                                const s32 old_pos = scroll_pos;
 
-                               if (dragged_by_slider)
-                                       setPos(new_pos);
-                               else
-                                       desired_pos = new_pos;
+                               setPos(new_pos);
 
                                if (scroll_pos != old_pos && Parent) {
                                        SEvent e;
@@ -184,32 +193,6 @@ bool guiScrollBar::OnEvent(const SEvent &event)
        return IGUIElement::OnEvent(event);
 }
 
-void guiScrollBar::OnPostRender(u32 timeMs)
-{
-       if (is_dragging && !dragged_by_slider && tray_clicked &&
-                       timeMs > last_change + 200) {
-               last_change = timeMs;
-               const s32 old_pos = scroll_pos;
-
-               if (desired_pos >= scroll_pos + large_step)
-                       setPos(scroll_pos + large_step);
-               else if (desired_pos <= scroll_pos - large_step)
-                       setPos(scroll_pos - large_step);
-               else if (desired_pos >= scroll_pos - large_step &&
-                               desired_pos <= scroll_pos + large_step)
-                       setPos(desired_pos);
-
-               if (scroll_pos != old_pos && Parent) {
-                       SEvent e;
-                       e.EventType = EET_GUI_EVENT;
-                       e.GUIEvent.Caller = this;
-                       e.GUIEvent.Element = nullptr;
-                       e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
-                       Parent->OnEvent(e);
-               }
-       }
-}
-
 void guiScrollBar::draw()
 {
        if (!IsVisible)
@@ -439,4 +422,4 @@ void guiScrollBar::refreshControls()
        bool visible = (border_size != 0);
        up_button->setVisible(visible);
        down_button->setVisible(visible);
-}
\ No newline at end of file
+}
index be392bc00a483d60c2d7074274fe21f916101f53..2236ff5b989193891e9ea7c5d3bc023adfbd0611 100644 (file)
@@ -26,7 +26,6 @@ public:
        virtual void draw();
        virtual void updateAbsolutePosition();
        virtual bool OnEvent(const SEvent &event);
-       virtual void OnPostRender(u32 timeMs);
 
        s32 getMax() const { return max_pos; }
        s32 getMin() const { return min_pos; }
@@ -60,7 +59,6 @@ private:
        s32 max_pos;
        s32 small_step;
        s32 large_step;
-       s32 desired_pos;
        u32 last_change;
        s32 drag_offset;
        s32 page_size;
@@ -68,4 +66,4 @@ private:
 
        core::rect<s32> slider_rect;
        video::SColor current_icon_color;
-};
\ No newline at end of file
+};