App.axaml.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using Avalonia;
  2. using Avalonia.Controls.ApplicationLifetimes;
  3. using Avalonia.Markup.Xaml;
  4. using Avalonia.Platform;
  5. using Avalonia.Styling;
  6. using Avalonia.Threading;
  7. using FluentAvalonia.UI.Windowing;
  8. using Gommon;
  9. using Ryujinx.Ava.Common;
  10. using Ryujinx.Ava.Common.Locale;
  11. using Ryujinx.Ava.UI.Helpers;
  12. using Ryujinx.Ava.UI.Windows;
  13. using Ryujinx.Common;
  14. using Ryujinx.Common.Logging;
  15. using Ryujinx.UI.Common.Configuration;
  16. using Ryujinx.UI.Common.Helper;
  17. using System;
  18. using System.Diagnostics;
  19. namespace Ryujinx.Ava
  20. {
  21. public class App : Application
  22. {
  23. internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
  24. => windowTitleKey is null
  25. ? $"Ryujinx {Program.Version}"
  26. : $"Ryujinx {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}";
  27. public static MainWindow MainWindow => Current!
  28. .ApplicationLifetime.Cast<IClassicDesktopStyleApplicationLifetime>()
  29. .MainWindow.Cast<MainWindow>();
  30. public static void SetTaskbarProgress(TaskBarProgressBarState state) => MainWindow.PlatformFeatures.SetTaskBarProgressBarState(state);
  31. public static void SetTaskbarProgressValue(ulong current, ulong total) => MainWindow.PlatformFeatures.SetTaskBarProgressBarValue(current, total);
  32. public static void SetTaskbarProgressValue(long current, long total) => SetTaskbarProgressValue(Convert.ToUInt64(current), Convert.ToUInt64(total));
  33. public override void Initialize()
  34. {
  35. Name = FormatTitle();
  36. AvaloniaXamlLoader.Load(this);
  37. if (OperatingSystem.IsMacOS())
  38. {
  39. Process.Start("/usr/bin/defaults", "write org.ryujinx.Ryujinx ApplePressAndHoldEnabled -bool false");
  40. }
  41. }
  42. public override void OnFrameworkInitializationCompleted()
  43. {
  44. if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
  45. {
  46. desktop.MainWindow = new MainWindow();
  47. }
  48. base.OnFrameworkInitializationCompleted();
  49. if (Program.PreviewerDetached)
  50. {
  51. ApplyConfiguredTheme(ConfigurationState.Instance.UI.BaseStyle);
  52. ConfigurationState.Instance.UI.BaseStyle.Event += ThemeChanged_Event;
  53. }
  54. }
  55. private void ShowRestartDialog()
  56. {
  57. _ = Dispatcher.UIThread.InvokeAsync(async () =>
  58. {
  59. if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
  60. {
  61. var result = await ContentDialogHelper.CreateConfirmationDialog(
  62. LocaleManager.Instance[LocaleKeys.DialogThemeRestartMessage],
  63. LocaleManager.Instance[LocaleKeys.DialogThemeRestartSubMessage],
  64. LocaleManager.Instance[LocaleKeys.InputDialogYes],
  65. LocaleManager.Instance[LocaleKeys.InputDialogNo],
  66. LocaleManager.Instance[LocaleKeys.DialogRestartRequiredMessage]);
  67. if (result == UserResult.Yes)
  68. {
  69. _ = Process.Start(Environment.ProcessPath!, CommandLineState.Arguments);
  70. desktop.Shutdown();
  71. Environment.Exit(0);
  72. }
  73. }
  74. });
  75. }
  76. private void ThemeChanged_Event(object _, ReactiveEventArgs<string> rArgs) => ApplyConfiguredTheme(rArgs.NewValue);
  77. public void ApplyConfiguredTheme(string baseStyle)
  78. {
  79. try
  80. {
  81. if (string.IsNullOrWhiteSpace(baseStyle))
  82. {
  83. ConfigurationState.Instance.UI.BaseStyle.Value = "Auto";
  84. baseStyle = ConfigurationState.Instance.UI.BaseStyle;
  85. }
  86. ThemeManager.OnThemeChanged();
  87. RequestedThemeVariant = baseStyle switch
  88. {
  89. "Auto" => DetectSystemTheme(),
  90. "Light" => ThemeVariant.Light,
  91. "Dark" => ThemeVariant.Dark,
  92. _ => ThemeVariant.Default,
  93. };
  94. }
  95. catch (Exception)
  96. {
  97. Logger.Warning?.Print(LogClass.Application, "Failed to apply theme. A restart is needed to apply the selected theme.");
  98. ShowRestartDialog();
  99. }
  100. }
  101. /// <summary>
  102. /// Converts a PlatformThemeVariant value to the corresponding ThemeVariant value.
  103. /// </summary>
  104. public static ThemeVariant ConvertThemeVariant(PlatformThemeVariant platformThemeVariant) =>
  105. platformThemeVariant switch
  106. {
  107. PlatformThemeVariant.Dark => ThemeVariant.Dark,
  108. PlatformThemeVariant.Light => ThemeVariant.Light,
  109. _ => ThemeVariant.Default,
  110. };
  111. public static ThemeVariant DetectSystemTheme() =>
  112. Current is App { PlatformSettings: not null } app
  113. ? ConvertThemeVariant(app.PlatformSettings.GetColorValues().ThemeVariant)
  114. : ThemeVariant.Default;
  115. }
  116. }