diff --git a/src/Snap.Hutao/Snap.Hutao/Model/NameDescriptionValue.cs b/src/Snap.Hutao/Snap.Hutao/Model/NameDescriptionValue.cs new file mode 100644 index 00000000..b575125c --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/NameDescriptionValue.cs @@ -0,0 +1,20 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Model; + +internal sealed class NameDescriptionValue +{ + public NameDescriptionValue(string name, string description, T value) + { + Name = name; + Description = description; + Value = value; + } + + public string Name { get; } + + public string Description { get; } + + public T Value { get; } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest index e957b1f6..55b7dea7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest @@ -13,7 +13,7 @@ + Version="1.10.5.0" /> Snap Hutao diff --git a/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest index fdc5d04c..a07f85a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.development.appxmanifest @@ -13,7 +13,7 @@ + Version="1.10.5.0" /> Snap Hutao Dev diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index cdc1bd81..f941a9cd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -147,6 +147,12 @@ 未找到结果 + + 删除 + + + 选择全部 + 无效的 Uri @@ -162,12 +168,6 @@ 列表 - - 删除 - - - 选择全部 - 数据库已损坏:{0} @@ -2435,6 +2435,12 @@ 解锁帧率限制 + + 更改解锁帧率的工作方式 + + + 解锁方式 + 禁用 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs index ce2b1c19..a2020f8f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/LaunchOptions.cs @@ -39,7 +39,7 @@ internal sealed class LaunchOptions : DbStoreOptions private int? screenHeight; private bool? isScreenHeightEnabled; private bool? unlockFps; - private GameFpsUnlockerKind? unlockerKind; + private NameDescriptionValue? unlockerKind; private int? targetFps; private NameValue? monitor; private bool? isMonitorEnabled; @@ -169,10 +169,32 @@ internal sealed class LaunchOptions : DbStoreOptions set => SetOption(ref unlockFps, SettingEntry.LaunchUnlockFps, value); } - public GameFpsUnlockerKind UnlockerKind + public List> UnlockerKinds { get; } = + [ + new("经典", "经典的进程外内存操作,较为危险,但容易失败", GameFpsUnlockerKind.Legacy), + new("注入", "解锁模块注入游戏进程,非常危险,但容易成功", GameFpsUnlockerKind.Island), + ]; + + public NameDescriptionValue UnlockerKind { - get => GetOption(ref unlockerKind, SettingEntry.LaunchUnlockerKind, EnumParse, GameFpsUnlockerKind.Legacy).Value; - set => SetOption(ref unlockerKind, SettingEntry.LaunchUnlockerKind, value, EnumToStringOrEmpty); + get + { + return GetOption(ref unlockerKind, SettingEntry.LaunchUnlockerKind, name => GetKind(name, UnlockerKinds), UnlockerKinds[0]); + + static NameDescriptionValue GetKind(string name, List> unlockerKinds) + { + GameFpsUnlockerKind kind = Enum.Parse(name); + return unlockerKinds.Single(entry => entry.Value == kind); + } + } + + set + { + if (value is not null) + { + SetOption(ref unlockerKind, SettingEntry.LaunchUnlockerKind, value, selected => selected.Value.ToString()); + } + } } public int TargetFps diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionUnlockFpsHandler.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionUnlockFpsHandler.cs index 5b4d44ec..67a61947 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionUnlockFpsHandler.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Launching/Handler/LaunchExecutionUnlockFpsHandler.cs @@ -26,7 +26,7 @@ internal sealed class LaunchExecutionUnlockFpsHandler : ILaunchExecutionDelegate } UnlockOptions unlockOptions = new(gameFileSystem, 100, 20000, 2000); - IGameFpsUnlocker unlocker = context.Options.UnlockerKind switch + IGameFpsUnlocker unlocker = context.Options.UnlockerKind.Value switch { GameFpsUnlockerKind.Island => new IslandGameFpsUnlocker(context.ServiceProvider, context.Process, unlockOptions, progress), _ => new DefaultGameFpsUnlocker(context.ServiceProvider, context.Process, unlockOptions, progress), diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Image/CachedImage.cs b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Image/CachedImage.cs index 233b612f..fad579c6 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Image/CachedImage.cs +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Image/CachedImage.cs @@ -181,7 +181,6 @@ internal sealed partial class CachedImage : Microsoft.UI.Xaml.Controls.Control, ElementTheme theme = ShowAsMonoChrome ? ThemeHelper.ApplicationToElement(ThemeHelper.ElementToApplication(ActualTheme)) : ElementTheme.Default; string file = await imageCache.GetFileFromCacheAsync(imageUri, theme).ConfigureAwait(true); // BitmapImage need to be created by main thread. CachedName = Path.GetFileName(file); - token.ThrowIfCancellationRequested(); // check token state to determine whether the operation should be canceled. return file.ToUri(); } catch (COMException) diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml index 96ee0cec..ba17e362 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml @@ -306,7 +306,6 @@ diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/LaunchGamePage.xaml index c3cf8b1f..3bce06f0 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/LaunchGamePage.xaml @@ -343,12 +343,13 @@ - @@ -365,7 +366,28 @@ OffContent="{shuxm:ResourceString Name=ViewPageLaunchGameUnlockFpsOff}" OnContent="{shuxm:ResourceString Name=ViewPageLaunchGameUnlockFpsOn}"/> - + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs index 51c1eb93..c767b527 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs @@ -53,6 +53,11 @@ internal sealed partial class UserViewModel : ObservableObject { case UserOptionResult.Added: ArgumentNullException.ThrowIfNull(Users); + if (Users.CurrentItem is null) + { + taskContext.InvokeOnMainThread(Users.MoveCurrentToFirst); + } + infoBarService.Success(SH.FormatViewModelUserAdded(uid)); break; case UserOptionResult.CookieIncomplete: