From 0f5d41e17da8fc838c2c31fffb324052a015aa5c Mon Sep 17 00:00:00 2001 From: rabbitism Date: Wed, 27 Mar 2024 16:24:52 +0800 Subject: [PATCH] fix: fix touch mode. --- src/Ursa/Controls/ComboBox/MultiComboBox.cs | 11 +---- .../Controls/ComboBox/MultiComboBoxItem.cs | 44 ++++++++++++++----- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/Ursa/Controls/ComboBox/MultiComboBox.cs b/src/Ursa/Controls/ComboBox/MultiComboBox.cs index adf8162..1ca8e7d 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBox.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBox.cs @@ -178,16 +178,7 @@ public class MultiComboBox: SelectingItemsControl, IInnerContentControl } } } - - public void SelectAll() - { - this.SelectedItems?.Clear(); - foreach (var item in Items) - { - this.SelectedItems?.Add(item); - } - } - + protected override void OnUnloaded(RoutedEventArgs e) { base.OnUnloaded(e); diff --git a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs index 1c3931d..ccfa1f2 100644 --- a/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs +++ b/src/Ursa/Controls/ComboBox/MultiComboBoxItem.cs @@ -11,6 +11,8 @@ namespace Ursa.Controls; public class MultiComboBoxItem: ContentControl { private MultiComboBox? _parent; + private static readonly Point s_invalidPoint = new (double.NaN, double.NaN); + private Point _pointerDownPoint = s_invalidPoint; public static readonly StyledProperty IsSelectedProperty = AvaloniaProperty.Register( nameof(IsSelected)); @@ -43,16 +45,6 @@ public class MultiComboBoxItem: ContentControl } } - public MultiComboBoxItem() - { - this.GetObservable(IsFocusedProperty).Subscribe(a=> { - if (a) - { - (Parent as MultiComboBox)?.ItemFocused(this); - } - }); - } - protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) { base.OnAttachedToLogicalTree(e); @@ -64,14 +56,42 @@ public class MultiComboBoxItem: ContentControl protected override void OnPointerPressed(PointerPressedEventArgs e) { base.OnPointerPressed(e); + _pointerDownPoint = e.GetPosition(this); if (e.Handled) { return; } if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) { - this.IsSelected = !this.IsSelected; - e.Handled = true; + var p = e.GetCurrentPoint(this); + if (p.Properties.PointerUpdateKind is PointerUpdateKind.LeftButtonPressed + or PointerUpdateKind.RightButtonPressed) + { + if (p.Pointer.Type == PointerType.Mouse) + { + this.IsSelected = !this.IsSelected; + e.Handled = true; + } + else + { + _pointerDownPoint = p.Position; + } + } + } + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + base.OnPointerReleased(e); + if (!e.Handled && !double.IsNaN(_pointerDownPoint.X) && + e.InitialPressMouseButton is MouseButton.Left or MouseButton.Right) + { + var point = e.GetCurrentPoint(this); + if (new Rect(Bounds.Size).ContainsExclusive(point.Position)) + { + this.IsSelected = !this.IsSelected; + e.Handled = true; + } } } } \ No newline at end of file