mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-04-21 18:13:14 +02:00

These changes allow players to matchmake for local wireless using a LDN server. The network implementation originates from Berry's public TCP RyuLDN fork. Logo and unrelated changes have been removed. Additionally displays LDN game status in the game selection window when RyuLDN is enabled. Functionality is only enabled while network mode is set to "RyuLDN" in the settings.
132 lines
4.8 KiB
C#
132 lines
4.8 KiB
C#
using Avalonia.Controls;
|
|
using Avalonia.Styling;
|
|
using Avalonia.Svg.Skia;
|
|
using Avalonia.Threading;
|
|
using FluentAvalonia.UI.Controls;
|
|
using Ryujinx.Ava.Common.Locale;
|
|
using Ryujinx.Ava.UI.Helpers;
|
|
using Ryujinx.Ava.UI.Windows;
|
|
using Ryujinx.Common;
|
|
using Ryujinx.HLE.HOS.Applets;
|
|
using Ryujinx.HLE.HOS.Services.Hid;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Ryujinx.Ava.UI.Applet
|
|
{
|
|
internal partial class ControllerAppletDialog : UserControl
|
|
{
|
|
private const string ProControllerResource = "Ryujinx/Assets/Icons/Controller_ProCon.svg";
|
|
private const string JoyConPairResource = "Ryujinx/Assets/Icons/Controller_JoyConPair.svg";
|
|
private const string JoyConLeftResource = "Ryujinx/Assets/Icons/Controller_JoyConLeft.svg";
|
|
private const string JoyConRightResource = "Ryujinx/Assets/Icons/Controller_JoyConRight.svg";
|
|
|
|
public static SvgImage ProControllerImage => GetResource(ProControllerResource);
|
|
public static SvgImage JoyconPairImage => GetResource(JoyConPairResource);
|
|
public static SvgImage JoyconLeftImage => GetResource(JoyConLeftResource);
|
|
public static SvgImage JoyconRightImage => GetResource(JoyConRightResource);
|
|
|
|
public string PlayerCount { get; set; } = string.Empty;
|
|
public bool SupportsProController { get; set; }
|
|
public bool SupportsLeftJoycon { get; set; }
|
|
public bool SupportsRightJoycon { get; set; }
|
|
public bool SupportsJoyconPair { get; set; }
|
|
public bool IsDocked { get; set; }
|
|
|
|
private readonly MainWindow _mainWindow;
|
|
|
|
public ControllerAppletDialog(MainWindow mainWindow, ControllerAppletUIArgs args)
|
|
{
|
|
PlayerCount = args.PlayerCountMin == args.PlayerCountMax
|
|
? args.PlayerCountMin.ToString()
|
|
: $"{args.PlayerCountMin} - {args.PlayerCountMax}";
|
|
|
|
SupportsProController = (args.SupportedStyles & ControllerType.ProController) != 0;
|
|
SupportsLeftJoycon = (args.SupportedStyles & ControllerType.JoyconLeft) != 0;
|
|
SupportsRightJoycon = (args.SupportedStyles & ControllerType.JoyconRight) != 0;
|
|
SupportsJoyconPair = (args.SupportedStyles & ControllerType.JoyconPair) != 0;
|
|
|
|
IsDocked = args.IsDocked;
|
|
|
|
_mainWindow = mainWindow;
|
|
|
|
DataContext = this;
|
|
|
|
InitializeComponent();
|
|
}
|
|
|
|
public ControllerAppletDialog(MainWindow mainWindow)
|
|
{
|
|
_mainWindow = mainWindow;
|
|
DataContext = this;
|
|
|
|
InitializeComponent();
|
|
}
|
|
|
|
public static async Task<UserResult> ShowControllerAppletDialog(MainWindow window, ControllerAppletUIArgs args)
|
|
{
|
|
ContentDialog contentDialog = new();
|
|
UserResult result = UserResult.Cancel;
|
|
ControllerAppletDialog content = new(window, args);
|
|
|
|
contentDialog.Title = LocaleManager.Instance[LocaleKeys.DialogControllerAppletTitle];
|
|
contentDialog.Content = content;
|
|
|
|
void Handler(ContentDialog sender, ContentDialogClosedEventArgs eventArgs)
|
|
{
|
|
if (eventArgs.Result == ContentDialogResult.Primary)
|
|
{
|
|
result = UserResult.Ok;
|
|
}
|
|
}
|
|
|
|
contentDialog.Closed += Handler;
|
|
|
|
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
|
|
bottomBorder.Setters.Add(new Setter(IsVisibleProperty, false));
|
|
|
|
contentDialog.Styles.Add(bottomBorder);
|
|
|
|
await ContentDialogHelper.ShowAsync(contentDialog);
|
|
|
|
return result;
|
|
}
|
|
|
|
private static SvgImage GetResource(string path)
|
|
{
|
|
SvgImage image = new();
|
|
|
|
if (!string.IsNullOrWhiteSpace(path))
|
|
{
|
|
SvgSource source = SvgSource.LoadFromStream(EmbeddedResources.GetStream(path));
|
|
|
|
image.Source = source;
|
|
}
|
|
|
|
return image;
|
|
}
|
|
|
|
public void OpenSettingsWindow()
|
|
{
|
|
if (_mainWindow.SettingsWindow == null)
|
|
{
|
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
|
{
|
|
_mainWindow.SettingsWindow = new SettingsWindow(_mainWindow.VirtualFileSystem, _mainWindow.ContentManager);
|
|
_mainWindow.SettingsWindow.NavPanel.Content = _mainWindow.SettingsWindow.InputPage;
|
|
_mainWindow.SettingsWindow.NavPanel.SelectedItem = _mainWindow.SettingsWindow.NavPanel.MenuItems.ElementAt(1);
|
|
|
|
await ContentDialogHelper.ShowWindowAsync(_mainWindow.SettingsWindow, _mainWindow);
|
|
_mainWindow.SettingsWindow = null;
|
|
this.Close();
|
|
});
|
|
}
|
|
}
|
|
|
|
public void Close()
|
|
{
|
|
((ContentDialog)Parent)?.Hide();
|
|
}
|
|
}
|
|
}
|
|
|