Skip to content

Commit 4e504c9

Browse files
mattleibowCopilot
andcommitted
Remove duplicate forwarding properties from SKGestureTracker
Remove the 12 forwarding properties (TouchSlop, DoubleTapSlop, FlingThreshold, LongPressDuration, MinScale, MaxScale, DoubleTapZoomFactor, ZoomAnimationDuration, ScrollZoomFactor, FlingFriction, FlingMinVelocity, FlingFrameInterval) from SKGestureTracker. Consumers now use tracker.Options.X instead. Keep Is*Enabled forwards since those are frequently toggled. Update all internal references, tests, and samples. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent ffc92c5 commit 4e504c9

File tree

4 files changed

+82
-173
lines changed

4 files changed

+82
-173
lines changed

samples/SkiaSharpDemo.Blazor/Pages/Gestures.razor

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,20 @@
6464

6565
<h6 class="mt-2">Options</h6>
6666
<div class="slider-row">
67-
<label>Min Scale: @_tracker.MinScale.ToString("F1")</label>
68-
<input type="range" min="0.1" max="1.0" step="0.1" value="@_tracker.MinScale" @onchange="e => { _tracker.MinScale = float.Parse((string)e.Value!); }" />
67+
<label>Min Scale: @_tracker.Options.MinScale.ToString("F1")</label>
68+
<input type="range" min="0.1" max="1.0" step="0.1" value="@_tracker.Options.MinScale" @onchange="e => { _tracker.Options.MinScale = float.Parse((string)e.Value!); }" />
6969
</div>
7070
<div class="slider-row">
71-
<label>Max Scale: @_tracker.MaxScale.ToString("F1")</label>
72-
<input type="range" min="2" max="20" step="1" value="@_tracker.MaxScale" @onchange="e => { _tracker.MaxScale = float.Parse((string)e.Value!); }" />
71+
<label>Max Scale: @_tracker.Options.MaxScale.ToString("F1")</label>
72+
<input type="range" min="2" max="20" step="1" value="@_tracker.Options.MaxScale" @onchange="e => { _tracker.Options.MaxScale = float.Parse((string)e.Value!); }" />
7373
</div>
7474
<div class="slider-row">
75-
<label>Double Tap Zoom: @_tracker.DoubleTapZoomFactor.ToString("F1")x</label>
76-
<input type="range" min="1.5" max="5.0" step="0.5" value="@_tracker.DoubleTapZoomFactor" @onchange="e => { _tracker.DoubleTapZoomFactor = float.Parse((string)e.Value!); }" />
75+
<label>Double Tap Zoom: @_tracker.Options.DoubleTapZoomFactor.ToString("F1")x</label>
76+
<input type="range" min="1.5" max="5.0" step="0.5" value="@_tracker.Options.DoubleTapZoomFactor" @onchange="e => { _tracker.Options.DoubleTapZoomFactor = float.Parse((string)e.Value!); }" />
7777
</div>
7878
<div class="slider-row">
79-
<label>Scroll Zoom Factor: @_tracker.ScrollZoomFactor.ToString("F2")</label>
80-
<input type="range" min="0.01" max="0.5" step="0.01" value="@_tracker.ScrollZoomFactor" @onchange="e => { _tracker.ScrollZoomFactor = float.Parse((string)e.Value!); }" />
79+
<label>Scroll Zoom Factor: @_tracker.Options.ScrollZoomFactor.ToString("F2")</label>
80+
<input type="range" min="0.01" max="0.5" step="0.01" value="@_tracker.Options.ScrollZoomFactor" @onchange="e => { _tracker.Options.ScrollZoomFactor = float.Parse((string)e.Value!); }" />
8181
</div>
8282

8383
<h6 class="mt-2">Current State</h6>

samples/SkiaSharpDemo/Demos/Gestures/GesturePage.xaml.cs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,8 @@ private async void OnSettingsClicked(object? sender, EventArgs e)
429429
{
430430
var page = new ContentPage { Title = "Gesture Settings" };
431431

432-
var touchSlop = _tracker.TouchSlop;
433-
var longPressDuration = _tracker.LongPressDuration;
432+
var touchSlop = _tracker.Options.TouchSlop;
433+
var longPressDuration = _tracker.Options.LongPressDuration;
434434

435435
var layout = new VerticalStackLayout { Padding = 20, Spacing = 12 };
436436

@@ -471,7 +471,7 @@ private async void OnSettingsClicked(object? sender, EventArgs e)
471471
var slopSlider = new Slider { Minimum = 1, Maximum = 50, Value = touchSlop };
472472
slopSlider.ValueChanged += (_, args) =>
473473
{
474-
_tracker.TouchSlop = (float)args.NewValue;
474+
_tracker.Options.TouchSlop = (float)args.NewValue;
475475
slopLabel.Text = $"Touch Slop: {args.NewValue:F0} px";
476476
};
477477
layout.Children.Add(slopLabel);
@@ -482,7 +482,7 @@ private async void OnSettingsClicked(object? sender, EventArgs e)
482482
var lpSlider = new Slider { Minimum = 100, Maximum = 2000, Value = longPressDuration };
483483
lpSlider.ValueChanged += (_, args) =>
484484
{
485-
_tracker.LongPressDuration = (int)args.NewValue;
485+
_tracker.Options.LongPressDuration = (int)args.NewValue;
486486
lpLabel.Text = $"Long Press: {(int)args.NewValue} ms";
487487
};
488488
layout.Children.Add(lpLabel);
@@ -492,44 +492,44 @@ private async void OnSettingsClicked(object? sender, EventArgs e)
492492
layout.Children.Add(new Label { Text = "Fling Settings", FontAttributes = FontAttributes.Bold, FontSize = 16, Margin = new Thickness(0, 10, 0, 0) });
493493

494494
// Fling friction
495-
var frictionLabel = new Label { Text = $"Friction: {_tracker.FlingFriction:F2}" };
496-
var frictionSlider = new Slider { Minimum = 0.0, Maximum = 1.0, Value = _tracker.FlingFriction };
495+
var frictionLabel = new Label { Text = $"Friction: {_tracker.Options.FlingFriction:F2}" };
496+
var frictionSlider = new Slider { Minimum = 0.0, Maximum = 1.0, Value = _tracker.Options.FlingFriction };
497497
frictionSlider.ValueChanged += (_, args) =>
498498
{
499-
_tracker.FlingFriction = (float)args.NewValue;
499+
_tracker.Options.FlingFriction = (float)args.NewValue;
500500
frictionLabel.Text = $"Friction: {args.NewValue:F2}";
501501
};
502502
layout.Children.Add(frictionLabel);
503503
layout.Children.Add(frictionSlider);
504504

505505
// Fling min velocity
506-
var minVelLabel = new Label { Text = $"Min Velocity: {_tracker.FlingMinVelocity:F0} px/s" };
507-
var minVelSlider = new Slider { Minimum = 1, Maximum = 50, Value = _tracker.FlingMinVelocity };
506+
var minVelLabel = new Label { Text = $"Min Velocity: {_tracker.Options.FlingMinVelocity:F0} px/s" };
507+
var minVelSlider = new Slider { Minimum = 1, Maximum = 50, Value = _tracker.Options.FlingMinVelocity };
508508
minVelSlider.ValueChanged += (_, args) =>
509509
{
510-
_tracker.FlingMinVelocity = (float)args.NewValue;
510+
_tracker.Options.FlingMinVelocity = (float)args.NewValue;
511511
minVelLabel.Text = $"Min Velocity: {args.NewValue:F0} px/s";
512512
};
513513
layout.Children.Add(minVelLabel);
514514
layout.Children.Add(minVelSlider);
515515

516516
// Fling detection threshold
517-
var threshLabel = new Label { Text = $"Fling Threshold: {_tracker.FlingThreshold:F0} px/s" };
518-
var threshSlider = new Slider { Minimum = 50, Maximum = 1000, Value = _tracker.FlingThreshold };
517+
var threshLabel = new Label { Text = $"Fling Threshold: {_tracker.Options.FlingThreshold:F0} px/s" };
518+
var threshSlider = new Slider { Minimum = 50, Maximum = 1000, Value = _tracker.Options.FlingThreshold };
519519
threshSlider.ValueChanged += (_, args) =>
520520
{
521-
_tracker.FlingThreshold = (float)args.NewValue;
521+
_tracker.Options.FlingThreshold = (float)args.NewValue;
522522
threshLabel.Text = $"Fling Threshold: {args.NewValue:F0} px/s";
523523
};
524524
layout.Children.Add(threshLabel);
525525
layout.Children.Add(threshSlider);
526526

527527
// Double tap slop
528-
var dtSlopLabel = new Label { Text = $"Double Tap Slop: {_tracker.DoubleTapSlop:F0} px" };
529-
var dtSlopSlider = new Slider { Minimum = 10, Maximum = 200, Value = _tracker.DoubleTapSlop };
528+
var dtSlopLabel = new Label { Text = $"Double Tap Slop: {_tracker.Options.DoubleTapSlop:F0} px" };
529+
var dtSlopSlider = new Slider { Minimum = 10, Maximum = 200, Value = _tracker.Options.DoubleTapSlop };
530530
dtSlopSlider.ValueChanged += (_, args) =>
531531
{
532-
_tracker.DoubleTapSlop = (float)args.NewValue;
532+
_tracker.Options.DoubleTapSlop = (float)args.NewValue;
533533
dtSlopLabel.Text = $"Double Tap Slop: {args.NewValue:F0} px";
534534
};
535535
layout.Children.Add(dtSlopLabel);
@@ -538,41 +538,41 @@ private async void OnSettingsClicked(object? sender, EventArgs e)
538538
// --- Zoom Settings ---
539539
layout.Children.Add(new Label { Text = "Zoom Settings", FontAttributes = FontAttributes.Bold, FontSize = 16, Margin = new Thickness(0, 10, 0, 0) });
540540

541-
var zoomFactorLabel = new Label { Text = $"Double Tap Zoom: {_tracker.DoubleTapZoomFactor:F1}x" };
542-
var zoomFactorSlider = new Slider { Minimum = 1.5, Maximum = 5.0, Value = _tracker.DoubleTapZoomFactor };
541+
var zoomFactorLabel = new Label { Text = $"Double Tap Zoom: {_tracker.Options.DoubleTapZoomFactor:F1}x" };
542+
var zoomFactorSlider = new Slider { Minimum = 1.5, Maximum = 5.0, Value = _tracker.Options.DoubleTapZoomFactor };
543543
zoomFactorSlider.ValueChanged += (_, args) =>
544544
{
545-
_tracker.DoubleTapZoomFactor = (float)args.NewValue;
545+
_tracker.Options.DoubleTapZoomFactor = (float)args.NewValue;
546546
zoomFactorLabel.Text = $"Double Tap Zoom: {args.NewValue:F1}x";
547547
};
548548
layout.Children.Add(zoomFactorLabel);
549549
layout.Children.Add(zoomFactorSlider);
550550

551-
var scrollZoomLabel = new Label { Text = $"Scroll Zoom Factor: {_tracker.ScrollZoomFactor:F2}" };
552-
var scrollZoomSlider = new Slider { Minimum = 0.01, Maximum = 0.5, Value = _tracker.ScrollZoomFactor };
551+
var scrollZoomLabel = new Label { Text = $"Scroll Zoom Factor: {_tracker.Options.ScrollZoomFactor:F2}" };
552+
var scrollZoomSlider = new Slider { Minimum = 0.01, Maximum = 0.5, Value = _tracker.Options.ScrollZoomFactor };
553553
scrollZoomSlider.ValueChanged += (_, args) =>
554554
{
555-
_tracker.ScrollZoomFactor = (float)args.NewValue;
555+
_tracker.Options.ScrollZoomFactor = (float)args.NewValue;
556556
scrollZoomLabel.Text = $"Scroll Zoom Factor: {args.NewValue:F2}";
557557
};
558558
layout.Children.Add(scrollZoomLabel);
559559
layout.Children.Add(scrollZoomSlider);
560560

561-
var minScaleLabel = new Label { Text = $"Min Scale: {_tracker.MinScale:F1}x" };
562-
var minScaleSlider = new Slider { Minimum = 0.1, Maximum = 1.0, Value = _tracker.MinScale };
561+
var minScaleLabel = new Label { Text = $"Min Scale: {_tracker.Options.MinScale:F1}x" };
562+
var minScaleSlider = new Slider { Minimum = 0.1, Maximum = 1.0, Value = _tracker.Options.MinScale };
563563
minScaleSlider.ValueChanged += (_, args) =>
564564
{
565-
_tracker.MinScale = (float)args.NewValue;
565+
_tracker.Options.MinScale = (float)args.NewValue;
566566
minScaleLabel.Text = $"Min Scale: {args.NewValue:F1}x";
567567
};
568568
layout.Children.Add(minScaleLabel);
569569
layout.Children.Add(minScaleSlider);
570570

571-
var maxScaleLabel = new Label { Text = $"Max Scale: {_tracker.MaxScale:F1}x" };
572-
var maxScaleSlider = new Slider { Minimum = 2.0, Maximum = 20.0, Value = _tracker.MaxScale };
571+
var maxScaleLabel = new Label { Text = $"Max Scale: {_tracker.Options.MaxScale:F1}x" };
572+
var maxScaleSlider = new Slider { Minimum = 2.0, Maximum = 20.0, Value = _tracker.Options.MaxScale };
573573
maxScaleSlider.ValueChanged += (_, args) =>
574574
{
575-
_tracker.MaxScale = (float)args.NewValue;
575+
_tracker.Options.MaxScale = (float)args.NewValue;
576576
maxScaleLabel.Text = $"Max Scale: {args.NewValue:F1}x";
577577
};
578578
layout.Children.Add(maxScaleLabel);

source/SkiaSharp.Extended/Gestures/SKGestureTracker.cs

Lines changed: 14 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -103,34 +103,6 @@ public bool IsEnabled
103103
set => _engine.IsEnabled = value;
104104
}
105105

106-
/// <summary>Gets or sets the touch slop (minimum movement to start a gesture).</summary>
107-
public float TouchSlop
108-
{
109-
get => Options.TouchSlop;
110-
set => Options.TouchSlop = value;
111-
}
112-
113-
/// <summary>Gets or sets the double-tap slop distance.</summary>
114-
public float DoubleTapSlop
115-
{
116-
get => Options.DoubleTapSlop;
117-
set => Options.DoubleTapSlop = value;
118-
}
119-
120-
/// <summary>Gets or sets the fling velocity detection threshold.</summary>
121-
public float FlingThreshold
122-
{
123-
get => Options.FlingThreshold;
124-
set => Options.FlingThreshold = value;
125-
}
126-
127-
/// <summary>Gets or sets the long press duration in milliseconds.</summary>
128-
public int LongPressDuration
129-
{
130-
get => Options.LongPressDuration;
131-
set => Options.LongPressDuration = value;
132-
}
133-
134106
/// <summary>Gets or sets the time provider (for testing).</summary>
135107
public Func<long> TimeProvider
136108
{
@@ -176,69 +148,6 @@ public void SetViewSize(float width, float height)
176148

177149
#endregion
178150

179-
#region Transform Config
180-
181-
/// <summary>Gets or sets the minimum allowed scale.</summary>
182-
public float MinScale
183-
{
184-
get => Options.MinScale;
185-
set => Options.MinScale = value;
186-
}
187-
188-
/// <summary>Gets or sets the maximum allowed scale.</summary>
189-
public float MaxScale
190-
{
191-
get => Options.MaxScale;
192-
set => Options.MaxScale = value;
193-
}
194-
195-
/// <summary>Gets or sets the zoom factor applied per double-tap.</summary>
196-
public float DoubleTapZoomFactor
197-
{
198-
get => Options.DoubleTapZoomFactor;
199-
set => Options.DoubleTapZoomFactor = value;
200-
}
201-
202-
/// <summary>Gets or sets the zoom animation duration in milliseconds.</summary>
203-
public int ZoomAnimationDuration
204-
{
205-
get => Options.ZoomAnimationDuration;
206-
set => Options.ZoomAnimationDuration = value;
207-
}
208-
209-
/// <summary>Gets or sets how much each scroll tick changes scale.</summary>
210-
public float ScrollZoomFactor
211-
{
212-
get => Options.ScrollZoomFactor;
213-
set => Options.ScrollZoomFactor = value;
214-
}
215-
216-
/// <summary>
217-
/// Gets or sets the fling friction (0 = no friction / infinite fling, 1 = full friction / no fling).
218-
/// Default is 0.08.
219-
/// </summary>
220-
public float FlingFriction
221-
{
222-
get => Options.FlingFriction;
223-
set => Options.FlingFriction = value;
224-
}
225-
226-
/// <summary>Gets or sets the minimum fling velocity before the animation stops.</summary>
227-
public float FlingMinVelocity
228-
{
229-
get => Options.FlingMinVelocity;
230-
set => Options.FlingMinVelocity = value;
231-
}
232-
233-
/// <summary>Gets or sets the fling animation frame interval in milliseconds.</summary>
234-
public int FlingFrameInterval
235-
{
236-
get => Options.FlingFrameInterval;
237-
set => Options.FlingFrameInterval = value;
238-
}
239-
240-
#endregion
241-
242151
#region Feature Toggles
243152

244153
/// <summary>Gets or sets whether tap detection is enabled.</summary>
@@ -404,8 +313,8 @@ public void ZoomTo(float factor, SKPoint focalPoint)
404313
_zoomTimer = new Timer(
405314
OnZoomTimerTick,
406315
token,
407-
FlingFrameInterval,
408-
FlingFrameInterval);
316+
Options.FlingFrameInterval,
317+
Options.FlingFrameInterval);
409318
}
410319

411320
/// <summary>Stops any active zoom animation.</summary>
@@ -524,14 +433,14 @@ private void OnEngineDoubleTapDetected(object? s, SKTapGestureEventArgs e)
524433
if (!IsDoubleTapZoomEnabled)
525434
return;
526435

527-
if (_scale >= MaxScale - 0.01f)
436+
if (_scale >= Options.MaxScale - 0.01f)
528437
{
529438
// At max zoom — animate reset to 1.0
530439
ZoomTo(1f / _scale, e.Location);
531440
}
532441
else
533442
{
534-
var factor = Math.Min(DoubleTapZoomFactor, MaxScale / _scale);
443+
var factor = Math.Min(Options.DoubleTapZoomFactor, Options.MaxScale / _scale);
535444
ZoomTo(factor, e.Location);
536445
}
537446
}
@@ -593,7 +502,7 @@ private void OnEnginePinchDetected(object? s, SKPinchGestureEventArgs e)
593502

594503
if (IsPinchEnabled)
595504
{
596-
var newScale = Clamp(_scale * e.ScaleDelta, MinScale, MaxScale);
505+
var newScale = Clamp(_scale * e.ScaleDelta, Options.MinScale, Options.MaxScale);
597506
AdjustOffsetForPivot(e.FocalPoint, _scale, newScale, _rotation, _rotation);
598507
_scale = newScale;
599508
}
@@ -639,8 +548,8 @@ private void OnEngineScrollDetected(object? s, SKScrollGestureEventArgs e)
639548
if (!IsScrollZoomEnabled || e.DeltaY == 0)
640549
return;
641550

642-
var scaleDelta = 1f + e.DeltaY * ScrollZoomFactor;
643-
var newScale = Clamp(_scale * scaleDelta, MinScale, MaxScale);
551+
var scaleDelta = 1f + e.DeltaY * Options.ScrollZoomFactor;
552+
var newScale = Clamp(_scale * scaleDelta, Options.MinScale, Options.MaxScale);
644553
AdjustOffsetForPivot(e.Location, _scale, newScale, _rotation, _rotation);
645554
_scale = newScale;
646555
TransformChanged?.Invoke(this, EventArgs.Empty);
@@ -715,8 +624,8 @@ private void StartFlingAnimation(float velocityX, float velocityY)
715624
_flingTimer = new Timer(
716625
OnFlingTimerTick,
717626
token,
718-
FlingFrameInterval,
719-
FlingFrameInterval);
627+
Options.FlingFrameInterval,
628+
Options.FlingFrameInterval);
720629
}
721630

722631
private void OnFlingTimerTick(object? state)
@@ -747,7 +656,7 @@ private void HandleFlingFrame()
747656
if (!_isFlinging || _disposed)
748657
return;
749658

750-
var dt = FlingFrameInterval / 1000f;
659+
var dt = Options.FlingFrameInterval / 1000f;
751660
var deltaX = _flingVelocityX * dt;
752661
var deltaY = _flingVelocityY * dt;
753662

@@ -759,12 +668,12 @@ private void HandleFlingFrame()
759668
TransformChanged?.Invoke(this, EventArgs.Empty);
760669

761670
// Apply friction (FlingFriction: 0 = no friction, 1 = full friction)
762-
var decay = 1f - FlingFriction;
671+
var decay = 1f - Options.FlingFriction;
763672
_flingVelocityX *= decay;
764673
_flingVelocityY *= decay;
765674

766675
var speed = (float)Math.Sqrt(_flingVelocityX * _flingVelocityX + _flingVelocityY * _flingVelocityY);
767-
if (speed < FlingMinVelocity)
676+
if (speed < Options.FlingMinVelocity)
768677
{
769678
StopFling();
770679
}
@@ -803,7 +712,7 @@ private void HandleZoomFrame()
803712
return;
804713

805714
var elapsed = TimeProvider() - _zoomStartTicks;
806-
var duration = ZoomAnimationDuration * TimeSpan.TicksPerMillisecond;
715+
var duration = Options.ZoomAnimationDuration * TimeSpan.TicksPerMillisecond;
807716
var t = duration > 0 ? Math.Min(1.0, (double)elapsed / duration) : 1.0;
808717

809718
// CubicOut easing: 1 - (1 - t)^3
@@ -818,7 +727,7 @@ private void HandleZoomFrame()
818727

819728
// Apply scale change
820729
var oldScale = _scale;
821-
var newScale = Clamp(_zoomStartScale * cumulative, MinScale, MaxScale);
730+
var newScale = Clamp(_zoomStartScale * cumulative, Options.MinScale, Options.MaxScale);
822731
AdjustOffsetForPivot(_zoomFocalPoint, oldScale, newScale, _rotation, _rotation);
823732
_scale = newScale;
824733
TransformChanged?.Invoke(this, EventArgs.Empty);

0 commit comments

Comments
 (0)