From f84793b5c0a8b1c7d56a5338b4b9995f75f4a340 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sun, 28 Aug 2022 22:00:58 +0800 Subject: [PATCH] move extensions --- README.md | 9 ++- .../Image}/CompositionExtensions.cs | 2 +- .../Snap.Hutao/Control/Image/Gradient.cs | 1 - .../Snap.Hutao/Control/Image/MonoChrome.cs | 1 - .../AppActivationArgumentsExtensions.cs | 2 +- .../Windowing}/AppWindowExtensions.cs | 2 +- .../Snap.Hutao/Core/Windowing/Persistence.cs | 1 - .../Extension/ReflectionExtension.cs | 75 ------------------- .../Snap.Hutao/Extension/TupleExtensions.cs | 25 ------- src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs | 2 +- .../Snap.Hutao/Model/Binding/Achievement.cs | 9 +++ .../Snap.Hutao/View/Page/AchievementPage.xaml | 21 +++++- src/Snap.Hutao/Snap.Hutao/View/TitleView.xaml | 2 +- .../Snap.Hutao/View/TitleView.xaml.cs | 7 +- .../ViewModel/AchievementViewModel.cs | 35 +++++++++ 15 files changed, 79 insertions(+), 115 deletions(-) rename src/Snap.Hutao/Snap.Hutao/{Extension => Control/Image}/CompositionExtensions.cs (99%) rename src/Snap.Hutao/Snap.Hutao/{Extension => Core/LifeCycle}/AppActivationArgumentsExtensions.cs (96%) rename src/Snap.Hutao/Snap.Hutao/{Extension => Core/Windowing}/AppWindowExtensions.cs (95%) delete mode 100644 src/Snap.Hutao/Snap.Hutao/Extension/ReflectionExtension.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Extension/TupleExtensions.cs diff --git a/README.md b/README.md index 793d1519..7082826e 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,19 @@ # Snap.Hutao > 唷,找本堂主有何贵干呀? -![Alt](https://repobeats.axiom.co/api/embed/f029553fbe0c60689b1710476ec8512452163fc9.svg "Repobeats analytics image") +![Snap.Hutao](https://repobeats.axiom.co/api/embed/f029553fbe0c60689b1710476ec8512452163fc9.svg) -## 感谢以下项目或人员的帮助 +## Special Thanks +* [biuuu/genshin-wish-export](https://github.com/biuuu/genshin-wish-export) * [CommunityToolkit/dotnet](https://github.com/CommunityToolkit/dotnet) * [CommunityToolkit/WindowsCommunityToolkit](https://github.com/CommunityToolkit/WindowsCommunityToolkit) * [dotnet/efcore](https://github.com/dotnet/efcore) * [dotnet/runtime](https://github.com/dotnet/runtime) +* [HolographicHat/YaeAchievement](https://github.com/HolographicHat/YaeAchievement) * [DotNetAnalyzers/StyleCopAnalyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) * [microsoft/vs-threading](https://github.com/microsoft/vs-threading) * [microsoft/vs-validation](https://github.com/microsoft/vs-validation) * [microsoft/WindowsAppSDK](https://github.com/microsoft/WindowsAppSDK) -* [microsoft/microsoft-ui-xaml](https://github.com/microsoft/microsoft-ui-xaml) \ No newline at end of file +* [microsoft/microsoft-ui-xaml](https://github.com/microsoft/microsoft-ui-xaml) +* [YuehaiTeam/cocogoat](https://github.com/YuehaiTeam/cocogoat) \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/CompositionExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionExtensions.cs similarity index 99% rename from src/Snap.Hutao/Snap.Hutao/Extension/CompositionExtensions.cs rename to src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionExtensions.cs index 6f64d469..75789f9d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/CompositionExtensions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionExtensions.cs @@ -5,7 +5,7 @@ using Microsoft.Graphics.Canvas.Effects; using Microsoft.UI.Composition; using System.Numerics; -namespace Snap.Hutao.Extension; +namespace Snap.Hutao.Control.Image; /// /// 合成扩展 diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/Gradient.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/Gradient.cs index b46d0fc6..3d9b0d07 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/Gradient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/Gradient.cs @@ -4,7 +4,6 @@ using Microsoft.UI; using Microsoft.UI.Composition; using Microsoft.UI.Xaml.Media; -using Snap.Hutao.Extension; using System.Numerics; using Windows.Graphics.Imaging; using Windows.Storage; diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs index b7492dac..353d6902 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs @@ -6,7 +6,6 @@ using Microsoft.UI; using Microsoft.UI.Composition; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Media; -using Snap.Hutao.Extension; namespace Snap.Hutao.Control.Image; diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/AppActivationArgumentsExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs similarity index 96% rename from src/Snap.Hutao/Snap.Hutao/Extension/AppActivationArgumentsExtensions.cs rename to src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs index 7ec8f5ad..cc4e416d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/AppActivationArgumentsExtensions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivationArgumentsExtensions.cs @@ -4,7 +4,7 @@ using Microsoft.Windows.AppLifecycle; using Windows.ApplicationModel.Activation; -namespace Snap.Hutao.Extension; +namespace Snap.Hutao.Core.LifeCycle; /// /// 扩展 diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/AppWindowExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/AppWindowExtensions.cs similarity index 95% rename from src/Snap.Hutao/Snap.Hutao/Extension/AppWindowExtensions.cs rename to src/Snap.Hutao/Snap.Hutao/Core/Windowing/AppWindowExtensions.cs index 47c57bf5..82a753c7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/AppWindowExtensions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/AppWindowExtensions.cs @@ -4,7 +4,7 @@ using Microsoft.UI.Windowing; using Windows.Graphics; -namespace Snap.Hutao.Extension; +namespace Snap.Hutao.Core.Windowing; /// /// 扩展 diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/Persistence.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/Persistence.cs index 68655ec7..f5afe9d8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/Persistence.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/Persistence.cs @@ -4,7 +4,6 @@ using Microsoft.UI; using Microsoft.UI.Windowing; using Snap.Hutao.Core.Setting; -using Snap.Hutao.Extension; using System.Runtime.InteropServices; using Windows.Graphics; using Windows.Win32.Foundation; diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/ReflectionExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/ReflectionExtension.cs deleted file mode 100644 index b0584974..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Extension/ReflectionExtension.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using System.Reflection; - -namespace Snap.Hutao.Extension; - -/// -/// 反射扩展 -/// -internal static class ReflectionExtension -{ - /// - /// 在指定的成员中尝试获取标记的特性 - /// - /// 特性的类型 - /// 类型 - /// 获取的特性 - /// 是否获取成功 - public static bool TryGetAttribute(this Type type, [NotNullWhen(true)] out TAttribute? attribute) - where TAttribute : Attribute - { - attribute = type.GetCustomAttribute(); - return attribute != null; - } - - /// - /// 检测类型是否实现接口 - /// - /// 被实现的类型 - /// 被检测的类型/param> - /// 是否实现接口 - [SuppressMessage("", "SA1615")] - public static bool Implement(this Type type) - { - return type.IsAssignableTo(typeof(TInterface)); - } - - /// - /// 检查程序集是否标记了指定的特性 - /// - /// 特性类型 - /// 指定的程序集 - /// 是否标记了指定的特性 - public static bool HasAttribute(this Assembly assembly) - where TAttribute : Attribute - { - return assembly.GetCustomAttribute() is not null; - } - - /// - /// 对程序集中的所有类型进行指定的操作 - /// - /// 指定的程序集 - /// 进行的操作 - public static void ForEachType(this Assembly assembly, Action action) - { - foreach (Type type in assembly.GetTypes()) - { - action.Invoke(type); - } - } - - /// - /// 按字段名称设置值 - /// - /// 对象 - /// 字段名称 - /// 值 - public static void SetPrivateFieldValueByName(this object obj, string fieldName, object? value) - { - FieldInfo? fieldInfo = obj.GetType().GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic); - fieldInfo?.SetValue(obj, value); - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/TupleExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Extension/TupleExtensions.cs deleted file mode 100644 index ae8d4066..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Extension/TupleExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using System.Collections.Generic; - -namespace Snap.Hutao.Extension; - -/// -/// 元组扩展 -/// -public static class TupleExtensions -{ - /// - /// 将二项元组转化为一个单项的字典 - /// - /// 键类型 - /// 值类型 - /// 元组 - /// 仅包含一个项的字典 - public static IDictionary AsDictionary(this (TKey Key, TValue Value) tuple) - where TKey : notnull - { - return new Dictionary(1) { { tuple.Key, tuple.Value } }; - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs index abed7c92..91eb5612 100644 --- a/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/MainWindow.xaml.cs @@ -32,7 +32,7 @@ public sealed partial class MainWindow : Window this.messenger = messenger; InitializeComponent(); - windowManager = new WindowManager(this, TitleBarView.DragableArea); + windowManager = new WindowManager(this, TitleBarView.DragArea); initializaionCompletionSource.TrySetResult(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Achievement.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Achievement.cs index 81510aa1..9d7ffa72 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Achievement.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Achievement.cs @@ -57,7 +57,16 @@ public class Achievement : Observable { Entity.Status = Intrinsic.AchievementInfoStatus.ACHIEVEMENT_POINT_TAKEN; Entity.Time = DateTimeOffset.Now; + OnPropertyChanged(nameof(Time)); } } } + + /// + /// 格式化的时间 + /// + public string Time + { + get => entity.Time.ToString("yyyy-MM-dd HH:mm:ss"); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml index b0c0c757..84a183b6 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AchievementPage.xaml @@ -10,12 +10,14 @@ xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter" xmlns:shv="using:Snap.Hutao.ViewModel" + xmlns:cwuc="using:CommunityToolkit.WinUI.UI.Converters" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" d:DataContext="{d:DesignInstance shv:AchievementViewModel}"> + @@ -86,8 +88,11 @@ + + Label="优先未完成" + IsChecked="{Binding IsIncompletedItemsFirst}" + Command="{Binding SortIncompletedSwitchCommand}"> @@ -163,7 +168,7 @@ @@ -173,22 +178,32 @@ + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/TitleView.xaml b/src/Snap.Hutao/Snap.Hutao/View/TitleView.xaml index 0eb5e869..bec8b1a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/TitleView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/TitleView.xaml @@ -9,7 +9,7 @@ Height="44"> /// 获取可拖动区域 /// - public FrameworkElement DragableArea + public FrameworkElement DragArea { get => DragableGrid; } + + public string Title + { + get => $"胡桃 {Core.CoreEnvironment.Version}"; + } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs index 5e563157..85c571f7 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.WinUI.UI; using Microsoft.UI.Xaml.Controls; @@ -41,6 +42,8 @@ internal class AchievementViewModel IRecipient, IRecipient { + private static readonly SortDescription IncompletedItemsFirstSortDescription = new(nameof(Model.Binding.Achievement.IsChecked), SortDirection.Ascending); + private readonly IMetadataService metadataService; private readonly IAchievementService achievementService; private readonly IInfoBarService infoBarService; @@ -54,6 +57,7 @@ internal class AchievementViewModel private AchievementGoal? selectedAchievementGoal; private ObservableCollection? archives; private Model.Entity.AchievementArchive? selectedArchive; + private bool isIncompletedItemsFirst = true; /// /// 构造一个新的成就视图模型 @@ -85,6 +89,7 @@ internal class AchievementViewModel ImportUIAFFromFileCommand = asyncRelayCommandFactory.Create(ImportUIAFFromFileAsync); AddArchiveCommand = asyncRelayCommandFactory.Create(AddArchiveAsync); RemoveArchiveCommand = asyncRelayCommandFactory.Create(RemoveArchiveAsync); + SortIncompletedSwitchCommand = new RelayCommand(UpdateAchievementsSort); messenger.Register(this); messenger.Register(this); @@ -148,6 +153,15 @@ internal class AchievementViewModel } } + /// + /// 未完成优先 + /// + public bool IsIncompletedItemsFirst + { + get => isIncompletedItemsFirst; + set => SetProperty(ref isIncompletedItemsFirst, value); + } + /// /// 打开页面命令 /// @@ -173,6 +187,11 @@ internal class AchievementViewModel /// public ICommand ImportUIAFFromFileCommand { get; } + /// + /// 筛选未完成项开关命令 + /// + public ICommand SortIncompletedSwitchCommand { get; } + /// public void Receive(MainWindowClosedMessage message) { @@ -264,6 +283,7 @@ internal class AchievementViewModel Achievements = new(combined, true); UpdateAchievementFilter(SelectedAchievementGoal); + UpdateAchievementsSort(); } private async Task AddArchiveAsync() @@ -443,6 +463,21 @@ internal class AchievementViewModel return false; } + private void UpdateAchievementsSort() + { + if (Achievements != null) + { + if (IsIncompletedItemsFirst) + { + Achievements.SortDescriptions.Add(IncompletedItemsFirstSortDescription); + } + else + { + Achievements.SortDescriptions.Clear(); + } + } + } + private void UpdateAchievementFilter(AchievementGoal? goal) { if (Achievements != null)