From 705630e7d09a2c6b80631186f597671a8db5e34b Mon Sep 17 00:00:00 2001 From: DS-Minetest Date: Thu, 25 Jul 2019 15:16:49 +0200 Subject: [PATCH] guiScrollBar: move directly to clicked pos if clicked into tray --- src/gui/guiScrollBar.cpp | 59 ++++++++++++++-------------------------- src/gui/guiScrollBar.h | 4 +-- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/src/gui/guiScrollBar.cpp b/src/gui/guiScrollBar.cpp index 40c15d639..ea072aa9e 100644 --- a/src/gui/guiScrollBar.cpp +++ b/src/gui/guiScrollBar.cpp @@ -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 +} diff --git a/src/gui/guiScrollBar.h b/src/gui/guiScrollBar.h index be392bc00..2236ff5b9 100644 --- a/src/gui/guiScrollBar.h +++ b/src/gui/guiScrollBar.h @@ -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 slider_rect; video::SColor current_icon_color; -}; \ No newline at end of file +};