summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibGUI/AbstractSlider.h3
-rw-r--r--Userland/Libraries/LibGUI/Slider.cpp20
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());
}
}