MainMenuBarView.axaml.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Avalonia.Interactivity;
  4. using LibHac.Ncm;
  5. using LibHac.Tools.FsSystem.NcaUtils;
  6. using Ryujinx.Ava.Common.Locale;
  7. using Ryujinx.Ava.UI.Helpers;
  8. using Ryujinx.Ava.UI.ViewModels;
  9. using Ryujinx.Ava.UI.Windows;
  10. using Ryujinx.Common;
  11. using Ryujinx.Common.Utilities;
  12. using Ryujinx.Modules;
  13. using Ryujinx.Ui.Common;
  14. using Ryujinx.Ui.Common.Configuration;
  15. using Ryujinx.Ui.Common.Helper;
  16. using System;
  17. using System.Collections.Generic;
  18. using System.IO;
  19. using System.Linq;
  20. using System.Threading.Tasks;
  21. namespace Ryujinx.Ava.UI.Views.Main
  22. {
  23. public partial class MainMenuBarView : UserControl
  24. {
  25. public MainWindow Window { get; private set; }
  26. public MainWindowViewModel ViewModel { get; private set; }
  27. public MainMenuBarView()
  28. {
  29. InitializeComponent();
  30. ToggleFileTypesMenuItem.ItemsSource = GenerateToggleFileTypeItems();
  31. ChangeLanguageMenuItem.ItemsSource = GenerateLanguageMenuItems();
  32. }
  33. private CheckBox[] GenerateToggleFileTypeItems()
  34. {
  35. List<CheckBox> checkBoxes = new();
  36. foreach (var item in Enum.GetValues(typeof(FileTypes)))
  37. {
  38. string fileName = Enum.GetName(typeof(FileTypes), item);
  39. checkBoxes.Add(new CheckBox
  40. {
  41. Content = $".{fileName}",
  42. IsChecked = ((FileTypes)item).GetConfigValue(ConfigurationState.Instance.Ui.ShownFileTypes),
  43. Command = MiniCommand.Create(() => Window.ToggleFileType(fileName)),
  44. });
  45. }
  46. return checkBoxes.ToArray();
  47. }
  48. private static MenuItem[] GenerateLanguageMenuItems()
  49. {
  50. List<MenuItem> menuItems = new();
  51. string localePath = "Ryujinx.Ava/Assets/Locales";
  52. string localeExt = ".json";
  53. string[] localesPath = EmbeddedResources.GetAllAvailableResources(localePath, localeExt);
  54. Array.Sort(localesPath);
  55. foreach (string locale in localesPath)
  56. {
  57. string languageCode = Path.GetFileNameWithoutExtension(locale).Split('.').Last();
  58. string languageJson = EmbeddedResources.ReadAllText($"{localePath}/{languageCode}{localeExt}");
  59. var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary);
  60. if (!strings.TryGetValue("Language", out string languageName))
  61. {
  62. languageName = languageCode;
  63. }
  64. MenuItem menuItem = new()
  65. {
  66. Header = languageName,
  67. Command = MiniCommand.Create(() =>
  68. {
  69. MainWindowViewModel.ChangeLanguage(languageCode);
  70. }),
  71. };
  72. menuItems.Add(menuItem);
  73. }
  74. return menuItems.ToArray();
  75. }
  76. protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
  77. {
  78. base.OnAttachedToVisualTree(e);
  79. if (VisualRoot is MainWindow window)
  80. {
  81. Window = window;
  82. }
  83. ViewModel = Window.ViewModel;
  84. DataContext = ViewModel;
  85. }
  86. private async void StopEmulation_Click(object sender, RoutedEventArgs e)
  87. {
  88. await Window.ViewModel.AppHost?.ShowExitPrompt();
  89. }
  90. private async void PauseEmulation_Click(object sender, RoutedEventArgs e)
  91. {
  92. await Task.Run(() =>
  93. {
  94. Window.ViewModel.AppHost?.Pause();
  95. });
  96. }
  97. private async void ResumeEmulation_Click(object sender, RoutedEventArgs e)
  98. {
  99. await Task.Run(() =>
  100. {
  101. Window.ViewModel.AppHost?.Resume();
  102. });
  103. }
  104. public async void OpenSettings(object sender, RoutedEventArgs e)
  105. {
  106. Window.SettingsWindow = new(Window.VirtualFileSystem, Window.ContentManager);
  107. await Window.SettingsWindow.ShowDialog(Window);
  108. ViewModel.LoadConfigurableHotKeys();
  109. }
  110. public void OpenMiiApplet(object sender, RoutedEventArgs e)
  111. {
  112. string contentPath = ViewModel.ContentManager.GetInstalledContentPath(0x0100000000001009, StorageId.BuiltInSystem, NcaContentType.Program);
  113. if (!string.IsNullOrEmpty(contentPath))
  114. {
  115. ViewModel.LoadApplication(contentPath, false, "Mii Applet");
  116. }
  117. }
  118. public async void OpenAmiiboWindow(object sender, RoutedEventArgs e)
  119. {
  120. if (!ViewModel.IsAmiiboRequested)
  121. {
  122. return;
  123. }
  124. if (ViewModel.AppHost.Device.System.SearchingForAmiibo(out int deviceId))
  125. {
  126. string titleId = ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText.ToUpper();
  127. AmiiboWindow window = new(ViewModel.ShowAll, ViewModel.LastScannedAmiiboId, titleId);
  128. await window.ShowDialog(Window);
  129. if (window.IsScanned)
  130. {
  131. ViewModel.ShowAll = window.ViewModel.ShowAllAmiibo;
  132. ViewModel.LastScannedAmiiboId = window.ScannedAmiibo.GetId();
  133. ViewModel.AppHost.Device.System.ScanAmiibo(deviceId, ViewModel.LastScannedAmiiboId, window.ViewModel.UseRandomUuid);
  134. }
  135. }
  136. }
  137. public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e)
  138. {
  139. if (!ViewModel.IsGameRunning)
  140. {
  141. return;
  142. }
  143. string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
  144. await new CheatWindow(
  145. Window.VirtualFileSystem,
  146. ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText,
  147. name,
  148. Window.ViewModel.SelectedApplication.Path).ShowDialog(Window);
  149. ViewModel.AppHost.Device.EnableCheats();
  150. }
  151. private void ScanAmiiboMenuItem_AttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e)
  152. {
  153. if (sender is MenuItem)
  154. {
  155. ViewModel.IsAmiiboRequested = Window.ViewModel.AppHost.Device.System.SearchingForAmiibo(out _);
  156. }
  157. }
  158. private async void InstallFileTypes_Click(object sender, RoutedEventArgs e)
  159. {
  160. if (FileAssociationHelper.Install())
  161. {
  162. await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesSuccessMessage],
  163. string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
  164. }
  165. else
  166. {
  167. await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesErrorMessage]);
  168. }
  169. }
  170. private async void UninstallFileTypes_Click(object sender, RoutedEventArgs e)
  171. {
  172. if (FileAssociationHelper.Uninstall())
  173. {
  174. await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesSuccessMessage],
  175. string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
  176. }
  177. else
  178. {
  179. await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesErrorMessage]);
  180. }
  181. }
  182. public async void CheckForUpdates(object sender, RoutedEventArgs e)
  183. {
  184. if (Updater.CanUpdate(true))
  185. {
  186. await Updater.BeginParse(Window, true);
  187. }
  188. }
  189. public async void OpenAboutWindow(object sender, RoutedEventArgs e)
  190. {
  191. await AboutWindow.Show();
  192. }
  193. public void CloseWindow(object sender, RoutedEventArgs e)
  194. {
  195. Window.Close();
  196. }
  197. }
  198. }