Skip to content

Commit b40b727

Browse files
committed
Changed GradientSlider to track position as Point with Y axis
1 parent aa83779 commit b40b727

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

components/GradientSlider/src/GradientSlider.Input.cs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Windows.UI;
77
#else
88
using Microsoft.UI;
9+
using Microsoft.UI.Xaml.Controls.Primitives;
910
#endif
1011

1112
namespace CommunityToolkit.WinUI.Controls;
@@ -18,7 +19,9 @@ private void Thumb_DragStarted(object sender, DragStartedEventArgs e)
1819
return;
1920

2021
_draggingThumb = thumb;
21-
_dragStartPosition = Canvas.GetLeft(thumb);
22+
var xStart = Canvas.GetLeft(thumb);
23+
var yStart = e.VerticalOffset;
24+
_dragPosition = new Point(xStart, yStart);
2225

2326
OnThumbDragStarted(e);
2427
}
@@ -31,10 +34,10 @@ private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
3134
if (sender is not GradientSliderThumb thumb)
3235
return;
3336

34-
_dragStartPosition += e.HorizontalChange;
35-
var newPos = _dragStartPosition / (_containerCanvas.ActualWidth - thumb.ActualWidth);
36-
thumb.GradientStop.Offset = Math.Clamp(newPos, 0, 1);
37-
UpdateThumbPosition(thumb);
37+
_dragPosition.X += e.HorizontalChange;
38+
_dragPosition.Y += e.VerticalChange;
39+
40+
HandleThumbDragging(thumb, _dragPosition);
3841
}
3942

4043
private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e)
@@ -63,22 +66,21 @@ private void ContainerCanvas_PointerMoved(object sender, PointerRoutedEventArgs
6366
if (_containerCanvas is null || _placeholderThumb is null)
6467
return;
6568

66-
var position = e.GetCurrentPoint(_containerCanvas).Position.X;
69+
var position = e.GetCurrentPoint(_containerCanvas).Position;
70+
var posX = position.X;
6771

6872
if (_draggingThumb is null)
6973
{
7074
// NOTE: This check could be made O(log(n)) by tracking the thumbs positions in a sorted list and running a binary search
71-
_placeholderThumb.IsEnabled = !IsPointerOverThumb(position);
75+
_placeholderThumb.IsEnabled = !IsPointerOverThumb(posX);
7276

73-
var thumbPosition = position - _placeholderThumb.ActualWidth / 2;
77+
var thumbPosition = posX - _placeholderThumb.ActualWidth / 2;
7478
thumbPosition = Math.Clamp(thumbPosition, 0, _containerCanvas.ActualWidth - _placeholderThumb.ActualWidth);
7579
Canvas.SetLeft(_placeholderThumb, thumbPosition);
7680
}
7781
else if (_draggingThumb.PointerCaptures?.Count is null or 0)
7882
{
79-
var newPos = (position - (_draggingThumb.ActualWidth / 2)) / (_containerCanvas.ActualWidth - _draggingThumb.ActualWidth);
80-
_draggingThumb.GradientStop.Offset = Math.Clamp(newPos, 0, 1);
81-
UpdateThumbPosition(_draggingThumb);
83+
HandleThumbDragging(_draggingThumb, position);
8284
}
8385
}
8486

@@ -128,7 +130,6 @@ private void ContainerCanvas_PointerReleased(object sender, PointerRoutedEventAr
128130
_containerCanvas.ReleasePointerCapture(e.Pointer);
129131

130132
OnValueChanged();
131-
132133
}
133134

134135
private bool IsPointerOverThumb(double position)
@@ -148,4 +149,14 @@ private bool IsPointerOverThumb(double position)
148149

149150
return false;
150151
}
152+
153+
private void HandleThumbDragging(GradientSliderThumb thumb, Point position)
154+
{
155+
if (_containerCanvas is null)
156+
return;
157+
158+
var newPos = position.X / (_containerCanvas.ActualWidth - thumb.ActualWidth);
159+
thumb.GradientStop.Offset = Math.Clamp(newPos, 0, 1);
160+
UpdateThumbPosition(thumb);
161+
}
151162
}

components/GradientSlider/src/GradientSlider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public partial class GradientSlider : Control
3232
private Thumb? _placeholderThumb;
3333
private Rectangle? _backgroundRectangle;
3434

35-
private double _dragStartPosition;
35+
private Point _dragPosition;
3636
private GradientSliderThumb? _draggingThumb;
3737

3838
/// <summary>

0 commit comments

Comments
 (0)