ControllerAppletDialog.axaml.cs
1 using Avalonia.Controls; 2 using Avalonia.Styling; 3 using Avalonia.Svg.Skia; 4 using Avalonia.Threading; 5 using FluentAvalonia.UI.Controls; 6 using Ryujinx.Ava.Common.Locale; 7 using Ryujinx.Ava.UI.Helpers; 8 using Ryujinx.Ava.UI.Windows; 9 using Ryujinx.Common; 10 using Ryujinx.HLE.HOS.Applets; 11 using Ryujinx.HLE.HOS.Services.Hid; 12 using System.Linq; 13 using System.Threading.Tasks; 14 15 namespace Ryujinx.Ava.UI.Applet 16 { 17 internal partial class ControllerAppletDialog : UserControl 18 { 19 private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg"; 20 private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg"; 21 private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg"; 22 private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg"; 23 24 public static SvgImage ProControllerImage => GetResource(ProControllerResource); 25 public static SvgImage JoyconPairImage => GetResource(JoyConPairResource); 26 public static SvgImage JoyconLeftImage => GetResource(JoyConLeftResource); 27 public static SvgImage JoyconRightImage => GetResource(JoyConRightResource); 28 29 public string PlayerCount { get; set; } = ""; 30 public bool SupportsProController { get; set; } 31 public bool SupportsLeftJoycon { get; set; } 32 public bool SupportsRightJoycon { get; set; } 33 public bool SupportsJoyconPair { get; set; } 34 public bool IsDocked { get; set; } 35 36 private readonly MainWindow _mainWindow; 37 38 public ControllerAppletDialog(MainWindow mainWindow, ControllerAppletUIArgs args) 39 { 40 if (args.PlayerCountMin == args.PlayerCountMax) 41 { 42 PlayerCount = args.PlayerCountMin.ToString(); 43 } 44 else 45 { 46 PlayerCount = $"{args.PlayerCountMin} - {args.PlayerCountMax}"; 47 } 48 49 SupportsProController = (args.SupportedStyles & ControllerType.ProController) != 0; 50 SupportsLeftJoycon = (args.SupportedStyles & ControllerType.JoyconLeft) != 0; 51 SupportsRightJoycon = (args.SupportedStyles & ControllerType.JoyconRight) != 0; 52 SupportsJoyconPair = (args.SupportedStyles & ControllerType.JoyconPair) != 0; 53 54 IsDocked = args.IsDocked; 55 56 _mainWindow = mainWindow; 57 58 DataContext = this; 59 60 InitializeComponent(); 61 } 62 63 public ControllerAppletDialog(MainWindow mainWindow) 64 { 65 _mainWindow = mainWindow; 66 DataContext = this; 67 68 InitializeComponent(); 69 } 70 71 public static async Task<UserResult> ShowControllerAppletDialog(MainWindow window, ControllerAppletUIArgs args) 72 { 73 ContentDialog contentDialog = new(); 74 UserResult result = UserResult.Cancel; 75 ControllerAppletDialog content = new(window, args); 76 77 contentDialog.Title = LocaleManager.Instance[LocaleKeys.DialogControllerAppletTitle]; 78 contentDialog.Content = content; 79 80 void Handler(ContentDialog sender, ContentDialogClosedEventArgs eventArgs) 81 { 82 if (eventArgs.Result == ContentDialogResult.Primary) 83 { 84 result = UserResult.Ok; 85 } 86 } 87 88 contentDialog.Closed += Handler; 89 90 Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>()); 91 bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false)); 92 93 contentDialog.Styles.Add(bottomBorder); 94 95 await ContentDialogHelper.ShowAsync(contentDialog); 96 97 return result; 98 } 99 100 private static SvgImage GetResource(string path) 101 { 102 SvgImage image = new(); 103 104 if (!string.IsNullOrWhiteSpace(path)) 105 { 106 SvgSource source = SvgSource.LoadFromStream(EmbeddedResources.GetStream(path)); 107 108 image.Source = source; 109 } 110 111 return image; 112 } 113 114 public void OpenSettingsWindow() 115 { 116 if (_mainWindow.SettingsWindow == null) 117 { 118 Dispatcher.UIThread.InvokeAsync(async () => 119 { 120 _mainWindow.SettingsWindow = new SettingsWindow(_mainWindow.VirtualFileSystem, _mainWindow.ContentManager); 121 _mainWindow.SettingsWindow.NavPanel.Content = _mainWindow.SettingsWindow.InputPage; 122 _mainWindow.SettingsWindow.NavPanel.SelectedItem = _mainWindow.SettingsWindow.NavPanel.MenuItems.ElementAt(1); 123 124 await ContentDialogHelper.ShowWindowAsync(_mainWindow.SettingsWindow, _mainWindow); 125 _mainWindow.SettingsWindow = null; 126 this.Close(); 127 }); 128 } 129 } 130 131 public void Close() 132 { 133 ((ContentDialog)Parent)?.Hide(); 134 } 135 } 136 } 137