From 5d6e1dad0177f946ea33f1f7ddd6d350121e095d Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Tue, 14 May 2024 23:43:15 +0800 Subject: [PATCH] launch game --- src/Snap.Hutao/Snap.Hutao/App.xaml.cs | 4 +- .../{Activation.cs => AppActivation.cs} | 68 +++++++++---------- .../{IActivation.cs => IAppActivation.cs} | 10 +-- .../PrivateNamedPipeMessageDispatcher.cs | 2 +- .../NotifyIcon/NotifyIconContextMenu.xaml | 32 ++++++--- .../Core/Windowing/XamlWindowController.cs | 15 ++-- .../Snap.Hutao/Resource/Localization/SH.resx | 5 +- .../DailyNoteNotificationOperation.cs | 4 +- .../Achievement/AchievementViewModel.cs | 2 +- .../ViewModel/NotifyIconViewModel.cs | 26 ++++--- 10 files changed, 99 insertions(+), 69 deletions(-) rename src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/{Activation.cs => AppActivation.cs} (94%) rename src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/{IActivation.cs => IAppActivation.cs} (57%) diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs index 5ae271ed..240cf432 100644 --- a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs @@ -41,7 +41,7 @@ public sealed partial class App : Application """; private readonly IServiceProvider serviceProvider; - private readonly IActivation activation; + private readonly IAppActivation activation; private readonly ILogger logger; /// @@ -52,7 +52,7 @@ public sealed partial class App : Application { // Load app resource InitializeComponent(); - activation = serviceProvider.GetRequiredService(); + activation = serviceProvider.GetRequiredService(); logger = serviceProvider.GetRequiredService>(); serviceProvider.GetRequiredService().Record(this); diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs similarity index 94% rename from src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs rename to src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs index 1add1fe3..dbb2612f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/AppActivation.cs @@ -23,9 +23,9 @@ namespace Snap.Hutao.Core.LifeCycle; /// [HighQuality] [ConstructorGenerated] -[Injection(InjectAs.Singleton, typeof(IActivation))] +[Injection(InjectAs.Singleton, typeof(IAppActivation))] [SuppressMessage("", "CA1001")] -internal sealed partial class Activation : IActivation, IDisposable +internal sealed partial class AppActivation : IAppActivation, IAppActivationActionHandlersAccess, IDisposable { public const string Action = nameof(Action); public const string Uid = nameof(Uid); @@ -74,6 +74,36 @@ internal sealed partial class Activation : IActivation, IDisposable activateSemaphore.Dispose(); } + public async ValueTask HandleLaunchGameActionAsync(string? uid = null) + { + serviceProvider + .GetRequiredService() + .Set(ViewModel.Game.LaunchGameViewModel.DesiredUid, uid); + + await taskContext.SwitchToMainThreadAsync(); + + if (currentWindowReference.Window is null) + { + currentWindowReference.Window = serviceProvider.GetRequiredService(); + return; + } + + if (currentWindowReference.Window is MainWindow) + { + await serviceProvider + .GetRequiredService() + .NavigateAsync(INavigationAwaiter.Default, true) + .ConfigureAwait(false); + + return; + } + else + { + // We have a non-Main Window, just exit current process anyway + Process.GetCurrentProcess().Kill(); + } + } + private void NotificationActivate(ToastNotificationActivatedEventArgsCompat args) { ToastArguments toastArgs = ToastArguments.Parse(args.Argument); @@ -138,7 +168,7 @@ internal sealed partial class Activation : IActivation, IDisposable if (UnsafeLocalSetting.Get(SettingKeys.Major1Minor10Revision0GuideState, GuideState.Language) < GuideState.Completed) { await taskContext.SwitchToMainThreadAsync(); - serviceProvider.GetRequiredService(); + currentWindowReference.Window = serviceProvider.GetRequiredService(); } else { @@ -155,7 +185,7 @@ internal sealed partial class Activation : IActivation, IDisposable await taskContext.SwitchToMainThreadAsync(); - serviceProvider.GetRequiredService(); + currentWindowReference.Window = serviceProvider.GetRequiredService(); await taskContext.SwitchToBackgroundAsync(); @@ -252,34 +282,4 @@ internal sealed partial class Activation : IActivation, IDisposable } } } - - private async ValueTask HandleLaunchGameActionAsync(string? uid = null) - { - serviceProvider - .GetRequiredService() - .Set(ViewModel.Game.LaunchGameViewModel.DesiredUid, uid); - - await taskContext.SwitchToMainThreadAsync(); - - if (currentWindowReference.Window is null) - { - serviceProvider.GetRequiredService(); - return; - } - - if (currentWindowReference.Window is MainWindow) - { - await serviceProvider - .GetRequiredService() - .NavigateAsync(INavigationAwaiter.Default, true) - .ConfigureAwait(false); - - return; - } - else - { - // We have a non-Main Window, just exit current process anyway - Process.GetCurrentProcess().Kill(); - } - } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IActivation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IAppActivation.cs similarity index 57% rename from src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IActivation.cs rename to src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IAppActivation.cs index ad344e67..ea3f2a5e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IActivation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/IAppActivation.cs @@ -3,12 +3,14 @@ namespace Snap.Hutao.Core.LifeCycle; -/// -/// 激活 -/// -internal interface IActivation +internal interface IAppActivation { void Activate(HutaoActivationArguments args); void PostInitialization(); +} + +internal interface IAppActivationActionHandlersAccess +{ + ValueTask HandleLaunchGameActionAsync(string? uid = null); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeMessageDispatcher.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeMessageDispatcher.cs index 611c91ca..378ca343 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeMessageDispatcher.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeMessageDispatcher.cs @@ -16,6 +16,6 @@ internal sealed partial class PrivateNamedPipeMessageDispatcher return; } - serviceProvider.GetRequiredService().Activate(args); + serviceProvider.GetRequiredService().Activate(args); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/NotifyIcon/NotifyIconContextMenu.xaml b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/NotifyIcon/NotifyIconContextMenu.xaml index 036c2751..3187eab1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/NotifyIcon/NotifyIconContextMenu.xaml +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/NotifyIcon/NotifyIconContextMenu.xaml @@ -37,14 +37,30 @@ HorizontalAlignment="Right" Orientation="Horizontal" Spacing="2"> - - + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs index e594e36a..e046ee0f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/XamlWindowController.cs @@ -36,7 +36,6 @@ internal sealed class XamlWindowController this.options = options; this.serviceProvider = serviceProvider; - serviceProvider.GetRequiredService().Window = window; subclass = new(window, options); windowNonRudeHWND = new(options.Hwnd); @@ -140,18 +139,20 @@ internal sealed class XamlWindowController { args.Handled = true; window.Hide(); - } - else - { - SaveOrSkipWindowSize(); - subclass?.Dispose(); - windowNonRudeHWND?.Dispose(); ICurrentXamlWindowReference currentXamlWindowReference = serviceProvider.GetRequiredService(); if (currentXamlWindowReference.Window == window) { currentXamlWindowReference.Window = default!; } + + GC.Collect(GC.MaxGeneration); + } + else + { + SaveOrSkipWindowSize(); + subclass?.Dispose(); + windowNonRudeHWND?.Dispose(); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 824f7042..be6bb0bd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -195,8 +195,11 @@ 退出 + + 启动游戏 + - 主界面 + 窗口 深色 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs index 5d2c71a3..95be4f4e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs @@ -77,8 +77,8 @@ internal sealed partial class DailyNoteNotificationOperation .AddAttributionText(attribution) .AddButton(new ToastButton() .SetContent(SH.ServiceDailyNoteNotifierActionLaunchGameButton) - .AddArgument(Activation.Action, Activation.LaunchGame) - .AddArgument(Activation.Uid, entry.Uid)) + .AddArgument(AppActivation.Action, AppActivation.LaunchGame) + .AddArgument(AppActivation.Uid, entry.Uid)) .AddButton(new ToastButtonDismiss(SH.ServiceDailyNoteNotifierActionLaunchGameDismiss)); if (options.IsReminderNotification) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs index d81338da..9aa831d2 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs @@ -112,7 +112,7 @@ internal sealed partial class AchievementViewModel : Abstraction.ViewModel, INav { if (await Initialization.Task.ConfigureAwait(false)) { - if (data.Data is Activation.ImportUIAFFromClipboard) + if (data.Data is AppActivation.ImportUIAFFromClipboard) { await ImportUIAFFromClipboardAsync().ConfigureAwait(false); return true; diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/NotifyIconViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/NotifyIconViewModel.cs index 83c3997d..daefd7b9 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/NotifyIconViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/NotifyIconViewModel.cs @@ -15,9 +15,9 @@ namespace Snap.Hutao.ViewModel; [Injection(InjectAs.Singleton)] internal sealed partial class NotifyIconViewModel : ObservableObject { - private readonly RuntimeOptions runtimeOptions; private readonly ICurrentXamlWindowReference currentXamlWindowReference; private readonly IServiceProvider serviceProvider; + private readonly RuntimeOptions runtimeOptions; private readonly App app; public string Title @@ -40,8 +40,8 @@ internal sealed partial class NotifyIconViewModel : ObservableObject } } - [Command("ShowMainWindowCommand")] - private void ShowMainWindow() + [Command("ShowWindowCommand")] + private void ShowWindow() { switch (currentXamlWindowReference.Window) { @@ -61,22 +61,30 @@ internal sealed partial class NotifyIconViewModel : ObservableObject // TODO: Can actually be no any window is initialized mainWindow.Show(); + mainWindow.WindowOptions.BringToForeground(); break; } case Window otherWindow: { - if (otherWindow is IXamlWindowOptionsSource optionsSource) - { - otherWindow.Show(); - optionsSource.WindowOptions.BringToForeground(); - } - + otherWindow.Show(); + (otherWindow as IXamlWindowOptionsSource)?.WindowOptions.BringToForeground(); return; } } } + [Command("LaunchGameCommand")] + private async Task LaunchGame() + { + if (serviceProvider.GetRequiredService() is IAppActivationActionHandlersAccess access) + { + await access.HandleLaunchGameActionAsync(); + } + + ShowWindow(); + } + [Command("ExitCommand")] private void Exit() {