summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGUI
diff options
context:
space:
mode:
authorAndreas Oppebøen <andreas.oppeboen@gmail.com>2023-03-01 21:18:10 +0100
committerAndreas Kling <kling@serenityos.org>2023-03-24 10:33:22 +0100
commit0e4586dd3ec6ed7847b65d34ead93e64d5cb3bf2 (patch)
treef3049edf43c50b8e1815305f56d0c8d9087a755d /Userland/Libraries/LibGUI
parenta30b341a2ca6cb13d88886dfe7c19a7fabd598b8 (diff)
downloadserenity-0e4586dd3ec6ed7847b65d34ead93e64d5cb3bf2.zip
LibGUI: Fix slightly wrong value slider knob position
When clicking the value slider bar, the knob was not positioned as close to the mouse as expected. When moving the mouse right, the knob would lag a bit behind, and the cursor would eventually be outside the knob. The bug was due to knob_rect() taking knob_thickness into account to prevent the knob from protruding outside the bar. The value_at(pos) calculated the relative position based on the entire width of the bar. This discrepancy is fixed by taking knob_thickness into account in value_at(position).
Diffstat (limited to 'Userland/Libraries/LibGUI')
-rw-r--r--Userland/Libraries/LibGUI/ValueSlider.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/Userland/Libraries/LibGUI/ValueSlider.cpp b/Userland/Libraries/LibGUI/ValueSlider.cpp
index 3d868913dd..0410d0a484 100644
--- a/Userland/Libraries/LibGUI/ValueSlider.cpp
+++ b/Userland/Libraries/LibGUI/ValueSlider.cpp
@@ -139,11 +139,14 @@ Gfx::IntRect ValueSlider::knob_rect() const
int ValueSlider::value_at(Gfx::IntPoint position) const
{
- if (position.x() < bar_rect().left())
+ int knob_thickness = knob_length();
+ float leftmost_knob_center = (float)bar_rect().left() + (float)knob_thickness / 2;
+ if (position.x() < leftmost_knob_center)
return min();
- if (position.x() > bar_rect().right())
+ float rightmost_knob_center = (float)bar_rect().right() - (float)knob_thickness / 2;
+ if (position.x() > rightmost_knob_center)
return max();
- float relative_offset = (float)(position.x() - bar_rect().left()) / (float)bar_rect().width();
+ float relative_offset = (float)(position.x() - leftmost_knob_center) / (rightmost_knob_center - leftmost_knob_center);
int range = max() - min();
return min() + (int)roundf(relative_offset * (float)range);