diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 3c149bcf..794e650c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1382,6 +1382,9 @@ 祈愿记录 + + 预计下载大小:{0} + 我已阅读并同意 @@ -1440,10 +1443,10 @@ 图片资源包体 - 全部资源(节省 0% 磁盘空间占用) + 完整包体 - 部分资源(节省 13.5% 磁盘空间占用) + 精简包体 图片资源质量 @@ -1638,10 +1641,10 @@ 下载资源文件中,请稍候 - 高质量(节省 72.8% 磁盘空间占用) + 高质量 - 原图(节省 0% 磁盘空间占用) + 原图 请输入正确的邮箱 diff --git a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml index 330e1c98..783c552e 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml @@ -227,6 +227,8 @@ IsOn="{Binding StaticResourceOptions.UseTrimmedArchive, Mode=TwoWay}" OffContent="{shcm:ResourceString Name=ViewGuideStepStaticResourceSettingMinimumOff}" OnContent="{shcm:ResourceString Name=ViewGuideStepStaticResourceSettingMinimumOn}"/> + + (); + DataContext = this.ServiceProvider().GetRequiredService(); } } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs index b36f951a..9c875554 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs @@ -7,6 +7,8 @@ using Snap.Hutao.Core.Setting; using Snap.Hutao.Model; using Snap.Hutao.Service; using Snap.Hutao.Web.Hoyolab; +using Snap.Hutao.Web.Hutao; +using Snap.Hutao.Web.Hutao.Response; using System.Collections.ObjectModel; using System.Globalization; @@ -164,6 +166,19 @@ internal sealed partial class GuideViewModel : Abstraction.ViewModel set => SetProperty(ref downloadSummaries, value); } + protected override async ValueTask InitializeUIAsync() + { + HutaoInfrastructureClient hutaoInfrastructureClient = serviceProvider.GetRequiredService(); + HutaoResponse response = await hutaoInfrastructureClient.GetStaticSizeAsync().ConfigureAwait(false); + if (response.IsOk()) + { + await taskContext.SwitchToMainThreadAsync(); + StaticResourceOptions.SizeInformation = response.Data; + } + + return true; + } + [Command("NextOrCompleteCommand")] private void NextOrComplete() { diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResourceOptions.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResourceOptions.cs index 7be8b274..5c6d8822 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResourceOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/StaticResourceOptions.cs @@ -1,34 +1,34 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using CommunityToolkit.Common; +using CommunityToolkit.Mvvm.ComponentModel; using Snap.Hutao.Core.Setting; using Snap.Hutao.Model; +using Snap.Hutao.Web.Hutao; namespace Snap.Hutao.ViewModel.Guide; [Injection(InjectAs.Singleton)] -internal sealed class StaticResourceOptions +internal sealed class StaticResourceOptions : ObservableObject { private readonly List> imageQualities = CollectionsNameValue.FromEnum(q => q.GetLocalizedDescription()); private NameValue? imageQuality; - - public StaticResourceOptions() - { - ImageQuality = ImageQualities.First(q => q.Value == UnsafeLocalSetting.Get(SettingKeys.StaticResourceImageQuality, StaticResourceQuality.Raw)); - } + private string? sizeInformationText; + private StaticResourceSizeInformation? sizeInformation; public List> ImageQualities { get => imageQualities; } public NameValue? ImageQuality { - get => imageQuality; + get => imageQuality ??= ImageQualities.First(q => q.Value == UnsafeLocalSetting.Get(SettingKeys.StaticResourceImageQuality, StaticResourceQuality.Raw)); set { - if (value is not null) + if (SetProperty(ref imageQuality, value) && value is not null) { - imageQuality = value; UnsafeLocalSetting.Set(SettingKeys.StaticResourceImageQuality, value.Value); + UpdateSizeInformationText(); } } } @@ -36,6 +36,39 @@ internal sealed class StaticResourceOptions public bool UseTrimmedArchive { get => LocalSetting.Get(SettingKeys.StaticResourceUseTrimmedArchive, false); - set => LocalSetting.Set(SettingKeys.StaticResourceUseTrimmedArchive, value); + set + { + LocalSetting.Set(SettingKeys.StaticResourceUseTrimmedArchive, value); + UpdateSizeInformationText(); + } + } + + public StaticResourceSizeInformation? SizeInformation + { + get => sizeInformation; + set + { + sizeInformation = value; + UpdateSizeInformationText(); + } + } + + public string? SizeInformationText { get => sizeInformationText; set => SetProperty(ref sizeInformationText, value); } + + private void UpdateSizeInformationText() + { + if (SizeInformation is not null) + { + long result = (ImageQuality?.Value, UseTrimmedArchive) switch + { + (StaticResourceQuality.Raw, false) => SizeInformation.RawFull, + (StaticResourceQuality.Raw, true) => SizeInformation.RawMinimum, + (StaticResourceQuality.High, false) => SizeInformation.HighFull, + (StaticResourceQuality.High, true) => SizeInformation.HighMinimum, + _ => 0, + }; + + SizeInformationText = SH.FormatViewGuideStaticResourceDownloadSize(Converters.ToFileSizeString(result)); + } } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs index 54228d8f..de14e0c9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HutaoInfrastructureClient.cs @@ -17,6 +17,16 @@ internal sealed partial class HutaoInfrastructureClient private readonly ILogger logger; private readonly HttpClient httpClient; + public async ValueTask> GetStaticSizeAsync(CancellationToken token = default) + { + HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() + .SetRequestUri(HutaoEndpoints.StaticSize) + .Get(); + + HutaoResponse? resp = await builder.TryCatchSendAsync>(httpClient, logger, token).ConfigureAwait(false); + return Web.Response.Response.DefaultIfNull(resp); + } + public async ValueTask> GetIPInformationAsync(CancellationToken token = default) { HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create() diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/StaticResourceSizeInformation.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/StaticResourceSizeInformation.cs new file mode 100644 index 00000000..774d7854 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/StaticResourceSizeInformation.cs @@ -0,0 +1,19 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Web.Hutao; + +internal sealed partial class StaticResourceSizeInformation +{ + [JsonPropertyName("raw_full")] + public long RawFull { get; set; } + + [JsonPropertyName("raw_minimum")] + public long RawMinimum { get; set; } + + [JsonPropertyName("tiny_full")] + public long HighFull { get; set; } + + [JsonPropertyName("tiny_minimum")] + public long HighMinimum { get; set; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs index 2d1847b3..ab520f6b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/HutaoEndpoints.cs @@ -270,6 +270,8 @@ internal static class HutaoEndpoints { return $"{ApiSnapGenshinStaticZip}/{fileName}.zip"; } + + public const string StaticSize = $"{ApiSnapGenshin}/static/size"; #endregion #region Wallpaper