From aea5ebb1a415684b889dccd466ad85af28988d12 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Sun, 14 Jan 2024 01:49:31 +0800 Subject: [PATCH] feat: WIP --- src/Ursa/Controls/NumericUpDown/IntUpDown.cs | 36 ++++++-- .../NumericUpDown/NumericUpDownBase.cs | 83 +++++++++++++++++-- 2 files changed, 107 insertions(+), 12 deletions(-) diff --git a/src/Ursa/Controls/NumericUpDown/IntUpDown.cs b/src/Ursa/Controls/NumericUpDown/IntUpDown.cs index 07ce4b6..b951372 100644 --- a/src/Ursa/Controls/NumericUpDown/IntUpDown.cs +++ b/src/Ursa/Controls/NumericUpDown/IntUpDown.cs @@ -1,4 +1,6 @@ -namespace Ursa.Controls; +using Avalonia.Utilities; + +namespace Ursa.Controls; public class IntUpDown: NumericUpDownBase { @@ -6,17 +8,41 @@ public class IntUpDown: NumericUpDownBase static IntUpDown() { - MaximumProperty.OverrideDefaultValue(100); + MaximumProperty.OverrideDefaultValue(int.MaxValue); + StepProperty.OverrideDefaultValue(1); } protected override void Increase() { - //throw new NotImplementedException(); - Value += Maximum; + Value += Step; } protected override void Decrease() { - Value -= Maximum; + Value -= Step; + } + + protected override void UpdateTextToValue(string x) + { + if (int.TryParse(x, out var value)) + { + Value = value; + } + } + + protected override bool CommitInput() + { + // throw new NotImplementedException(); + return true; + } + + protected override void SyncTextAndValue() + { + // throw new NotImplementedException(); + } + + protected override int Clamp() + { + return MathUtilities.Clamp(Value, Maximum, Minimum); } } \ No newline at end of file diff --git a/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs b/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs index 564a235..659aeaa 100644 --- a/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs +++ b/src/Ursa/Controls/NumericUpDown/NumericUpDownBase.cs @@ -2,19 +2,26 @@ using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; +using Avalonia.Input; +using Avalonia.Interactivity; namespace Ursa.Controls; [TemplatePart(PART_Spinner, typeof(ButtonSpinner))] [TemplatePart(PART_TextBox, typeof(TextBox))] +[TemplatePart(PART_DragPanel, typeof(Panel))] public abstract class NumericUpDown : TemplatedControl { public const string PART_Spinner = "PART_Spinner"; public const string PART_TextBox = "PART_TextBox"; + public const string PART_DragPanel = "PART_DragPanel"; - private Avalonia.Controls.NumericUpDown? _numericUpDown; - private ButtonSpinner? _spinner; - private TextBox? _textBox; + protected internal ButtonSpinner? _spinner; + protected internal TextBox? _textBox; + protected internal Panel? _dragPanel; + + private Point? _point; + private bool _updateFromTextInput; public static readonly StyledProperty TextEditableProperty = AvaloniaProperty.Register( nameof(TextEditable), defaultValue: true); @@ -64,6 +71,13 @@ public abstract class NumericUpDown : TemplatedControl { _textBox.TextChanged -= OnTextChange; } + + if (_dragPanel is not null) + { + _dragPanel.PointerPressed -= OnDragPanelPointerPressed; + _dragPanel.PointerMoved -= OnDragPanelPointerMoved; + _dragPanel.PointerReleased -= OnDragPanelPointerReleased; + } _spinner = e.NameScope.Find(PART_Spinner); _textBox = e.NameScope.Find(PART_TextBox); if (_spinner is not null) @@ -75,13 +89,56 @@ public abstract class NumericUpDown : TemplatedControl { _textBox.TextChanged += OnTextChange; } + + if (_dragPanel is not null) + { + _dragPanel.PointerPressed+= OnDragPanelPointerPressed; + _dragPanel.PointerMoved += OnDragPanelPointerMoved; + _dragPanel.PointerReleased += OnDragPanelPointerReleased; + } } + protected override void OnLostFocus(RoutedEventArgs e) + { + CommitInput(); + base.OnLostFocus(e); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + if (e.Key == Key.Enter) + { + var commitSuccess = CommitInput(); + e.Handled = !commitSuccess; + } + } + + private void OnDragPanelPointerPressed(object sender, PointerPressedEventArgs e) + { + _point = e.GetPosition(this); + } + + private void OnDragPanelPointerReleased(object sender, PointerReleasedEventArgs e) + { + _point = null; + } + + private void OnDragPanelPointerMoved(object sender, PointerEventArgs e) + { + var point = e.GetPosition(this); + var delta = point - _point; + if (delta is null) + { + return; + } + } + private void OnTextChange(object sender, TextChangedEventArgs e) { - - + _updateFromTextInput = true; + UpdateTextToValue(_textBox?.Text ?? string.Empty); + _updateFromTextInput = false; } private void OnSpin(object sender, SpinEventArgs e) @@ -98,6 +155,9 @@ public abstract class NumericUpDown : TemplatedControl protected abstract void Increase(); protected abstract void Decrease(); + protected abstract void UpdateTextToValue(string x); + protected abstract bool CommitInput(); + protected abstract void SyncTextAndValue(); } public abstract class NumericUpDownBase: NumericUpDown where T: struct, IComparable @@ -128,6 +188,15 @@ public abstract class NumericUpDownBase: NumericUpDown where T: struct, IComp get => GetValue(MinimumProperty); set => SetValue(MinimumProperty, value); } - - + + public static readonly StyledProperty StepProperty = AvaloniaProperty.Register, T>( + nameof(Step)); + + public T Step + { + get => GetValue(StepProperty); + set => SetValue(StepProperty, value); + } + + protected abstract T Clamp(); } \ No newline at end of file