Browse Source

Jump to value on press

feature/fluent-slider
Jumar Macato 6 years ago
parent
commit
6d5fdce4db
No known key found for this signature in database GPG Key ID: B19884DAC3A5BF3F
  1. 67
      src/Avalonia.Controls/Slider.cs

67
src/Avalonia.Controls/Slider.cs

@ -34,6 +34,8 @@ namespace Avalonia.Controls
private Track _track; private Track _track;
private Button _decreaseButton; private Button _decreaseButton;
private Button _increaseButton; private Button _increaseButton;
private IDisposable _decreaseButtonSubscription;
private IDisposable _increaseButtonSubscription;
/// <summary> /// <summary>
/// Initializes static members of the <see cref="Slider"/> class. /// Initializes static members of the <see cref="Slider"/> class.
@ -85,15 +87,8 @@ namespace Avalonia.Controls
/// <inheritdoc/> /// <inheritdoc/>
protected override void OnApplyTemplate(TemplateAppliedEventArgs e) protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{ {
if (_decreaseButton != null) _decreaseButtonSubscription?.Dispose();
{ _increaseButtonSubscription?.Dispose();
_decreaseButton.Click -= DecreaseClick;
}
if (_increaseButton != null)
{
_increaseButton.Click -= IncreaseClick;
}
_decreaseButton = e.NameScope.Find<Button>("PART_DecreaseButton"); _decreaseButton = e.NameScope.Find<Button>("PART_DecreaseButton");
_track = e.NameScope.Find<Track>("PART_Track"); _track = e.NameScope.Find<Track>("PART_Track");
@ -101,40 +96,49 @@ namespace Avalonia.Controls
if (_decreaseButton != null) if (_decreaseButton != null)
{ {
_decreaseButton.Click += DecreaseClick; _decreaseButtonSubscription = _decreaseButton.AddDisposableHandler(PointerPressedEvent, TrackPressed, RoutingStrategies.Tunnel);
} }
if (_increaseButton != null) if (_increaseButton != null)
{ {
_increaseButton.Click += IncreaseClick; _increaseButtonSubscription = _increaseButton.AddDisposableHandler(PointerPressedEvent, TrackPressed, RoutingStrategies.Tunnel);
} }
} }
private void DecreaseClick(object sender, RoutedEventArgs e) private void TrackPressed(object sender, PointerPressedEventArgs e)
{ {
ChangeValueBy(-LargeChange); if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
} return;
private void IncreaseClick(object sender, RoutedEventArgs e) var x = e.GetCurrentPoint(_track);
{
ChangeValueBy(LargeChange);
}
private void ChangeValueBy(double by) var orient = Orientation == Orientation.Horizontal;
{ var pointDen = orient ? _track.Bounds.Width : _track.Bounds.Height;
if (IsSnapToTickEnabled) var pointNum = orient ? x.Position.X : x.Position.Y;
{ var invert = orient ? 0 : 1;
by = by < 0 ? Math.Min(-TickFrequency, by) : Math.Max(TickFrequency, by); var calcVal = Math.Abs(invert - (pointNum / pointDen));
} var range = Maximum - Minimum;
Value = calcVal * range;
var value = Value; e.Handled = true;
var next = SnapToTick(Math.Max(Math.Min(value + by, Maximum), Minimum));
if (next != value)
{
Value = next;
}
} }
// private void ChangeValueBy(double by)
// {
// if (IsSnapToTickEnabled)
// {
// by = by < 0 ? Math.Min(-TickFrequency, by) : Math.Max(TickFrequency, by);
// }
// var value = Value;
// var next = SnapToTick(Math.Max(Math.Min(value + by, Maximum), Minimum));
// if (next != value)
// {
// Value = next;
// }
// }
protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change) protected override void OnPropertyChanged<T>(AvaloniaPropertyChangedEventArgs<T> change)
{ {
base.OnPropertyChanged(change); base.OnPropertyChanged(change);
@ -159,8 +163,7 @@ namespace Avalonia.Controls
/// <param name="e"></param> /// <param name="e"></param>
protected virtual void OnThumbDragDelta(VectorEventArgs e) protected virtual void OnThumbDragDelta(VectorEventArgs e)
{ {
Thumb thumb = e.Source as Thumb; if (e.Source is Thumb thumb && _track?.Thumb == thumb)
if (thumb != null && _track?.Thumb == thumb)
{ {
MoveToNextTick(_track.Value); MoveToNextTick(_track.Value);
} }

Loading…
Cancel
Save