diff options
Diffstat (limited to 'Userland/Libraries')
-rw-r--r-- | Userland/Libraries/LibGUI/AbstractSlider.h | 3 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/Slider.cpp | 20 |
2 files changed, 21 insertions, 2 deletions
diff --git a/Userland/Libraries/LibGUI/AbstractSlider.h b/Userland/Libraries/LibGUI/AbstractSlider.h index 93f2d86cf8..5ce5f79497 100644 --- a/Userland/Libraries/LibGUI/AbstractSlider.h +++ b/Userland/Libraries/LibGUI/AbstractSlider.h @@ -24,6 +24,7 @@ public: int max() const { return m_max; } int step() const { return m_step; } int page_step() const { return m_page_step; } + bool jump_to_cursor() const { return m_jump_to_cursor; } void set_range(int min, int max); void set_value(int); @@ -32,6 +33,7 @@ public: void set_max(int max) { set_range(min(), max); } void set_step(int step) { m_step = step; } void set_page_step(int page_step); + void set_jump_to_cursor(bool b) { m_jump_to_cursor = b; } Function<void(int)> on_change; @@ -46,6 +48,7 @@ private: int m_max { 0 }; int m_step { 1 }; int m_page_step { 10 }; + bool m_jump_to_cursor { false }; Orientation m_orientation { Orientation::Horizontal }; }; diff --git a/Userland/Libraries/LibGUI/Slider.cpp b/Userland/Libraries/LibGUI/Slider.cpp index 71f1821456..5cac087bf7 100644 --- a/Userland/Libraries/LibGUI/Slider.cpp +++ b/Userland/Libraries/LibGUI/Slider.cpp @@ -87,10 +87,26 @@ void Slider::mousedown_event(MouseEvent& event) m_drag_origin = event.position(); m_drag_origin_value = value(); return; + } + + const auto mouse_offset = event.position().primary_offset_for_orientation(orientation()); + + if (jump_to_cursor()) { + float normalized_mouse_offset = 0.0f; + if (orientation() == Orientation::Vertical) { + normalized_mouse_offset = static_cast<float>(mouse_offset) / static_cast<float>(height()); + } else { + normalized_mouse_offset = static_cast<float>(mouse_offset) / static_cast<float>(width()); + } + + int new_value = static_cast<int>(min() + ((max() - min()) * normalized_mouse_offset)); + set_value(new_value); } else { - if (event.position().primary_offset_for_orientation(orientation()) > knob_rect().last_edge_for_orientation(orientation())) + auto knob_first_edge = knob_rect().first_edge_for_orientation(orientation()); + auto knob_last_edge = knob_rect().last_edge_for_orientation(orientation()); + if (mouse_offset > knob_last_edge) set_value(value() + page_step()); - else if (event.position().primary_offset_for_orientation(orientation()) < knob_rect().first_edge_for_orientation(orientation())) + else if (mouse_offset < knob_first_edge) set_value(value() - page_step()); } } |