/ src / Ryujinx / UI / Applet / ControllerAppletDialog.axaml.cs
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