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