2023-01-08 17:46:25 +00:00
|
|
|
|
using Avalonia;
|
|
|
|
|
using Avalonia.Controls;
|
|
|
|
|
using Avalonia.Interactivity;
|
|
|
|
|
using LibHac.Ncm;
|
2023-03-02 02:42:27 +00:00
|
|
|
|
using LibHac.Tools.FsSystem.NcaUtils;
|
2023-01-22 17:39:00 +00:00
|
|
|
|
using Ryujinx.Ava.Common.Locale;
|
2023-01-11 00:29:22 +00:00
|
|
|
|
using Ryujinx.Ava.UI.Helpers;
|
|
|
|
|
using Ryujinx.Ava.UI.ViewModels;
|
|
|
|
|
using Ryujinx.Ava.UI.Windows;
|
|
|
|
|
using Ryujinx.Common;
|
|
|
|
|
using Ryujinx.Common.Utilities;
|
2023-01-08 17:46:25 +00:00
|
|
|
|
using Ryujinx.HLE.HOS;
|
|
|
|
|
using Ryujinx.Modules;
|
2023-04-16 01:03:35 +00:00
|
|
|
|
using Ryujinx.Ui.Common;
|
|
|
|
|
using Ryujinx.Ui.Common.Configuration;
|
2023-01-22 17:39:00 +00:00
|
|
|
|
using Ryujinx.Ui.Common.Helper;
|
2023-01-11 00:29:22 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
2023-01-08 17:46:25 +00:00
|
|
|
|
|
|
|
|
|
namespace Ryujinx.Ava.UI.Views.Main
|
|
|
|
|
{
|
|
|
|
|
public partial class MainMenuBarView : UserControl
|
|
|
|
|
{
|
|
|
|
|
public MainWindow Window { get; private set; }
|
|
|
|
|
public MainWindowViewModel ViewModel { get; private set; }
|
|
|
|
|
|
|
|
|
|
public MainMenuBarView()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2023-01-11 00:29:22 +00:00
|
|
|
|
|
2023-04-16 01:03:35 +00:00
|
|
|
|
ToggleFileTypesMenuItem.Items = GenerateToggleFileTypeItems();
|
|
|
|
|
ChangeLanguageMenuItem.Items = GenerateLanguageMenuItems();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private CheckBox[] GenerateToggleFileTypeItems()
|
|
|
|
|
{
|
|
|
|
|
List<CheckBox> checkBoxes = new();
|
|
|
|
|
|
|
|
|
|
foreach (var item in Enum.GetValues(typeof (FileTypes)))
|
|
|
|
|
{
|
|
|
|
|
string fileName = Enum.GetName(typeof (FileTypes), item);
|
|
|
|
|
checkBoxes.Add(new CheckBox()
|
|
|
|
|
{
|
|
|
|
|
Content = $".{fileName}",
|
|
|
|
|
IsChecked = ((FileTypes)item).GetConfigValue(ConfigurationState.Instance.Ui.ShownFileTypes),
|
|
|
|
|
Command = MiniCommand.Create(() => ViewModel.ToggleFileType(fileName))
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return checkBoxes.ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MenuItem[] GenerateLanguageMenuItems()
|
|
|
|
|
{
|
2023-01-11 00:29:22 +00:00
|
|
|
|
List<MenuItem> menuItems = new();
|
|
|
|
|
|
|
|
|
|
string localePath = "Ryujinx.Ava/Assets/Locales";
|
|
|
|
|
string localeExt = ".json";
|
|
|
|
|
|
|
|
|
|
string[] localesPath = EmbeddedResources.GetAllAvailableResources(localePath, localeExt);
|
|
|
|
|
|
|
|
|
|
Array.Sort(localesPath);
|
|
|
|
|
|
|
|
|
|
foreach (string locale in localesPath)
|
|
|
|
|
{
|
|
|
|
|
string languageCode = Path.GetFileNameWithoutExtension(locale).Split('.').Last();
|
|
|
|
|
string languageJson = EmbeddedResources.ReadAllText($"{localePath}/{languageCode}{localeExt}");
|
2023-04-03 10:14:19 +00:00
|
|
|
|
var strings = JsonHelper.Deserialize(languageJson, CommonJsonContext.Default.StringDictionary);
|
2023-01-11 00:29:22 +00:00
|
|
|
|
|
|
|
|
|
if (!strings.TryGetValue("Language", out string languageName))
|
|
|
|
|
{
|
|
|
|
|
languageName = languageCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MenuItem menuItem = new()
|
|
|
|
|
{
|
|
|
|
|
Header = languageName,
|
|
|
|
|
Command = MiniCommand.Create(() =>
|
|
|
|
|
{
|
|
|
|
|
ViewModel.ChangeLanguage(languageCode);
|
|
|
|
|
})
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
menuItems.Add(menuItem);
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-16 01:03:35 +00:00
|
|
|
|
return menuItems.ToArray();
|
2023-01-08 17:46:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
base.OnAttachedToVisualTree(e);
|
|
|
|
|
|
2023-01-11 00:29:22 +00:00
|
|
|
|
if (VisualRoot is MainWindow window)
|
2023-01-08 17:46:25 +00:00
|
|
|
|
{
|
|
|
|
|
Window = window;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ViewModel = Window.ViewModel;
|
|
|
|
|
DataContext = ViewModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void StopEmulation_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
2023-01-09 03:37:20 +00:00
|
|
|
|
await Window.ViewModel.AppHost?.ShowExitPrompt();
|
2023-01-08 17:46:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void PauseEmulation_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
await Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
Window.ViewModel.AppHost?.Pause();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void ResumeEmulation_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
await Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
Window.ViewModel.AppHost?.Resume();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void OpenSettings(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Window.SettingsWindow = new(Window.VirtualFileSystem, Window.ContentManager);
|
|
|
|
|
|
|
|
|
|
await Window.SettingsWindow.ShowDialog(Window);
|
|
|
|
|
|
|
|
|
|
ViewModel.LoadConfigurableHotKeys();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OpenMiiApplet(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
string contentPath = ViewModel.ContentManager.GetInstalledContentPath(0x0100000000001009, StorageId.BuiltInSystem, NcaContentType.Program);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(contentPath))
|
|
|
|
|
{
|
|
|
|
|
ViewModel.LoadApplication(contentPath, false, "Mii Applet");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void OpenAmiiboWindow(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (!ViewModel.IsAmiiboRequested)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ViewModel.AppHost.Device.System.SearchingForAmiibo(out int deviceId))
|
|
|
|
|
{
|
2023-03-31 19:16:46 +00:00
|
|
|
|
string titleId = ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText.ToUpper();
|
2023-01-08 17:46:25 +00:00
|
|
|
|
AmiiboWindow window = new(ViewModel.ShowAll, ViewModel.LastScannedAmiiboId, titleId);
|
|
|
|
|
|
|
|
|
|
await window.ShowDialog(Window);
|
|
|
|
|
|
|
|
|
|
if (window.IsScanned)
|
|
|
|
|
{
|
|
|
|
|
ViewModel.ShowAll = window.ViewModel.ShowAllAmiibo;
|
|
|
|
|
ViewModel.LastScannedAmiiboId = window.ScannedAmiibo.GetId();
|
|
|
|
|
|
|
|
|
|
ViewModel.AppHost.Device.System.ScanAmiibo(deviceId, ViewModel.LastScannedAmiiboId, window.ViewModel.UseRandomUuid);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void OpenCheatManagerForCurrentApp(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (!ViewModel.IsGameRunning)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-31 19:16:46 +00:00
|
|
|
|
string name = ViewModel.AppHost.Device.Processes.ActiveApplication.ApplicationControlProperties.Title[(int)ViewModel.AppHost.Device.System.State.DesiredTitleLanguage].NameString.ToString();
|
2023-01-08 17:46:25 +00:00
|
|
|
|
|
2023-03-31 19:16:46 +00:00
|
|
|
|
await new CheatWindow(Window.VirtualFileSystem, ViewModel.AppHost.Device.Processes.ActiveApplication.ProgramIdText, name).ShowDialog(Window);
|
|
|
|
|
|
|
|
|
|
ViewModel.AppHost.Device.EnableCheats();
|
2023-01-08 17:46:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ScanAmiiboMenuItem_AttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (sender is MenuItem)
|
|
|
|
|
{
|
|
|
|
|
ViewModel.IsAmiiboRequested = Window.ViewModel.AppHost.Device.System.SearchingForAmiibo(out _);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-22 17:39:00 +00:00
|
|
|
|
private async void InstallFileTypes_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (FileAssociationHelper.Install())
|
|
|
|
|
{
|
|
|
|
|
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesSuccessMessage],
|
|
|
|
|
string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogInstallFileTypesErrorMessage]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void UninstallFileTypes_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (FileAssociationHelper.Uninstall())
|
|
|
|
|
{
|
|
|
|
|
await ContentDialogHelper.CreateInfoDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesSuccessMessage],
|
|
|
|
|
string.Empty, LocaleManager.Instance[LocaleKeys.InputDialogOk], string.Empty, string.Empty);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogUninstallFileTypesErrorMessage]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-08 17:46:25 +00:00
|
|
|
|
public async void CheckForUpdates(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
2023-01-20 20:30:21 +00:00
|
|
|
|
if (Updater.CanUpdate(true))
|
2023-01-08 17:46:25 +00:00
|
|
|
|
{
|
|
|
|
|
await Updater.BeginParse(Window, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async void OpenAboutWindow(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
await AboutWindow.Show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void CloseWindow(object sender, RoutedEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
Window.Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|