diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index 1dc3d7d2..3840165d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -74,11 +74,11 @@ internal sealed partial class AppOptions : DbStoreOptions set => SetOption(ref currentCulture, SettingEntry.Culture, value, value => value.Name); } - public List Regions { get; } = KnownRegions.Get(); + public List> Regions { get; } = KnownRegions.Get(); public Region Region { - get => GetOption(ref region, SettingEntry.Region, v => Region.FromRegion(v), Regions[0]).Value; + get => GetOption(ref region, SettingEntry.Region, v => Region.FromRegion(v), Regions[0].Value).Value; set => SetOption(ref region, SettingEntry.Region, value, value => value.ToStringOrEmpty()); } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs b/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs index a67a5230..a7f61efe 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/KnownRegions.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Model; using Snap.Hutao.Web.Hoyolab; namespace Snap.Hutao.Service; @@ -14,16 +15,21 @@ internal static class KnownRegions private static readonly Region RegionOSASIA = new("os_asia"); private static readonly Region RegionOSCHT = new("os_cht"); - public static List Get() + public static List> Get() { return [ - RegionCNGF01, - RegionCNQD01, - RegionOSUSA, - RegionOSEURO, - RegionOSASIA, - RegionOSCHT, + ToNameValue(RegionCNGF01), + ToNameValue(RegionCNQD01), + ToNameValue(RegionOSUSA), + ToNameValue(RegionOSEURO), + ToNameValue(RegionOSASIA), + ToNameValue(RegionOSCHT), ]; } + + private static NameValue ToNameValue(in Region region) + { + return new(region.DisplayName, region); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml index bd9d21bf..57e80abf 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml @@ -311,7 +311,7 @@ HeaderIcon="{shcm:FontIcon Glyph=}"> diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs index 90ebb10e..2a4996f0 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Setting/SettingViewModel.cs @@ -62,7 +62,7 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel private NameValue? selectedBackdropType; private NameValue? selectedCulture; - private Region? selectedRegion; + private NameValue? selectedRegion; private IPInformation? ipInformation; private FolderViewModel? cacheFolderView; private FolderViewModel? dataFolderView; @@ -106,9 +106,9 @@ internal sealed partial class SettingViewModel : Abstraction.ViewModel } } - public Region? SelectedRegion + public NameValue? SelectedRegion { - get => selectedRegion ??= AppOptions.Region; + get => selectedRegion ??= AppOptions.Regions.Single(t => t.Value.Value == AppOptions.Region.Value); set { if (SetProperty(ref selectedRegion, value) && value is not null) diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Region.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Region.cs index 03cf7acd..b7dba2a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Region.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Region.cs @@ -1,10 +1,17 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. + namespace Snap.Hutao.Web.Hoyolab; internal readonly partial struct Region { + public readonly string DisplayName; + + public readonly string Value; + + public readonly bool IsOversea; + public Region(string value, bool? isOversea = default) { Must.Argument(HoyolabRegex.RegionRegex().IsMatch(value), SH.WebHoyolabInvalidRegion); @@ -13,12 +20,6 @@ internal readonly partial struct Region IsOversea = isOversea ?? EvaluateIsOversea(value.AsSpan()[0]); } - public readonly string DisplayName { get; } - - public readonly string Value { get; } - - public readonly bool IsOversea { get; } - public static implicit operator Region(string value) { return FromRegion(value);