mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-05-25 22:49:15 +00:00
Ayyyy, welcome to the UI: Actions Menu → General Improvements PR!
We are soooo back boys and girls.
This is the first PR in a series aimed at delivering the largest overhaul and set of improvements to the Actions menu yet.
This initial PR introduces smaller visual and navigation improvements as part of the broader Actions menu refresh, while also serving as the starting point for locale fracturing across the entirety of Ryujinx. As this is a series of progressive PRs, bug fixes and additional refinements will continue to be rolled out throughout the series.
### GENERAL:
* **Fractured:** A bunch of locales. The following new files, and their designations, were created:
* `MenuBar_Actions.json` - all UI-related locales for the `Actions` menu
* `MenuBar_File.json` - all UI-related locales for the `File` menu
* `Dialog_Firmware.json` - all firmware-related dialog locales
* `Dialog_Keys.json` - all keys-related dialogs locales
* `Error.json` - all error-related locales
* `StatusBar.json` - all UI-related locales for the Status Bar
**NOTE:** To keep this PR manageable, `MenuBar_File.json`, `Error.json`, and `StatusBar.json` were NOT populated with their locales. Additionally, `RenderDoc.json` was deleted and all of its locales were moved to `MenuBar_Actions.json` because all RenderDoc locales are present only in the `Actions` menu.
* **Fixed:** Some typos in `Locales.md`.
### **DEFAULT ACTIONS:**
* **Added:** File picker dialog titles for `Install Firmware` and `Install Keys`.
* `Install Firmware`: "Select an XCI file or a ZIP archive to install firmware from" and "Select a folder to install firmware from".
* `Install Keys`: "Select a KEYS file to install keys from" and "Select a folder to install keys from".
* **Improved:** `Install Firmware` and `Install Keys` submenus.
* Submenus no longer have periods before file extensions; this avoids visual issues in right‑to‑left languages matches other emulators using uppercase extensions (e.g. `Install Firmware` → `Install Firmware (.XCI or .ZIP)` is now `Install Firmware` → `Install Firmware (XCI or ZIP)`).
* Submenus no longer repeat the main menu title; they now show only the specific option, making navigation cleaner (e.g. `Install Firmware` → `Install Firmware (XCI or ZIP)` is now `Install Firmware` → `XCI or ZIP`).
* Submenus now end with an ellipsis; this follows UI conventions that signal additional user input is required (e.g. `Install Firmware` → `XCI or ZIP...`).
* **Moved:** `Manage File Types` menu and submenu.
* These menus let Windows and Linux users associate formats like .xci and .nsp with the emulator so they can be opened by double‑clicking. macOS already handles this automatically when an app supports the format.
* Since this PR focuses on the `Actions` menu, this menu and its submenus have been moved under `File`, with their locales relocated to the new `MenuBar_File.json`.
* This menu is useful but currently too vague about its purpose. A later PR will refine and clarify it.
* **Improved:** `Mii Editor`
* Removed the `Mii Editor` tooltip, as the menu was already self‑explanatory.
* The loading text for the `Mii Editor` is now locale-dynamic, instead of the previously static "miiEdit".
### **IN-GAME ACTIONS:**
* **Updated:** Menu grouping with separators (see images below)
* **Renamed:** `Resume` to `Resume Emulation` and `Pause` to `Pause Emulation`, ensuring consistency with the other options.
* **Fixed:** `Pause Emulation`/`Resume Emulation` UI Bug
* Previously, if a user paused emulation and then exited the game without closing the emulator, the next game launch would incorrectly show `Resume Emulation`, as though the new game were paused.
* **Updated:** `Scan Amiibo` and `Scan Skylander` icons to a chess rook and dragon, making them clearer and more fun than the previous cubes.
* **Added:** Shortcut for `Simulate Wake-up Message`
* Few games support it, but an in‑game shortcut still helps players who use it often.
* **Removed:** `Manage Cheats` from the menu
* `Manage Cheats` doesn't properly work in-game right now, and is removed in this PR. It will be returned to later in Part 4.
Please see the image comparisons below.
_If there are any features or changes that you wish to be implemented, please comment down below and I'll be happy to accommodate!_
Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/42
336 lines
16 KiB
XML
336 lines
16 KiB
XML
<UserControl
|
|
xmlns="https://github.com/avaloniaui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
|
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
|
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
|
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
|
xmlns:config="clr-namespace:Ryujinx.Common.Configuration;assembly=Ryujinx.Common"
|
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
|
x:Class="Ryujinx.Ava.UI.Views.Main.MainStatusBarView"
|
|
x:DataType="viewModels:MainWindowViewModel">
|
|
<Design.DataContext>
|
|
<viewModels:MainWindowViewModel />
|
|
</Design.DataContext>
|
|
<Grid
|
|
Name="StatusBar"
|
|
Margin="0"
|
|
MinHeight="22"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Bottom"
|
|
Background="{DynamicResource ThemeContentBackgroundColor}"
|
|
DockPanel.Dock="Bottom"
|
|
IsVisible="{Binding ShowMenuAndStatusBar}"
|
|
ColumnDefinitions="Auto,Auto,*,Auto,Auto,Auto">
|
|
<StackPanel
|
|
Grid.Column="0"
|
|
Margin="5"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding EnableNonGameRunningControls}">
|
|
<Grid Margin="0" ColumnDefinitions="Auto,Auto,Auto,*,Auto,Auto,*">
|
|
<Button
|
|
Width="25"
|
|
Height="25"
|
|
MinWidth="0"
|
|
Margin="0,0,5,0"
|
|
VerticalAlignment="Center"
|
|
Background="Transparent"
|
|
Click="Refresh_OnClick">
|
|
<ui:SymbolIcon
|
|
Width="50"
|
|
Height="100"
|
|
Symbol="Refresh" />
|
|
</Button>
|
|
<TextBlock
|
|
Name="LoadStatus"
|
|
Grid.Column="1"
|
|
Margin="0,0,5,0"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding EnableNonGameRunningControls}"
|
|
Text="{ext:Locale StatusBarGamesLoaded}" />
|
|
<TextBlock
|
|
Name="StatusBarProgressStatus"
|
|
Grid.Column="2"
|
|
MinWidth="200"
|
|
Margin="10,0,5,0"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding StatusBarProgressStatusVisible}"
|
|
Text="{Binding StatusBarProgressStatusText}" />
|
|
<ProgressBar
|
|
Name="LoadProgressBar"
|
|
Grid.Column="3"
|
|
MinWidth="200"
|
|
Height="6"
|
|
VerticalAlignment="Center"
|
|
Margin="0, 0, 5, 0"
|
|
Foreground="{DynamicResource SystemAccentColorLight2}"
|
|
IsVisible="{Binding StatusBarVisible}"
|
|
Maximum="{Binding StatusBarProgressMaximum}"
|
|
Value="{Binding StatusBarProgressValue}" />
|
|
<controls:MiniVerticalSeparator Grid.Column="4" IsVisible="{Binding ShowTotalTimePlayed}" />
|
|
<TextBlock
|
|
Grid.Column="5"
|
|
Margin="5,0,5,0"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding ShowTotalTimePlayed}"
|
|
Text="{ext:Locale GameListLabelTotalTimePlayed}">
|
|
</TextBlock>
|
|
</Grid>
|
|
</StackPanel>
|
|
<StackPanel
|
|
Grid.Column="1"
|
|
Margin="0,2"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding IsGameRunning}"
|
|
MaxHeight="18"
|
|
Orientation="Horizontal">
|
|
<TextBlock
|
|
Name="VSyncMode"
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
Foreground="{Binding VSyncModeColor}"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
PointerReleased="VSyncMode_PointerReleased"
|
|
Text="{Binding VSyncModeText}"
|
|
TextAlignment="Start"/>
|
|
<Button MinWidth="0"
|
|
Width="20"
|
|
IsVisible="{Binding ShowCustomVSyncIntervalPicker}"
|
|
Margin="-5,0,5,0"
|
|
Background="Transparent"
|
|
BorderThickness="0">
|
|
<ui:SymbolIcon Symbol="Settings"
|
|
HorizontalAlignment="Stretch"
|
|
VerticalAlignment="Center"
|
|
Width="14"
|
|
Height="14"/>
|
|
<Button.Styles>
|
|
<Style Selector=":checked">
|
|
<Style Selector="^:checked ContentPresenter">
|
|
<Setter Property="Foreground" Value="{DynamicResource ThemeForegroundColor}" />
|
|
</Style>
|
|
</Style>
|
|
<Style Selector="Border#SeparatorBorder">
|
|
<Setter Property="Opacity" Value="0" />
|
|
</Style>
|
|
</Button.Styles>
|
|
<Button.Flyout>
|
|
<Flyout Placement="Top" ShowMode="TransientWithDismissOnPointerMoveAway">
|
|
<StackPanel Margin="0,0,0,0"
|
|
Orientation="Horizontal">
|
|
<Slider Value="{Binding CustomVSyncIntervalPercentageProxy}"
|
|
MinWidth="175"
|
|
Margin="0,-3,0,0"
|
|
Height="32"
|
|
Padding="0,-5"
|
|
TickFrequency="1"
|
|
IsSnapToTickEnabled="True"
|
|
LargeChange="10"
|
|
SmallChange="1"
|
|
VerticalAlignment="Center"
|
|
Minimum="10"
|
|
Maximum="400" />
|
|
<TextBlock Margin="5,0"
|
|
Width="40"
|
|
Text="{Binding CustomVSyncIntervalPercentageText}"/>
|
|
</StackPanel>
|
|
</Flyout>
|
|
</Button.Flyout>
|
|
</Button>
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
|
|
<TextBlock
|
|
Name="DockedStatus"
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
PointerReleased="DockedStatus_PointerReleased"
|
|
Text="{Binding DockedStatusText}"
|
|
TextAlignment="Start" />
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
|
|
<SplitButton
|
|
Name="AspectRatioStatus"
|
|
Padding="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
Background="Transparent"
|
|
BorderThickness="0"
|
|
CornerRadius="0"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
Content="{Binding AspectRatioStatusText}"
|
|
Click="AspectRatioStatus_OnClick"
|
|
ToolTip.Tip="{ext:Locale AspectRatioTooltip}">
|
|
<SplitButton.Styles>
|
|
<Style Selector="Border#SeparatorBorder">
|
|
<Setter Property="Opacity" Value="0" />
|
|
</Style>
|
|
</SplitButton.Styles>
|
|
<SplitButton.Flyout>
|
|
<MenuFlyout Placement="Bottom" ShowMode="TransientWithDismissOnPointerMoveAway">
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatio4x3}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Fixed4x3}"/>
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatio16x9}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Fixed16x9}"/>
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatio16x10}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Fixed16x10}"/>
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatio21x9}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Fixed21x9}"/>
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatio32x9}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Fixed32x9}"/>
|
|
<MenuItem
|
|
Header="{ext:Locale SettingsTabGraphicsAspectRatioStretch}"
|
|
Command="{Binding SetAspectRatio}"
|
|
CommandParameter="{x:Static config:AspectRatio.Stretched}"/>
|
|
</MenuFlyout>
|
|
</SplitButton.Flyout>
|
|
</SplitButton>
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
|
|
<ToggleSplitButton
|
|
Name="VolumeStatus"
|
|
Padding="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
VerticalContentAlignment="Center"
|
|
Content="{Binding VolumeStatusText}"
|
|
IsChecked="{Binding VolumeMuted}"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
PointerWheelChanged="VolumeStatus_OnPointerWheelChanged"
|
|
Background="Transparent"
|
|
BorderThickness="0"
|
|
CornerRadius="0">
|
|
<ToggleSplitButton.Styles>
|
|
<Style Selector=":checked">
|
|
<Style Selector="^:checked ContentPresenter">
|
|
<Setter Property="Foreground" Value="{DynamicResource ThemeForegroundColor}" />
|
|
</Style>
|
|
</Style>
|
|
<Style Selector="Border#SeparatorBorder">
|
|
<Setter Property="Opacity" Value="0" />
|
|
</Style>
|
|
</ToggleSplitButton.Styles>
|
|
<ToggleSplitButton.Flyout>
|
|
<Flyout Placement="Bottom" ShowMode="TransientWithDismissOnPointerMoveAway">
|
|
<Grid Margin="0">
|
|
<controls:SliderScroll
|
|
MaxHeight="40"
|
|
Width="150"
|
|
Margin="0"
|
|
Padding="0"
|
|
IsSnapToTickEnabled="True"
|
|
LargeChange="0.05"
|
|
Maximum="1"
|
|
Minimum="0"
|
|
SmallChange="0.01"
|
|
TickFrequency="0.05"
|
|
Value="{Binding Volume}" />
|
|
</Grid>
|
|
</Flyout>
|
|
</ToggleSplitButton.Flyout>
|
|
</ToggleSplitButton>
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
|
|
<TextBlock
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
Text="{Binding GameStatusText}"
|
|
TextAlignment="Start" />
|
|
<controls:MiniVerticalSeparator>
|
|
<controls:MiniVerticalSeparator.IsVisible>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="!ShowLoadProgress"/>
|
|
<Binding Path="!IsPaused"/>
|
|
</MultiBinding>
|
|
</controls:MiniVerticalSeparator.IsVisible>
|
|
</controls:MiniVerticalSeparator>
|
|
<TextBlock
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
Text="{Binding FifoStatusText}"
|
|
TextAlignment="Start" />
|
|
</StackPanel>
|
|
<StackPanel
|
|
Grid.Column="3"
|
|
Margin="0, 0, 5, 0"
|
|
IsVisible="{Binding IsGameRunning}"
|
|
VerticalAlignment="Center"
|
|
Orientation="Horizontal">
|
|
<TextBlock
|
|
Name="ShaderCount"
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding ShowShaderCompilationHint}"
|
|
Text="{Binding ShaderCountText}" />
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding ShowShaderCompilationHint}" />
|
|
<TextBlock
|
|
Margin="5,0,5,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
Text="{Binding BackendText}"
|
|
TextAlignment="Start" />
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
|
|
<TextBlock
|
|
Margin="5,0,0,0"
|
|
HorizontalAlignment="Left"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding !ShowLoadProgress}"
|
|
Text="{Binding GpuNameText}"
|
|
TextAlignment="Start" />
|
|
</StackPanel>
|
|
<StackPanel
|
|
Grid.Column="4"
|
|
Margin="0,0,5,0"
|
|
Orientation="Horizontal">
|
|
<StackPanel.IsVisible>
|
|
<MultiBinding Converter="{x:Static BoolConverters.And}">
|
|
<Binding Path="EnableNonGameRunningControls" />
|
|
<Binding Path="UpdateAvailable" />
|
|
</MultiBinding>
|
|
</StackPanel.IsVisible>
|
|
<Button Margin="0, 0, 5, -2"
|
|
Command="{Binding UpdateCommand}"
|
|
Background="{DynamicResource SystemAccentColor}">
|
|
<TextBlock
|
|
Margin="-5"
|
|
Foreground="{StaticResource SystemColorButtonTextColor}"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center"
|
|
Text="{ext:Locale UpdaterBackgroundStatusBarButtonText}" />
|
|
</Button>
|
|
<controls:MiniVerticalSeparator Margin="5,0,0,0"/>
|
|
</StackPanel>
|
|
<StackPanel
|
|
Grid.Column="5"
|
|
Margin="0,0,5,0"
|
|
VerticalAlignment="Center"
|
|
IsVisible="{Binding ShowFirmwareStatus}"
|
|
Orientation="Horizontal">
|
|
<controls:MiniVerticalSeparator IsVisible="{Binding IsGameRunning}" />
|
|
<TextBlock
|
|
Name="FirmwareStatus"
|
|
Margin="5, 0, 0, 0"
|
|
HorizontalAlignment="Right"
|
|
VerticalAlignment="Center"
|
|
Text="{ext:Locale StatusBar_FirmwareVersion}" />
|
|
</StackPanel>
|
|
</Grid>
|
|
</UserControl>
|