From b99184b815e2ec05dd770c6eb4f7a153543c71db Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 17:20:53 -0300 Subject: [PATCH 1/7] Add resources for listbox. --- .../Accents/FluentBaseDark.xaml | 18 ++++++++++++++++++ .../Accents/FluentBaseLight.xaml | 18 ++++++++++++++++++ .../Accents/FluentControlResourcesDark.xaml | 18 ++++++++++++++++++ .../Accents/FluentControlResourcesLight.xaml | 18 ++++++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml index ed6f56b211..292870c3cf 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml @@ -85,6 +85,24 @@ + + 0 + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml index ac7b792a9a..f734e1eff8 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -86,6 +86,24 @@ + + 0 + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml index a0f3ef0d62..3f9dc68383 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -39,6 +39,24 @@ + + 0 + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml index ec4f35664c..46b8f4422c 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml @@ -39,6 +39,24 @@ + + 0 + + + + + + + + + + + + + + + + From 6e55912c75c6af942d0e59e34cf04948feb9f553 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 17:33:36 -0300 Subject: [PATCH 2/7] fully ported listbox and listbox items --- src/Avalonia.Themes.Fluent/ListBox.xaml | 70 +++++++++------- src/Avalonia.Themes.Fluent/ListBoxItem.xaml | 90 +++++++++++++++++---- 2 files changed, 114 insertions(+), 46 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/ListBox.xaml b/src/Avalonia.Themes.Fluent/ListBox.xaml index e91d8a6772..7a87387de8 100644 --- a/src/Avalonia.Themes.Fluent/ListBox.xaml +++ b/src/Avalonia.Themes.Fluent/ListBox.xaml @@ -1,31 +1,43 @@ - - + + + + Test + Test + Test + Test + + + + + diff --git a/src/Avalonia.Themes.Fluent/ListBoxItem.xaml b/src/Avalonia.Themes.Fluent/ListBoxItem.xaml index 19a6e3d4ec..430d3c5468 100644 --- a/src/Avalonia.Themes.Fluent/ListBoxItem.xaml +++ b/src/Avalonia.Themes.Fluent/ListBoxItem.xaml @@ -1,12 +1,27 @@ - + + + + + Disabled + Test + Test + + + + + 12,9,12,12 + - + + + + + + + + + + + + + + + - - - + + + + - - + From 01c327d3bfb6538a1c08716471974d55c981a74e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 17:34:00 -0300 Subject: [PATCH 3/7] Add pressed pseudo class to ListBoxItem. --- src/Avalonia.Controls/ListBoxItem.cs | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Avalonia.Controls/ListBoxItem.cs b/src/Avalonia.Controls/ListBoxItem.cs index 199c9e0ff8..46a7ccec0b 100644 --- a/src/Avalonia.Controls/ListBoxItem.cs +++ b/src/Avalonia.Controls/ListBoxItem.cs @@ -1,4 +1,5 @@ using Avalonia.Controls.Mixins; +using Avalonia.Input; namespace Avalonia.Controls { @@ -30,5 +31,34 @@ namespace Avalonia.Controls get { return GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + base.OnPointerPressed(e); + + if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + { + UpdatePseudoClasses(true); + } + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + base.OnPointerReleased(e); + + UpdatePseudoClasses(false); + } + + protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) + { + base.OnPointerCaptureLost(e); + + UpdatePseudoClasses(false); + } + + private void UpdatePseudoClasses(bool isPressed) + { + PseudoClasses.Set(":pressed", isPressed); + } } } From c961df9ee1e04f8ef39905ed9c866f1173edb051 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 19:34:53 -0300 Subject: [PATCH 4/7] fix unit for listbox test. --- .../Primitives/SelectingItemsControlTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index 04d0ac0a7a..fe9c7b1261 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -994,7 +994,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Presenter.ApplyTemplate(); _helper.Down((Interactive)target.Presenter.Panel.Children[3]); - Assert.Equal(new[] { ":selected" }, target.Presenter.Panel.Children[3].Classes); + Assert.Equal(new[] { ":pressed", ":selected" }, target.Presenter.Panel.Children[3].Classes); } [Fact] From 817476ef77401cf42980147def0aa0067f658647 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 29 May 2020 13:31:03 -0300 Subject: [PATCH 5/7] implement a pressed mixin. --- src/Avalonia.Controls/Mixins/PressedMixin.cs | 33 +++++++++++++++++ .../Mixins/PressedMixinTests.cs | 37 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/Avalonia.Controls/Mixins/PressedMixin.cs create mode 100644 tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs diff --git a/src/Avalonia.Controls/Mixins/PressedMixin.cs b/src/Avalonia.Controls/Mixins/PressedMixin.cs new file mode 100644 index 0000000000..01b0a8564f --- /dev/null +++ b/src/Avalonia.Controls/Mixins/PressedMixin.cs @@ -0,0 +1,33 @@ +using Avalonia.Interactivity; +using Avalonia.Input; + +namespace Avalonia.Controls.Mixins +{ + /// + /// Adds pressed functionality to control classes. + /// + /// Adds the ':pressed' class when the item is pressed. + /// + public static class PressedMixin + { + private static void HandlePointerPressed(TControl sender, PointerPressedEventArgs e) where TControl : Control + { + if (e.GetCurrentPoint(sender).Properties.IsLeftButtonPressed) + { + ((IPseudoClasses)sender.Classes).Set(":pressed", true); + } + } + + private static void HandlePointerReleased(TControl sender) where TControl : Control + { + ((IPseudoClasses)sender.Classes).Set(":pressed", false); + } + + public static void Attach() where TControl : Control + { + InputElement.PointerPressedEvent.AddClassHandler((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel, true); + InputElement.PointerReleasedEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); + InputElement.PointerCaptureLostEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); + } + } +} diff --git a/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs b/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs new file mode 100644 index 0000000000..0ff1f40121 --- /dev/null +++ b/tests/Avalonia.Controls.UnitTests/Mixins/PressedMixinTests.cs @@ -0,0 +1,37 @@ +using Avalonia.Controls.Mixins; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Controls.UnitTests.Mixins +{ + public class PressedMixinTests + { + private MouseTestHelper _mouse = new MouseTestHelper(); + + [Fact] + public void Selected_Class_Should_Not_Initially_Be_Added() + { + var target = new TestControl(); + + Assert.Empty(target.Classes); + } + + [Fact] + public void Setting_IsSelected_Should_Add_Selected_Class() + { + var target = new TestControl(); + + _mouse.Down(target); + + Assert.Equal(new[] { ":pressed" }, target.Classes); + } + + private class TestControl : Control + { + static TestControl() + { + PressedMixin.Attach(); + } + } + } +} From 852d24c713d3e00e7aea0f881a7e2065826c818b Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 29 May 2020 13:31:20 -0300 Subject: [PATCH 6/7] listbox item gets pressed mixin. --- src/Avalonia.Controls/ListBoxItem.cs | 30 +--------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/src/Avalonia.Controls/ListBoxItem.cs b/src/Avalonia.Controls/ListBoxItem.cs index 46a7ccec0b..e04c79987f 100644 --- a/src/Avalonia.Controls/ListBoxItem.cs +++ b/src/Avalonia.Controls/ListBoxItem.cs @@ -20,6 +20,7 @@ namespace Avalonia.Controls static ListBoxItem() { SelectableMixin.Attach(IsSelectedProperty); + PressedMixin.Attach(); FocusableProperty.OverrideDefaultValue(true); } @@ -31,34 +32,5 @@ namespace Avalonia.Controls get { return GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } } - - protected override void OnPointerPressed(PointerPressedEventArgs e) - { - base.OnPointerPressed(e); - - if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) - { - UpdatePseudoClasses(true); - } - } - - protected override void OnPointerReleased(PointerReleasedEventArgs e) - { - base.OnPointerReleased(e); - - UpdatePseudoClasses(false); - } - - protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) - { - base.OnPointerCaptureLost(e); - - UpdatePseudoClasses(false); - } - - private void UpdatePseudoClasses(bool isPressed) - { - PseudoClasses.Set(":pressed", isPressed); - } } } From 4bd7d4d7a5b74a1ffbff289c3416bbfd86df0020 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 29 May 2020 13:42:56 -0300 Subject: [PATCH 7/7] tidy pressed mixin. --- src/Avalonia.Controls/Mixins/PressedMixin.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls/Mixins/PressedMixin.cs b/src/Avalonia.Controls/Mixins/PressedMixin.cs index 01b0a8564f..4c5792b4a0 100644 --- a/src/Avalonia.Controls/Mixins/PressedMixin.cs +++ b/src/Avalonia.Controls/Mixins/PressedMixin.cs @@ -10,6 +10,17 @@ namespace Avalonia.Controls.Mixins /// public static class PressedMixin { + /// + /// Initializes a new instance of the class. + /// + /// The control type. + public static void Attach() where TControl : Control + { + InputElement.PointerPressedEvent.AddClassHandler((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel); + InputElement.PointerReleasedEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel); + InputElement.PointerCaptureLostEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel); + } + private static void HandlePointerPressed(TControl sender, PointerPressedEventArgs e) where TControl : Control { if (e.GetCurrentPoint(sender).Properties.IsLeftButtonPressed) @@ -22,12 +33,5 @@ namespace Avalonia.Controls.Mixins { ((IPseudoClasses)sender.Classes).Set(":pressed", false); } - - public static void Attach() where TControl : Control - { - InputElement.PointerPressedEvent.AddClassHandler((x, e) => HandlePointerPressed(x, e), RoutingStrategies.Tunnel, true); - InputElement.PointerReleasedEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); - InputElement.PointerCaptureLostEvent.AddClassHandler((x, e) => HandlePointerReleased(x), RoutingStrategies.Tunnel, true); - } } }