From 513d1592efe693dfb7e2f87df3a911a7aa950b0e Mon Sep 17 00:00:00 2001 From: chinboy Date: Thu, 20 Nov 2025 18:32:36 +0800 Subject: [PATCH] Refactor IconPresenter --- .../Icon/IconPresenter.cs | 11 ----- .../Icon/Themes/IconTheme.axaml | 1 + src/AtomUI.Core/Controls/Icon/Icon.cs | 3 +- src/AtomUI.Core/Controls/Icon/IconProvider.cs | 43 ++++++++++++++----- .../Themes/ButtonSpinnerHandle.axaml | 4 +- .../Tag/Themes/TagTheme.axaml | 3 +- 6 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/AtomUI.Controls.Shared/Icon/IconPresenter.cs b/src/AtomUI.Controls.Shared/Icon/IconPresenter.cs index 914c6f55f..01186e3d8 100644 --- a/src/AtomUI.Controls.Shared/Icon/IconPresenter.cs +++ b/src/AtomUI.Controls.Shared/Icon/IconPresenter.cs @@ -5,7 +5,6 @@ using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Data; -using Avalonia.Layout; using Avalonia.Media; using Avalonia.Metadata; @@ -142,16 +141,6 @@ public class IconPresenter : TemplatedControl, IMotionAwareControl UpdatePseudoClasses(); } - protected override Size MeasureOverride(Size availableSize) - { - return LayoutHelper.MeasureChild(Icon, availableSize, Padding); - } - - protected override Size ArrangeOverride(Size finalSize) - { - return LayoutHelper.ArrangeChild(Icon, finalSize, Padding); - } - private void ChildChanged(AvaloniaPropertyChangedEventArgs e) { var oldChild = (Control?)e.OldValue; diff --git a/src/AtomUI.Controls.Shared/Icon/Themes/IconTheme.axaml b/src/AtomUI.Controls.Shared/Icon/Themes/IconTheme.axaml index 61e9cca07..bba84913a 100644 --- a/src/AtomUI.Controls.Shared/Icon/Themes/IconTheme.axaml +++ b/src/AtomUI.Controls.Shared/Icon/Themes/IconTheme.axaml @@ -13,6 +13,7 @@ + diff --git a/src/AtomUI.Core/Controls/Icon/Icon.cs b/src/AtomUI.Core/Controls/Icon/Icon.cs index 264c5ff14..c485d1d42 100644 --- a/src/AtomUI.Core/Controls/Icon/Icon.cs +++ b/src/AtomUI.Core/Controls/Icon/Icon.cs @@ -196,7 +196,6 @@ public class Icon : PathIcon, IMotionAwareControl { _sourceGeometriesData = new List(); _transforms = new List(); - this.ConfigureMotionBindingStyle(); Classes.CollectionChanged += HandlePseudoClassesChanged; } @@ -507,7 +506,7 @@ public class Icon : PathIcon, IMotionAwareControl protected override Size MeasureOverride(Size availableSize) { - base.MeasureOverride(availableSize); + var size = base.MeasureOverride(availableSize); if (_sourceGeometriesData.Count == 0) { return default; diff --git a/src/AtomUI.Core/Controls/Icon/IconProvider.cs b/src/AtomUI.Core/Controls/Icon/IconProvider.cs index 75573c4a7..8a5b9b0f7 100644 --- a/src/AtomUI.Core/Controls/Icon/IconProvider.cs +++ b/src/AtomUI.Core/Controls/Icon/IconProvider.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using Avalonia.Data; using Avalonia.Layout; using Avalonia.Markup.Xaml; using Avalonia.Media; @@ -23,7 +22,7 @@ public abstract class IconProvider : MarkupExtension public double Width { get; set; } = double.NaN; public double Height { get; set; } = double.NaN; - public IconAnimation Animation { get; set; } = IconAnimation.None; + public IconAnimation? Animation { get; set; } public IconProvider() { @@ -38,15 +37,39 @@ public abstract class IconProvider : MarkupExtension { Debug.Assert(Kind != null); var icon = GetIcon(Kind); - icon.SetCurrentValue(Icon.LoadingAnimationProperty, Animation); - - icon.SetValue(Icon.NormalFilledBrushProperty, NormalFilledColor, NormalFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); - icon.SetValue(Icon.ActiveFilledBrushProperty, ActiveFilledColor, ActiveFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); - icon.SetValue(Icon.SelectedFilledBrushProperty, SelectedFilledColor, SelectedFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); - icon.SetValue(Icon.DisabledFilledBrushProperty, DisabledFilledColor, DisabledFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); - icon.SetValue(Icon.PrimaryFilledBrushProperty, PrimaryFilledColor, PrimaryFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); - icon.SetValue(Icon.SecondaryFilledBrushProperty, SecondaryFilledColor, SecondaryFilledColor != null ? BindingPriority.LocalValue : BindingPriority.Template); + if (Animation != null) + { + icon.SetCurrentValue(Icon.LoadingAnimationProperty, Animation); + } + + if (NormalFilledColor != null) + { + icon.SetCurrentValue(Icon.NormalFilledBrushProperty, NormalFilledColor); + } + if (ActiveFilledColor != null) + { + icon.SetCurrentValue(Icon.ActiveFilledBrushProperty, ActiveFilledColor); + } + if (SelectedFilledColor != null) + { + icon.SetCurrentValue(Icon.SelectedFilledBrushProperty, SelectedFilledColor); + } + + if (DisabledFilledColor != null) + { + icon.SetCurrentValue(Icon.DisabledFilledBrushProperty, DisabledFilledColor); + } + + if (PrimaryFilledColor != null) + { + icon.SetCurrentValue(Icon.PrimaryFilledBrushProperty, PrimaryFilledColor); + } + if (SecondaryFilledColor != null) + { + icon.SetCurrentValue(Icon.SecondaryFilledBrushProperty, SecondaryFilledColor); + } + if (!double.IsNaN(Width)) { icon.SetCurrentValue(Layoutable.WidthProperty, Width); diff --git a/src/AtomUI.Desktop.Controls/ButtonSpinner/Themes/ButtonSpinnerHandle.axaml b/src/AtomUI.Desktop.Controls/ButtonSpinner/Themes/ButtonSpinnerHandle.axaml index 3270488a4..3118ce4ec 100644 --- a/src/AtomUI.Desktop.Controls/ButtonSpinner/Themes/ButtonSpinnerHandle.axaml +++ b/src/AtomUI.Desktop.Controls/ButtonSpinner/Themes/ButtonSpinnerHandle.axaml @@ -40,8 +40,8 @@ Value="{DynamicResource {x:Static atom:SharedTokenKey.ColorPrimaryActive}}" /> - - + diff --git a/src/AtomUI.Desktop.Controls/Tag/Themes/TagTheme.axaml b/src/AtomUI.Desktop.Controls/Tag/Themes/TagTheme.axaml index bc56f929d..7d027c8f8 100644 --- a/src/AtomUI.Desktop.Controls/Tag/Themes/TagTheme.axaml +++ b/src/AtomUI.Desktop.Controls/Tag/Themes/TagTheme.axaml @@ -17,7 +17,8 @@ + NormalFilledBrush="{TemplateBinding Foreground}" + IsVisible="{TemplateBinding Icon, Converter={x:Static ObjectConverters.IsNotNull}}"/>