From b5579aef6e3419b33f77137a0a1f8d5504e80fd1 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Fri, 22 Sep 2023 16:47:08 +0800 Subject: [PATCH] static resouce download refactor and ui/ux improvement --- src/Snap.Hutao/Snap.Hutao/App.xaml | 48 +- .../Control/Markup/Int32Extension.cs | 3 +- .../Snap.Hutao/Core/LifeCycle/Activation.cs | 5 + .../Snap.Hutao/Core/Setting/StaticResource.cs | 84 --- src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs | 4 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 7 - .../View/Control/BaseValueSlider.xaml | 20 +- .../View/Control/BottomTextControl.xaml | 9 +- .../View/Control/BottomTextControl.xaml.cs | 4 +- .../View/Control/BottomTextSmallControl.xaml | 23 - .../Control/BottomTextSmallControl.xaml.cs | 19 - .../View/Control/DescParamComboBox.xaml | 35 +- .../View/Control/HutaoStatisticsCard.xaml | 129 +++-- .../Snap.Hutao/View/Control/ItemIcon.xaml | 3 +- .../Control/LaunchGameResourceExpander.xaml | 93 ++-- .../Snap.Hutao/View/Control/SkillPivot.xaml | 29 +- .../View/Control/StatisticsCard.xaml | 477 ++++++++---------- .../Dialog/CultivatePromotionDeltaDialog.xaml | 277 +++++----- .../Dialog/GachaLogRefreshProgressDialog.xaml | 13 +- .../CoreWebView2EnvironmentExtension.cs | 33 -- .../Snap.Hutao/View/Guide/GuideView.xaml | 74 ++- .../Snap.Hutao/View/Guide/GuideView.xaml.cs | 1 - .../ViewModel/Guide/DownloadSummary.cs | 8 +- .../ViewModel/Guide/GuideViewModel.cs | 55 +- .../ViewModel/Guide/StaticResource.cs | 124 +++++ .../Snap.Hutao/ViewModel/SettingViewModel.cs | 2 +- 26 files changed, 734 insertions(+), 845 deletions(-) delete mode 100644 src/Snap.Hutao/Snap.Hutao/Core/Setting/StaticResource.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/BottomTextSmallControl.xaml delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/BottomTextSmallControl.xaml.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Extension/CoreWebView2EnvironmentExtension.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml b/src/Snap.Hutao/Snap.Hutao/App.xaml index 4b364433..98d24da7 100644 --- a/src/Snap.Hutao/Snap.Hutao/App.xaml +++ b/src/Snap.Hutao/Snap.Hutao/App.xaml @@ -2,8 +2,8 @@ x:Class="Snap.Hutao.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:cwc="using:CommunityToolkit.WinUI.Converters" - xmlns:cwcw="using:CommunityToolkit.WinUI.Controls" + xmlns:cwcont="using:CommunityToolkit.WinUI.Controls" + xmlns:cwconv="using:CommunityToolkit.WinUI.Converters" xmlns:muxc="using:Microsoft.UI.Xaml.Controls" xmlns:shci="using:Snap.Hutao.Control.Image" xmlns:shmmc="using:Snap.Hutao.Model.Metadata.Converter" @@ -120,9 +120,9 @@ - - - + + + @@ -178,11 +178,25 @@ + + + + + + + + + - - - - - - - - - + Style="{StaticResource DefaultPivotStyle}"/> + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml index 43ff0e45..692de146 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml @@ -12,6 +12,7 @@ xmlns:shcp="using:Snap.Hutao.Control.Panel" xmlns:shvcont="using:Snap.Hutao.View.Control" xmlns:shvconv="using:Snap.Hutao.View.Converter" + xmlns:shvcp="using:Snap.Hutao.View.Card.Primitive" xmlns:shvg="using:Snap.Hutao.ViewModel.GachaLog" d:DataContext="{d:DesignInstance shvg:TypedWishSummary}" mc:Ignorable="d"> @@ -84,287 +85,235 @@ TrueValue="{ThemeResource CardBackgroundFillColorDefaultBrush}"/> - - + - + - + - - - - - - - - - - 0,0,0,1 - - - + + + + + + + + + + 0,0,0,1 + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - - + MinHeight="32" + Description="{Binding LastPurplePull}" + Header="{shcm:ResourceString Name=ViewControlStatisticsCardToLastPurpleText}" + Maximum="{Binding GuaranteePurpleThreshold}" + ProgressForeground="{StaticResource PurpleBrush}" + TextForeground="{StaticResource PurpleBrush}" + Value="{Binding LastPurplePull}"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml index e017c747..7d0de834 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/CultivatePromotionDeltaDialog.xaml @@ -16,159 +16,162 @@ 180 1200 + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml index 72bdb8e6..82f8417c 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Dialog/GachaLogRefreshProgressDialog.xaml @@ -27,15 +27,8 @@ - - - - - - + ItemsPanel="{StaticResource UniformGridColumns5Spacing4Template}" + ItemsSource="{x:Bind Status.Items, Mode=OneWay}"/> + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Extension/CoreWebView2EnvironmentExtension.cs b/src/Snap.Hutao/Snap.Hutao/View/Extension/CoreWebView2EnvironmentExtension.cs deleted file mode 100644 index caea081b..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Extension/CoreWebView2EnvironmentExtension.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Microsoft.Web.WebView2.Core; -using System.Diagnostics; - -namespace Snap.Hutao.View.Extension; - -/// -/// 扩展 -/// -[HighQuality] -internal static class CoreWebView2EnvironmentExtension -{ - /// - /// 退出 - /// - /// 环境 - public static void Exit(this CoreWebView2Environment environment) - { - // 暂不支持 - IReadOnlyList processInfos = environment.GetProcessInfos(); - - foreach (CoreWebView2ProcessInfo processInfo in processInfos) - { - Process p = Process.GetProcessById(processInfo.ProcessId); - if (p.ProcessName == "msedgewebview2.exe") - { - p.Kill(); - } - } - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml index 745358f3..191332ae 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml @@ -16,6 +16,34 @@ + + + + + + + + + + + + + + + + + + + @@ -26,17 +54,10 @@ - - - - - - - - + SelectionMode="Single"/> @@ -157,37 +178,10 @@ - - - - - - - - - - - - - - - - - - - - + ItemContainerTransitions="{StaticResource ListViewLikeThemeTransitions}" + ItemTemplate="{StaticResource DownloadSummaryTemplate}" + ItemsPanel="{StaticResource WrapPanelSpacing0Template}" + ItemsSource="{Binding DownloadSummaries}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs index 4996d50f..fc098367 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs @@ -15,6 +15,5 @@ internal sealed partial class GuideView : UserControl { InitializeComponent(); DataContext = Ioc.Default.GetRequiredService(); - _ = 1; } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/DownloadSummary.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/DownloadSummary.cs index 25ec43a2..26ff4e8a 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/DownloadSummary.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/DownloadSummary.cs @@ -121,7 +121,13 @@ internal sealed class DownloadSummary : ObservableObject foreach (ZipArchiveEntry entry in archive.Entries) { string destPath = imageCacheFilePathOperation.GetFileFromCategoryAndName(fileName, entry.FullName); - entry.ExtractToFile(destPath, true); + try + { + entry.ExtractToFile(destPath, true); + } + catch + { + } } } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs index 6f993bdd..3832b069 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs @@ -160,7 +160,14 @@ internal sealed partial class GuideViewModel : Abstraction.ViewModel private async ValueTask DownloadStaticResourceAsync() { - IEnumerable downloadSummaries = GenerateStaticResourceDownloadTasks(); + HashSet downloadSummaries = new(); + + HashSet categories = StaticResource.GetUnfulfilledCategorySet(); + + foreach (string category in categories) + { + downloadSummaries.Add(new(serviceProvider, category)); + } DownloadSummaries = downloadSummaries.ToObservableCollection(); @@ -172,53 +179,9 @@ internal sealed partial class GuideViewModel : Abstraction.ViewModel } }).ConfigureAwait(false); - StaticResource.FulfillAllContracts(); + StaticResource.FulfillAll(); LocalSetting.Set(SettingKeys.Major1Minor7Revision0GuideState, (uint)GuideState.Completed); AppInstance.Restart(string.Empty); } - - private IEnumerable GenerateStaticResourceDownloadTasks() - { - Dictionary downloadSummaries = new(); - - if (StaticResource.IsContractUnfulfilled(StaticResource.V1Contract)) - { - downloadSummaries.TryAdd("Bg", new(serviceProvider, "Bg")); - downloadSummaries.TryAdd("AvatarIcon", new(serviceProvider, "AvatarIcon")); - downloadSummaries.TryAdd("GachaAvatarIcon", new(serviceProvider, "GachaAvatarIcon")); - downloadSummaries.TryAdd("GachaAvatarImg", new(serviceProvider, "GachaAvatarImg")); - downloadSummaries.TryAdd("EquipIcon", new(serviceProvider, "EquipIcon")); - downloadSummaries.TryAdd("GachaEquipIcon", new(serviceProvider, "GachaEquipIcon")); - downloadSummaries.TryAdd("NameCardPic", new(serviceProvider, "NameCardPic")); - downloadSummaries.TryAdd("Skill", new(serviceProvider, "Skill")); - downloadSummaries.TryAdd("Talent", new(serviceProvider, "Talent")); - } - - if (StaticResource.IsContractUnfulfilled(StaticResource.V2Contract)) - { - downloadSummaries.TryAdd("AchievementIcon", new(serviceProvider, "AchievementIcon")); - downloadSummaries.TryAdd("ItemIcon", new(serviceProvider, "ItemIcon")); - downloadSummaries.TryAdd("IconElement", new(serviceProvider, "IconElement")); - downloadSummaries.TryAdd("RelicIcon", new(serviceProvider, "RelicIcon")); - } - - if (StaticResource.IsContractUnfulfilled(StaticResource.V3Contract)) - { - downloadSummaries.TryAdd("Skill", new(serviceProvider, "Skill")); - downloadSummaries.TryAdd("Talent", new(serviceProvider, "Talent")); - } - - if (StaticResource.IsContractUnfulfilled(StaticResource.V4Contract)) - { - downloadSummaries.TryAdd("AvatarIcon", new(serviceProvider, "AvatarIcon")); - } - - if (StaticResource.IsContractUnfulfilled(StaticResource.V5Contract)) - { - downloadSummaries.TryAdd("MonsterIcon", new(serviceProvider, "MonsterIcon")); - } - - return downloadSummaries.Select(x => x.Value); - } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs new file mode 100644 index 00000000..cca61c94 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResource.cs @@ -0,0 +1,124 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core.Setting; +using Windows.Storage; + +namespace Snap.Hutao.ViewModel.Guide; + +/// +/// 静态资源 +/// +[HighQuality] +internal static class StaticResource +{ + private const string ContractMap = "StaticResourceContractMap"; + + private static readonly ApplicationDataCompositeValue DefaultResourceVersionMap = new() + { + { "AchievementIcon", 0 }, + { "AvatarCard", 0 }, + { "AvatarIcon", 0 }, + { "Bg", 0 }, + { "ChapterIcon", 0 }, + { "CodexMonster", 0 }, + { "Costume", 0 }, + { "EmotionIcon", 0 }, + { "EquipIcon", 0 }, + { "GachaAvatarIcon", 0 }, + { "GachaAvatarImg", 0 }, + { "GachaEquipIcon", 0 }, + { "GcgCharAvatarIcon", 0 }, + { "IconElement", 0 }, + { "ItemIcon", 0 }, + { "LoadingPic", 0 }, + { "MonsterIcon", 0 }, + { "MonsterSmallIcon", 0 }, + { "NameCardIcon", 0 }, + { "NameCardPic", 0 }, + { "NameCardPicAlpha", 0 }, + { "Property", 0 }, + { "RelicIcon", 0 }, + { "Skill", 0 }, + { "Talent", 0 }, + }; + + private static readonly ApplicationDataCompositeValue LatestResourceVersionMap = new() + { + { "AchievementIcon", 1 }, + { "AvatarCard", 0 }, + { "AvatarIcon", 1 }, + { "Bg", 1 }, + { "ChapterIcon", 0 }, + { "CodexMonster", 0 }, + { "Costume", 0 }, + { "EmotionIcon", 0 }, + { "EquipIcon", 1 }, + { "GachaAvatarIcon", 1 }, + { "GachaAvatarImg", 1 }, + { "GachaEquipIcon", 1 }, + { "GcgCharAvatarIcon", 0 }, + { "IconElement", 1 }, + { "ItemIcon", 1 }, + { "LoadingPic", 0 }, + { "MonsterIcon", 1 }, + { "MonsterSmallIcon", 0 }, + { "NameCardIcon", 0 }, + { "NameCardPic", 1 }, + { "NameCardPicAlpha", 0 }, + { "Property", 1 }, + { "RelicIcon", 1 }, + { "Skill", 1 }, + { "Talent", 1 }, + }; + + public static void FulfillAll() + { + LocalSetting.Set(ContractMap, LatestResourceVersionMap); + } + + public static void FailAll() + { + LocalSetting.Set(ContractMap, DefaultResourceVersionMap); + } + + [Obsolete] + public static bool IsContractUnfulfilled(string contractKey) + { + return !LocalSetting.Get(contractKey, false); + } + + public static bool IsAnyUnfulfilledCategoryPresent() + { + ApplicationDataCompositeValue map = LocalSetting.Get(ContractMap, DefaultResourceVersionMap); + if (map.Count < LatestResourceVersionMap.Count) + { + return true; + } + + foreach ((string key, object value) in map) + { + if ((int)value < (int)LatestResourceVersionMap[key]) + { + return true; + } + } + + return false; + } + + public static HashSet GetUnfulfilledCategorySet() + { + HashSet result = new(); + ApplicationDataCompositeValue map = LocalSetting.Get(ContractMap, DefaultResourceVersionMap); + foreach ((string key, object value) in LatestResourceVersionMap) + { + if ((int)value > (int)map[key]) + { + result.Add(key); + } + } + + return result; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index a937c793..1968646e 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -106,7 +106,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel [Command("ResetStaticResourceCommand")] private static void ResetStaticResource() { - StaticResource.FailAllContracts(); + StaticResource.FailAll(); LocalSetting.Set(SettingKeys.Major1Minor7Revision0GuideState, (uint)GuideState.StaticResourceBegin); AppInstance.Restart(string.Empty); }