mirror of
https://git.ryujinx.app/kenji-nx/ryujinx.git
synced 2025-12-15 01:37:03 +00:00
UI: Add keybinds to useful things
This commit is contained in:
parent
5ea895ed2e
commit
e7e89efb3c
10 changed files with 87 additions and 45 deletions
|
|
@ -30,7 +30,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
private readonly string _amiiboJsonPath;
|
private readonly string _amiiboJsonPath;
|
||||||
private readonly byte[] _amiiboLogoBytes;
|
private readonly byte[] _amiiboLogoBytes;
|
||||||
private readonly HttpClient _httpClient;
|
private readonly HttpClient _httpClient;
|
||||||
private readonly StyleableWindow _owner;
|
private readonly AmiiboWindow _owner;
|
||||||
|
|
||||||
private Bitmap _amiiboImage;
|
private Bitmap _amiiboImage;
|
||||||
private List<AmiiboApi> _amiiboList;
|
private List<AmiiboApi> _amiiboList;
|
||||||
|
|
@ -46,7 +46,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
|
|
||||||
private static readonly AmiiboJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
private static readonly AmiiboJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||||
|
|
||||||
public AmiiboWindowViewModel(StyleableWindow owner, string lastScannedAmiiboId, string titleId)
|
public AmiiboWindowViewModel(AmiiboWindow owner, string lastScannedAmiiboId, string titleId)
|
||||||
{
|
{
|
||||||
_owner = owner;
|
_owner = owner;
|
||||||
|
|
||||||
|
|
@ -183,6 +183,22 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Scan()
|
||||||
|
{
|
||||||
|
if (AmiiboSelectedIndex > -1)
|
||||||
|
{
|
||||||
|
_owner.ScannedAmiibo = AmiiboList[AmiiboSelectedIndex];
|
||||||
|
_owner.IsScanned = true;
|
||||||
|
_owner.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Cancel()
|
||||||
|
{
|
||||||
|
_owner.IsScanned = false;
|
||||||
|
_owner.Close();
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
|
|
|
||||||
|
|
@ -156,6 +156,8 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
|
|
||||||
public IEnumerable<LdnGameData> LastLdnGameData;
|
public IEnumerable<LdnGameData> LastLdnGameData;
|
||||||
|
|
||||||
|
public MainWindow Window { get; init; }
|
||||||
|
|
||||||
internal AppHost AppHost { get; set; }
|
internal AppHost AppHost { get; set; }
|
||||||
|
|
||||||
public MainWindowViewModel()
|
public MainWindowViewModel()
|
||||||
|
|
@ -1782,7 +1784,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
|
|
||||||
public async Task ExitCurrentState()
|
public async Task ExitCurrentState()
|
||||||
{
|
{
|
||||||
if (WindowState == WindowState.FullScreen)
|
if (WindowState == MainWindow.FullScreenWindowState)
|
||||||
{
|
{
|
||||||
ToggleFullscreen();
|
ToggleFullscreen();
|
||||||
}
|
}
|
||||||
|
|
@ -2097,6 +2099,28 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task OpenAmiiboWindow()
|
||||||
|
{
|
||||||
|
if (!IsAmiiboRequested)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (AppHost.Device.System.SearchingForAmiibo(out int deviceId))
|
||||||
|
{
|
||||||
|
string titleId = AppHost.Device.Processes.ActiveApplication.ProgramIdText.ToUpper();
|
||||||
|
AmiiboWindow window = new(ShowAll, LastScannedAmiiboId, titleId);
|
||||||
|
|
||||||
|
await window.ShowDialog(Window);
|
||||||
|
|
||||||
|
if (window.IsScanned)
|
||||||
|
{
|
||||||
|
ShowAll = window.ViewModel.ShowAllAmiibo;
|
||||||
|
LastScannedAmiiboId = window.ScannedAmiibo.GetId();
|
||||||
|
|
||||||
|
AppHost.Device.System.ScanAmiibo(deviceId, LastScannedAmiiboId, window.ViewModel.UseRandomUuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ToggleFullscreen()
|
public void ToggleFullscreen()
|
||||||
{
|
{
|
||||||
|
|
@ -2107,7 +2131,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
|
|
||||||
LastFullscreenToggle = Environment.TickCount64;
|
LastFullscreenToggle = Environment.TickCount64;
|
||||||
|
|
||||||
if (WindowState == WindowState.FullScreen)
|
if (WindowState is not WindowState.Normal)
|
||||||
{
|
{
|
||||||
WindowState = WindowState.Normal;
|
WindowState = WindowState.Normal;
|
||||||
|
|
||||||
|
|
@ -2118,7 +2142,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WindowState = WindowState.FullScreen;
|
WindowState = MainWindow.FullScreenWindowState;
|
||||||
|
|
||||||
if (IsGameRunning)
|
if (IsGameRunning)
|
||||||
{
|
{
|
||||||
|
|
@ -2126,7 +2150,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IsFullScreen = WindowState == WindowState.FullScreen;
|
IsFullScreen = WindowState == MainWindow.FullScreenWindowState;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveConfig()
|
public static void SaveConfig()
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,7 @@
|
||||||
AttachedToVisualTree="ScanAmiiboMenuItem_AttachedToVisualTree"
|
AttachedToVisualTree="ScanAmiiboMenuItem_AttachedToVisualTree"
|
||||||
Click="OpenAmiiboWindow"
|
Click="OpenAmiiboWindow"
|
||||||
Header="{locale:Locale MenuBarActionsScanAmiibo}"
|
Header="{locale:Locale MenuBarActionsScanAmiibo}"
|
||||||
|
InputGesture="Ctrl + A"
|
||||||
IsEnabled="{Binding IsAmiiboRequested}" />
|
IsEnabled="{Binding IsAmiiboRequested}" />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
Name="ScanAmiiboMenuItemFromBin"
|
Name="ScanAmiiboMenuItemFromBin"
|
||||||
|
|
|
||||||
|
|
@ -61,14 +61,21 @@
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<CheckBox Margin="10" Grid.Column="0" VerticalContentAlignment="Center" IsChecked="{Binding ShowAllAmiibo}"
|
<CheckBox Margin="10" Grid.Column="0" VerticalContentAlignment="Center" IsChecked="{Binding ShowAllAmiibo}"
|
||||||
Content="{locale:Locale AmiiboOptionsShowAllLabel}" />
|
Content="{locale:Locale AmiiboOptionsShowAllLabel}" />
|
||||||
<CheckBox Margin="10" VerticalContentAlignment="Center" Grid.Column="1" IsChecked="{Binding UseRandomUuid}"
|
<CheckBox HotKey="H"
|
||||||
|
Margin="10" VerticalContentAlignment="Center" Grid.Column="1"
|
||||||
|
IsChecked="{Binding UseRandomUuid}"
|
||||||
Content="{locale:Locale AmiiboOptionsUsRandomTagLabel}" />
|
Content="{locale:Locale AmiiboOptionsUsRandomTagLabel}" />
|
||||||
|
<Button Grid.Column="3"
|
||||||
<Button Grid.Column="3" IsEnabled="{Binding EnableScanning}" Width="80"
|
IsEnabled="{Binding EnableScanning}"
|
||||||
Content="{locale:Locale AmiiboScanButtonLabel}" Name="ScanButton"
|
Width="80"
|
||||||
|
Name="ScanButton"
|
||||||
|
HotKey="Return"
|
||||||
|
Content="{locale:Locale AmiiboScanButtonLabel}"
|
||||||
Click="ScanButton_Click" />
|
Click="ScanButton_Click" />
|
||||||
<Button Grid.Column="4" Margin="10,0" Width="80" Content="{locale:Locale InputDialogCancel}"
|
<Button Grid.Column="4" Margin="10,0" Width="80"
|
||||||
Name="CancelButton"
|
Name="CancelButton"
|
||||||
|
HotKey="Escape"
|
||||||
|
Content="{locale:Locale InputDialogCancel}"
|
||||||
Click="CancelButton_Click" />
|
Click="CancelButton_Click" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
||||||
|
|
@ -9,13 +9,11 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId)
|
public AmiiboWindow(bool showAll, string lastScannedAmiiboId, string titleId)
|
||||||
{
|
{
|
||||||
ViewModel = new AmiiboWindowViewModel(this, lastScannedAmiiboId, titleId)
|
DataContext = ViewModel = new AmiiboWindowViewModel(this, lastScannedAmiiboId, titleId)
|
||||||
{
|
{
|
||||||
ShowAllAmiibo = showAll,
|
ShowAllAmiibo = showAll,
|
||||||
};
|
};
|
||||||
|
|
||||||
DataContext = ViewModel;
|
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.Amiibo];
|
Title = $"Ryujinx {Program.Version} - " + LocaleManager.Instance[LocaleKeys.Amiibo];
|
||||||
|
|
@ -23,9 +21,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
|
|
||||||
public AmiiboWindow()
|
public AmiiboWindow()
|
||||||
{
|
{
|
||||||
ViewModel = new AmiiboWindowViewModel(this, string.Empty, string.Empty);
|
DataContext = ViewModel = new AmiiboWindowViewModel(this, string.Empty, string.Empty);
|
||||||
|
|
||||||
DataContext = ViewModel;
|
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
|
@ -37,24 +33,10 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
|
|
||||||
public bool IsScanned { get; set; }
|
public bool IsScanned { get; set; }
|
||||||
public AmiiboApi ScannedAmiibo { get; set; }
|
public AmiiboApi ScannedAmiibo { get; set; }
|
||||||
public AmiiboWindowViewModel ViewModel { get; set; }
|
public AmiiboWindowViewModel ViewModel;
|
||||||
|
|
||||||
private void ScanButton_Click(object sender, RoutedEventArgs e)
|
private void ScanButton_Click(object sender, RoutedEventArgs e) => ViewModel.Scan();
|
||||||
{
|
|
||||||
if (ViewModel.AmiiboSelectedIndex > -1)
|
|
||||||
{
|
|
||||||
AmiiboApi amiibo = ViewModel.AmiiboList[ViewModel.AmiiboSelectedIndex];
|
|
||||||
ScannedAmiibo = amiibo;
|
|
||||||
IsScanned = true;
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CancelButton_Click(object sender, RoutedEventArgs e)
|
private void CancelButton_Click(object sender, RoutedEventArgs e) => ViewModel.Cancel();
|
||||||
{
|
|
||||||
IsScanned = false;
|
|
||||||
|
|
||||||
Close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<window:StyleableWindow
|
<window:StyleableWindow
|
||||||
x:Class="Ryujinx.Ava.UI.Windows.CheatWindow"
|
x:Class="Ryujinx.Ava.UI.Windows.CheatWindow"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
|
@ -109,6 +109,7 @@
|
||||||
Name="SaveButton"
|
Name="SaveButton"
|
||||||
MinWidth="90"
|
MinWidth="90"
|
||||||
Margin="5"
|
Margin="5"
|
||||||
|
HotKey="Ctrl+S"
|
||||||
Command="{Binding Save}"
|
Command="{Binding Save}"
|
||||||
IsVisible="{Binding !NoCheatsFound}">
|
IsVisible="{Binding !NoCheatsFound}">
|
||||||
<TextBlock Text="{locale:Locale SettingsButtonSave}" />
|
<TextBlock Text="{locale:Locale SettingsButtonSave}" />
|
||||||
|
|
@ -117,6 +118,7 @@
|
||||||
Name="CancelButton"
|
Name="CancelButton"
|
||||||
MinWidth="90"
|
MinWidth="90"
|
||||||
Margin="5"
|
Margin="5"
|
||||||
|
HotKey="Escape"
|
||||||
Command="{Binding Close}">
|
Command="{Binding Close}">
|
||||||
<TextBlock Text="{locale:Locale InputDialogCancel}" />
|
<TextBlock Text="{locale:Locale InputDialogCancel}" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@
|
||||||
<KeyBinding Gesture="Ctrl+Cmd+F" Command="{Binding ToggleFullscreen}" />
|
<KeyBinding Gesture="Ctrl+Cmd+F" Command="{Binding ToggleFullscreen}" />
|
||||||
<KeyBinding Gesture="F9" Command="{Binding ToggleDockMode}" />
|
<KeyBinding Gesture="F9" Command="{Binding ToggleDockMode}" />
|
||||||
<KeyBinding Gesture="Escape" Command="{Binding ExitCurrentState}" />
|
<KeyBinding Gesture="Escape" Command="{Binding ExitCurrentState}" />
|
||||||
|
<KeyBinding Gesture="Ctrl+A" Command="{Binding OpenAmiiboWindow}" />
|
||||||
<KeyBinding Gesture="Ctrl+B" Command="{Binding OpenBinFile}" />
|
<KeyBinding Gesture="Ctrl+B" Command="{Binding OpenBinFile}" />
|
||||||
</Window.KeyBindings>
|
</Window.KeyBindings>
|
||||||
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
|
|
|
||||||
|
|
@ -67,9 +67,20 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
public readonly double StatusBarHeight;
|
public readonly double StatusBarHeight;
|
||||||
public readonly double MenuBarHeight;
|
public readonly double MenuBarHeight;
|
||||||
|
|
||||||
|
// The special window decoration from AppWindow in FluentAvalonia is only present on Windows;
|
||||||
|
// and as such optimizing for the fact that the menu bar and the title bar are the same is only needed on Windows.
|
||||||
|
// Maximized is considered superior to FullScreen on Windows in this case because you get the benefits of being in full screen,
|
||||||
|
// while still being able to use the standard 3 window controls in the top right to minimize, make the window smaller, or close the app.
|
||||||
|
|
||||||
|
public static readonly WindowState FullScreenWindowState =
|
||||||
|
OperatingSystem.IsWindows() ? WindowState.Maximized : WindowState.FullScreen;
|
||||||
|
|
||||||
public MainWindow()
|
public MainWindow()
|
||||||
{
|
{
|
||||||
ViewModel = new MainWindowViewModel();
|
DataContext = ViewModel = new MainWindowViewModel
|
||||||
|
{
|
||||||
|
Window = this
|
||||||
|
};
|
||||||
|
|
||||||
MainWindowViewModel = ViewModel;
|
MainWindowViewModel = ViewModel;
|
||||||
|
|
||||||
|
|
@ -220,7 +231,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
ViewModel.ShowContent = true;
|
ViewModel.ShowContent = true;
|
||||||
ViewModel.IsLoadingIndeterminate = false;
|
ViewModel.IsLoadingIndeterminate = false;
|
||||||
|
|
||||||
if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen)
|
if (startFullscreen && ViewModel.WindowState != MainWindow.FullScreenWindowState)
|
||||||
{
|
{
|
||||||
ViewModel.ToggleFullscreen();
|
ViewModel.ToggleFullscreen();
|
||||||
}
|
}
|
||||||
|
|
@ -232,7 +243,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
ViewModel.ShowLoadProgress = true;
|
ViewModel.ShowLoadProgress = true;
|
||||||
ViewModel.IsLoadingIndeterminate = true;
|
ViewModel.IsLoadingIndeterminate = true;
|
||||||
|
|
||||||
if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen)
|
if (startFullscreen && ViewModel.WindowState != MainWindow.FullScreenWindowState)
|
||||||
{
|
{
|
||||||
ViewModel.ToggleFullscreen();
|
ViewModel.ToggleFullscreen();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class ModManagerWindow : UserControl
|
public partial class ModManagerWindow : UserControl
|
||||||
{
|
{
|
||||||
public ModManagerViewModel ViewModel;
|
public readonly ModManagerViewModel ViewModel;
|
||||||
|
|
||||||
public ModManagerWindow()
|
public ModManagerWindow()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,13 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class SettingsWindow : StyleableWindow
|
public partial class SettingsWindow : StyleableWindow
|
||||||
{
|
{
|
||||||
internal SettingsViewModel ViewModel { get; set; }
|
internal readonly SettingsViewModel ViewModel;
|
||||||
|
|
||||||
public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
|
public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
|
||||||
{
|
{
|
||||||
Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]}";
|
Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance[LocaleKeys.Settings]}";
|
||||||
|
|
||||||
ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);
|
DataContext = ViewModel = new SettingsViewModel(virtualFileSystem, contentManager);
|
||||||
DataContext = ViewModel;
|
|
||||||
|
|
||||||
ViewModel.CloseWindow += Close;
|
ViewModel.CloseWindow += Close;
|
||||||
ViewModel.SaveSettingsEvent += SaveSettings;
|
ViewModel.SaveSettingsEvent += SaveSettings;
|
||||||
|
|
@ -28,8 +27,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||||
|
|
||||||
public SettingsWindow()
|
public SettingsWindow()
|
||||||
{
|
{
|
||||||
ViewModel = new SettingsViewModel();
|
DataContext = ViewModel = new SettingsViewModel();
|
||||||
DataContext = ViewModel;
|
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Load();
|
Load();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue