From dbae6edf403b26ec62a134cfc00f14c878e8675e Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Thu, 26 Dec 2024 00:29:16 +0800 Subject: [PATCH 1/5] feat: extract icon resources. --- demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs | 2 +- src/Semi.Avalonia/{Themes/Shared => Icons}/Icon.axaml | 0 src/Semi.Avalonia/{Themes/Shared => Icons}/IconPatch.axaml | 0 src/Semi.Avalonia/Icons/_index.axaml | 6 ++++++ src/Semi.Avalonia/Themes/Index.axaml | 3 ++- src/Semi.Avalonia/Themes/SemiTheme.axaml | 1 + src/Semi.Avalonia/Themes/Shared/_index.axaml | 2 -- 7 files changed, 10 insertions(+), 4 deletions(-) rename src/Semi.Avalonia/{Themes/Shared => Icons}/Icon.axaml (100%) rename src/Semi.Avalonia/{Themes/Shared => Icons}/IconPatch.axaml (100%) create mode 100644 src/Semi.Avalonia/Icons/_index.axaml diff --git a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs index 09e8fc8..d58a546 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs @@ -12,7 +12,7 @@ namespace Semi.Avalonia.Demo.ViewModels; public partial class IconDemoViewModel : ObservableObject { private readonly IResourceDictionary? _resources = - AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Themes/Shared/Icon.axaml")) as ResourceDictionary; + AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Icons/Icon.axaml")) as ResourceDictionary; private readonly Dictionary _filledIcons = new(); private readonly Dictionary _strokedIcons = new(); diff --git a/src/Semi.Avalonia/Themes/Shared/Icon.axaml b/src/Semi.Avalonia/Icons/Icon.axaml similarity index 100% rename from src/Semi.Avalonia/Themes/Shared/Icon.axaml rename to src/Semi.Avalonia/Icons/Icon.axaml diff --git a/src/Semi.Avalonia/Themes/Shared/IconPatch.axaml b/src/Semi.Avalonia/Icons/IconPatch.axaml similarity index 100% rename from src/Semi.Avalonia/Themes/Shared/IconPatch.axaml rename to src/Semi.Avalonia/Icons/IconPatch.axaml diff --git a/src/Semi.Avalonia/Icons/_index.axaml b/src/Semi.Avalonia/Icons/_index.axaml new file mode 100644 index 0000000..0158800 --- /dev/null +++ b/src/Semi.Avalonia/Icons/_index.axaml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Semi.Avalonia/Themes/Index.axaml b/src/Semi.Avalonia/Themes/Index.axaml index 116b7b5..dc9ff25 100644 --- a/src/Semi.Avalonia/Themes/Index.axaml +++ b/src/Semi.Avalonia/Themes/Index.axaml @@ -10,7 +10,8 @@ + - + \ No newline at end of file diff --git a/src/Semi.Avalonia/Themes/SemiTheme.axaml b/src/Semi.Avalonia/Themes/SemiTheme.axaml index 5281aa0..7b03e4d 100644 --- a/src/Semi.Avalonia/Themes/SemiTheme.axaml +++ b/src/Semi.Avalonia/Themes/SemiTheme.axaml @@ -15,6 +15,7 @@ + diff --git a/src/Semi.Avalonia/Themes/Shared/_index.axaml b/src/Semi.Avalonia/Themes/Shared/_index.axaml index 94e39c2..7d03eff 100644 --- a/src/Semi.Avalonia/Themes/Shared/_index.axaml +++ b/src/Semi.Avalonia/Themes/Shared/_index.axaml @@ -1,8 +1,6 @@  - - From c302da6e4b1bf72d22f5db94dfadf6d486055e4b Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Thu, 26 Dec 2024 00:35:04 +0800 Subject: [PATCH 2/5] fix: resolve intellisense issue. --- src/Semi.Avalonia/Icons/IconPatch.axaml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Semi.Avalonia/Icons/IconPatch.axaml b/src/Semi.Avalonia/Icons/IconPatch.axaml index e20405c..f0b5a49 100644 --- a/src/Semi.Avalonia/Icons/IconPatch.axaml +++ b/src/Semi.Avalonia/Icons/IconPatch.axaml @@ -1,6 +1,14 @@ - - - - + + m17.55 15.66-4.8 5.48a1 1 0 0 1-1.5 0l-4.8-5.48A1 1 0 0 1 7.2 14h9.6a1 1 0 0 1 .75 1.66Z + + + m6.45 8.34 4.8-5.48a1 1 0 0 1 1.5 0l4.8 5.48A1 1 0 0 1 16.8 10H7.2a1 1 0 0 1-.75-1.66Z + + + M5 12.5c0-.83.67-1.5 1.5-1.5h11a1.5 1.5 0 0 1 0 3h-11A1.5 1.5 0 0 1 5 12.5Z + + + M17.41 7.3c.66.51.78 1.45.28 2.11l-6.5 8.5a1.5 1.5 0 0 1-2.37.01l-3.5-4.5a1.5 1.5 0 1 1 2.36-1.84L10 14.54l5.32-6.95a1.5 1.5 0 0 1 2.1-.28Z + \ No newline at end of file From 9b4d6967a511ac937538198adc5586d001b6dfc7 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Thu, 26 Dec 2024 02:35:39 +0800 Subject: [PATCH 3/5] fix: resolve icon AOT issue. --- .../ViewModels/IconDemoViewModel.cs | 36 ++++++++++--------- src/Semi.Avalonia/Icons/_index.axaml | 2 +- src/Semi.Avalonia/Icons/_index.axaml.cs | 5 +++ 3 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 src/Semi.Avalonia/Icons/_index.axaml.cs diff --git a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs index d58a546..2d3aa5b 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Avalonia.Media; using CommunityToolkit.Mvvm.ComponentModel; @@ -11,8 +9,7 @@ namespace Semi.Avalonia.Demo.ViewModels; public partial class IconDemoViewModel : ObservableObject { - private readonly IResourceDictionary? _resources = - AvaloniaXamlLoader.Load(new Uri("avares://Semi.Avalonia/Icons/Icon.axaml")) as ResourceDictionary; + private readonly IResourceDictionary? _resources = new Icons(); private readonly Dictionary _filledIcons = new(); private readonly Dictionary _strokedIcons = new(); @@ -26,22 +23,27 @@ public partial class IconDemoViewModel : ObservableObject { if (_resources is null) return; - foreach (var key in _resources.Keys) + foreach (var provider in _resources.MergedDictionaries) { - if (_resources[key] is not Geometry geometry) continue; - var icon = new IconItem { ResourceKey = key.ToString(), Geometry = geometry }; - - if (key.ToString().EndsWith("Stroked")) + var dic = provider as ResourceDictionary; + if (dic?.Keys is null) continue; + foreach (var key in dic.Keys) { - _strokedIcons[key.ToString()] = icon; - } - else - { - _filledIcons[key.ToString()] = icon; - } + if (dic[key] is not Geometry geometry) continue; + var icon = new IconItem { ResourceKey = key.ToString(), Geometry = geometry }; - OnSearchTextChanged(string.Empty); + if (key.ToString().EndsWith("Stroked")) + { + _strokedIcons[key.ToString()] = icon; + } + else + { + _filledIcons[key.ToString()] = icon; + } + } } + + OnSearchTextChanged(string.Empty); } partial void OnSearchTextChanged(string? value) diff --git a/src/Semi.Avalonia/Icons/_index.axaml b/src/Semi.Avalonia/Icons/_index.axaml index 0158800..48d4869 100644 --- a/src/Semi.Avalonia/Icons/_index.axaml +++ b/src/Semi.Avalonia/Icons/_index.axaml @@ -1,4 +1,4 @@ - + diff --git a/src/Semi.Avalonia/Icons/_index.axaml.cs b/src/Semi.Avalonia/Icons/_index.axaml.cs new file mode 100644 index 0000000..2a3539c --- /dev/null +++ b/src/Semi.Avalonia/Icons/_index.axaml.cs @@ -0,0 +1,5 @@ +using Avalonia.Controls; + +namespace Semi.Avalonia; + +public class Icons : ResourceDictionary; \ No newline at end of file From d60b32adc6295ddbbba612bbf4e31002e9438f78 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Thu, 26 Dec 2024 15:06:57 +0800 Subject: [PATCH 4/5] feat: enhance search. --- .../ViewModels/IconDemoViewModel.cs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs index 2d3aa5b..e72cd45 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs @@ -25,21 +25,21 @@ public partial class IconDemoViewModel : ObservableObject foreach (var provider in _resources.MergedDictionaries) { - var dic = provider as ResourceDictionary; - if (dic?.Keys is null) continue; + if (provider is not ResourceDictionary dic) continue; + foreach (var key in dic.Keys) { if (dic[key] is not Geometry geometry) continue; - var icon = new IconItem { ResourceKey = key.ToString(), Geometry = geometry }; + var icon = new IconItem + { + ResourceKey = key.ToString(), + Geometry = geometry + }; if (key.ToString().EndsWith("Stroked")) - { - _strokedIcons[key.ToString()] = icon; - } + _strokedIcons[key.ToString().ToLowerInvariant()] = icon; else - { - _filledIcons[key.ToString()] = icon; - } + _filledIcons[key.ToString().ToLowerInvariant()] = icon; } } @@ -51,16 +51,15 @@ public partial class IconDemoViewModel : ObservableObject var search = value?.ToLowerInvariant() ?? string.Empty; FilteredFilledIcons.Clear(); - foreach (var icon in _filledIcons.Values.Where(i => i.ResourceKey?.ToLowerInvariant().Contains(search) == true)) + foreach (var key in _filledIcons.Keys.Where(i => i.Contains(search))) { - FilteredFilledIcons.Add(icon); + FilteredFilledIcons.Add(_filledIcons[key]); } FilteredStrokedIcons.Clear(); - foreach (var icon in - _strokedIcons.Values.Where(i => i.ResourceKey?.ToLowerInvariant().Contains(search) == true)) + foreach (var key in _strokedIcons.Keys.Where(i => i.Contains(search))) { - FilteredStrokedIcons.Add(icon); + FilteredStrokedIcons.Add(_strokedIcons[key]); } } } From 9ac71cf726eeb65552244276731fcac67558cae0 Mon Sep 17 00:00:00 2001 From: rabbitism Date: Thu, 26 Dec 2024 15:41:17 +0800 Subject: [PATCH 5/5] feat: reduce lookup. --- demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs index e72cd45..75bc090 100644 --- a/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs +++ b/demo/Semi.Avalonia.Demo/ViewModels/IconDemoViewModel.cs @@ -51,15 +51,15 @@ public partial class IconDemoViewModel : ObservableObject var search = value?.ToLowerInvariant() ?? string.Empty; FilteredFilledIcons.Clear(); - foreach (var key in _filledIcons.Keys.Where(i => i.Contains(search))) + foreach (var pair in _filledIcons.Where(i => i.Key.Contains(search))) { - FilteredFilledIcons.Add(_filledIcons[key]); + FilteredFilledIcons.Add(pair.Value); } FilteredStrokedIcons.Clear(); - foreach (var key in _strokedIcons.Keys.Where(i => i.Contains(search))) + foreach (var pair in _strokedIcons.Where(i => i.Key.Contains(search))) { - FilteredStrokedIcons.Add(_strokedIcons[key]); + FilteredStrokedIcons.Add(pair.Value); } } }