diff options
| author | Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> | 2023-01-08 12:46:25 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-08 18:46:25 +0100 |
| commit | eeb2af9953f48479c3a902664f31634e6a2148be (patch) | |
| tree | 3a861bbe80e48bce520ff022cc7421469bc8d38d /Ryujinx.Ava/UI/Windows | |
| parent | 550747eac6c0f6da14070c8b6d208bde6f1d1eb9 (diff) | |
Ava GUI: `MainWindow` Refactor (#4178)
* Fix redundancies
* Add back elses
* `MainWindow` Refactor
* Switch commands to `ReflectionBinding`
Not required in Ava 11
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/AppHost.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Views/Main/MainMenuBarView.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Update Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs
Co-authored-by: Ac_K <Acoustik666@gmail.com>
* Resolve issues
* Remove Ava 11 Fix
* Update Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
* Update Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
* Fix whitespace + other suggestions
* Move Vsync colours to `Styles.xaml`
* Remove catch all
* Use `switch` instead of `if`
* Update locale keys
* Use block-scoped namespaces
* Fix improper Ava api usage then
* Static PTC
* Fix `GridItemSelectorSize` with `ShowNames`
* Update for new About Window
* Add back search fix
Co-authored-by: Ac_K <Acoustik666@gmail.com>
Co-authored-by: gdkchan <gab.dark.100@gmail.com>
Diffstat (limited to 'Ryujinx.Ava/UI/Windows')
| -rw-r--r-- | Ryujinx.Ava/UI/Windows/MainWindow.axaml | 606 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs | 521 |
2 files changed, 139 insertions, 988 deletions
diff --git a/Ryujinx.Ava/UI/Windows/MainWindow.axaml b/Ryujinx.Ava/UI/Windows/MainWindow.axaml index 63d939a8..c3d34e75 100644 --- a/Ryujinx.Ava/UI/Windows/MainWindow.axaml +++ b/Ryujinx.Ava/UI/Windows/MainWindow.axaml @@ -2,15 +2,16 @@ x:Class="Ryujinx.Ava.UI.Windows.MainWindow" xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" - xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows" + xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers" - Title="Ryujinx" + xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls" + xmlns:main="clr-namespace:Ryujinx.Ava.UI.Views.Main" + Cursor="{Binding Cursor}" + Title="{Binding Title}" + WindowState="{Binding WindowState}" Width="1280" Height="777" MinWidth="1092" @@ -66,206 +67,8 @@ VerticalAlignment="Stretch" IsVisible="{Binding ShowMenuAndStatusBar}" Orientation="Vertical"> - <DockPanel HorizontalAlignment="Stretch"> - <Menu - Name="Menu" - Height="35" - Margin="0" - HorizontalAlignment="Left"> - <Menu.ItemsPanel> - <ItemsPanelTemplate> - <DockPanel Margin="0" HorizontalAlignment="Stretch" /> - </ItemsPanelTemplate> - </Menu.ItemsPanel> - <MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarFile}"> - <MenuItem - Command="{ReflectionBinding OpenFile}" - Header="{locale:Locale MenuBarFileOpenFromFile}" - IsEnabled="{Binding EnableNonGameRunningControls}" - ToolTip.Tip="{locale:Locale LoadApplicationFileTooltip}" /> - <MenuItem - Command="{ReflectionBinding OpenFolder}" - Header="{locale:Locale MenuBarFileOpenUnpacked}" - IsEnabled="{Binding EnableNonGameRunningControls}" - ToolTip.Tip="{locale:Locale LoadApplicationFolderTooltip}" /> - <MenuItem Header="{locale:Locale MenuBarFileOpenApplet}" IsEnabled="{Binding IsAppletMenuActive}"> - <MenuItem - Command="{ReflectionBinding OpenMiiApplet}" - Header="Mii Edit Applet" - ToolTip.Tip="{locale:Locale MenuBarFileOpenAppletOpenMiiAppletToolTip}" /> - </MenuItem> - <Separator /> - <MenuItem - Command="{ReflectionBinding OpenRyujinxFolder}" - Header="{locale:Locale MenuBarFileOpenEmuFolder}" - ToolTip.Tip="{locale:Locale OpenRyujinxFolderTooltip}" /> - <MenuItem - Command="{ReflectionBinding OpenLogsFolder}" - Header="{locale:Locale MenuBarFileOpenLogsFolder}" - ToolTip.Tip="{locale:Locale OpenRyujinxLogsTooltip}" /> - <Separator /> - <MenuItem - Command="{ReflectionBinding CloseWindow}" - Header="{locale:Locale MenuBarFileExit}" - ToolTip.Tip="{locale:Locale ExitTooltip}" /> - </MenuItem> - <MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarOptions}"> - <MenuItem - Command="{ReflectionBinding ToggleFullscreen}" - Header="{locale:Locale MenuBarOptionsToggleFullscreen}" - InputGesture="F11" /> - <MenuItem> - <MenuItem.Icon> - <CheckBox IsChecked="{Binding StartGamesInFullscreen, Mode=TwoWay}" - MinWidth="250"> - <TextBlock Text="{locale:Locale MenuBarOptionsStartGamesInFullscreen}"/> - </CheckBox> - </MenuItem.Icon> - </MenuItem> - <MenuItem IsVisible="{Binding ShowConsoleVisible}"> - <MenuItem.Icon> - <CheckBox IsChecked="{Binding ShowConsole, Mode=TwoWay}" - MinWidth="250"> - <TextBlock Text="{locale:Locale MenuBarOptionsShowConsole}"/> - </CheckBox> - </MenuItem.Icon> - </MenuItem> - <Separator /> - <MenuItem Header="{locale:Locale MenuBarOptionsChangeLanguage}"> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="de_DE" - Header="Deutsch" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="en_US" - Header="English (US)" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="es_ES" - Header="Español (ES)" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="fr_FR" - Header="Français" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="it_IT" - Header="Italiano" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="pt_BR" - Header="Português (BR)" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="tr_TR" - Header="Türkçe" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="el_GR" - Header="Ελληνικά" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="pl_PL" - Header="Polski" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="ru_RU" - Header="Русский" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="zh_CN" - Header="简体中文" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="zh_TW" - Header="繁體中文" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="ja_JP" - Header="日本語" /> - <MenuItem - Command="{ReflectionBinding ChangeLanguage}" - CommandParameter="ko_KR" - Header="한국어" /> - </MenuItem> - <Separator /> - <MenuItem - Command="{ReflectionBinding OpenSettings}" - Header="{locale:Locale MenuBarOptionsSettings}" - ToolTip.Tip="{locale:Locale OpenSettingsTooltip}" /> - <MenuItem - Command="{ReflectionBinding ManageProfiles}" - Header="{locale:Locale MenuBarOptionsManageUserProfiles}" - IsEnabled="{Binding EnableNonGameRunningControls}" - ToolTip.Tip="{locale:Locale OpenProfileManagerTooltip}" /> - </MenuItem> - <MenuItem - Name="ActionsMenuItem" - VerticalAlignment="Center" - Header="{locale:Locale MenuBarActions}" - IsEnabled="{Binding IsGameRunning}"> - <MenuItem - Click="PauseEmulation_Click" - Header="{locale:Locale MenuBarOptionsPauseEmulation}" - InputGesture="{Binding PauseKey}" - IsEnabled="{Binding !IsPaused}" - IsVisible="{Binding !IsPaused}" /> - <MenuItem - Click="ResumeEmulation_Click" - Header="{locale:Locale MenuBarOptionsResumeEmulation}" - InputGesture="{Binding PauseKey}" - IsEnabled="{Binding IsPaused}" - IsVisible="{Binding IsPaused}" /> - <MenuItem - Click="StopEmulation_Click" - Header="{locale:Locale MenuBarOptionsStopEmulation}" - InputGesture="Escape" - IsEnabled="{Binding IsGameRunning}" - ToolTip.Tip="{locale:Locale StopEmulationTooltip}" /> - <MenuItem Command="{ReflectionBinding SimulateWakeUpMessage}" Header="{locale:Locale MenuBarOptionsSimulateWakeUpMessage}" /> - <Separator /> - <MenuItem - Name="ScanAmiiboMenuItem" - AttachedToVisualTree="ScanAmiiboMenuItem_AttachedToVisualTree" - Command="{ReflectionBinding OpenAmiiboWindow}" - Header="{locale:Locale MenuBarActionsScanAmiibo}" - IsEnabled="{Binding IsAmiiboRequested}" /> - <MenuItem - Command="{ReflectionBinding TakeScreenshot}" - Header="{locale:Locale MenuBarFileToolsTakeScreenshot}" - InputGesture="{Binding ScreenshotKey}" - IsEnabled="{Binding IsGameRunning}" /> - <MenuItem - Command="{ReflectionBinding HideUi}" - Header="{locale:Locale MenuBarFileToolsHideUi}" - InputGesture="{Binding ShowUiKey}" - IsEnabled="{Binding IsGameRunning}" /> - <MenuItem - Command="{ReflectionBinding OpenCheatManagerForCurrentApp}" - Header="{locale:Locale GameListContextMenuManageCheat}" - IsEnabled="{Binding IsGameRunning}" /> - </MenuItem> - <MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarTools}"> - <MenuItem Header="{locale:Locale MenuBarToolsInstallFirmware}" IsEnabled="{Binding EnableNonGameRunningControls}"> - <MenuItem Command="{ReflectionBinding InstallFirmwareFromFile}" Header="{locale:Locale MenuBarFileToolsInstallFirmwareFromFile}" /> - <MenuItem Command="{ReflectionBinding InstallFirmwareFromFolder}" Header="{locale:Locale MenuBarFileToolsInstallFirmwareFromDirectory}" /> - </MenuItem> - </MenuItem> - <MenuItem VerticalAlignment="Center" Header="{locale:Locale MenuBarHelp}"> - <MenuItem - Name="UpdateMenuItem" - Command="{ReflectionBinding CheckForUpdates}" - Header="{locale:Locale MenuBarHelpCheckForUpdates}" - ToolTip.Tip="{locale:Locale CheckUpdatesTooltip}" /> - <Separator /> - <MenuItem - Command="{ReflectionBinding OpenAboutWindow}" - Header="{locale:Locale MenuBarHelpAbout}" - ToolTip.Tip="{locale:Locale OpenAboutTooltip}" /> - </MenuItem> - </Menu> - </DockPanel> + <main:MainMenuBarView + Name="MenuBarView" /> </StackPanel> <ContentControl Name="MainContent" @@ -277,171 +80,14 @@ BorderThickness="0,0,0,0" DockPanel.Dock="Top" IsVisible="{Binding ShowContent}"> - <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> + <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="GameLibrary"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> - <DockPanel - Grid.Row="0" - Margin="0,0,0,5" - HorizontalAlignment="Stretch"> - <Button - Width="40" - MinWidth="40" - Margin="5,2,0,2" - VerticalAlignment="Stretch" - Command="{ReflectionBinding SetListMode}" - IsEnabled="{Binding IsGrid}"> - <ui:FontIcon - Margin="0" - HorizontalAlignment="Stretch" - VerticalAlignment="Center" - FontFamily="avares://FluentAvalonia/Fonts#Symbols" - Glyph="{helpers:GlyphValueConverter List}" /> - </Button> - <Button - Width="40" - MinWidth="40" - Margin="5,2,5,2" - VerticalAlignment="Stretch" - Command="{ReflectionBinding SetGridMode}" - IsEnabled="{Binding IsList}"> - <ui:FontIcon - Margin="0" - HorizontalAlignment="Stretch" - VerticalAlignment="Center" - FontFamily="avares://FluentAvalonia/Fonts#Symbols" - Glyph="{helpers:GlyphValueConverter Grid}" /> - </Button> - <TextBlock - Margin="10,0" - VerticalAlignment="Center" - Text="{locale:Locale IconSize}" - ToolTip.Tip="{locale:Locale IconSizeTooltip}" /> - <Slider - Width="150" - Height="35" - Margin="5,-10,5,0" - VerticalAlignment="Center" - IsSnapToTickEnabled="True" - Maximum="4" - Minimum="1" - TickFrequency="1" - ToolTip.Tip="{locale:Locale IconSizeTooltip}" - Value="{Binding GridSizeScale}" /> - <CheckBox - Margin="0" - VerticalAlignment="Center" - IsChecked="{Binding ShowNames, Mode=TwoWay}" - IsVisible="{Binding IsGrid}"> - <TextBlock Margin="5,3,0,0" Text="{locale:Locale CommonShowNames}" /> - </CheckBox> - <TextBox - Name="SearchBox" - MinWidth="200" - Margin="5,0,5,0" - HorizontalAlignment="Right" - VerticalAlignment="Center" - VerticalContentAlignment="Center" - DockPanel.Dock="Right" - KeyUp="SearchBox_OnKeyUp" - Text="{Binding SearchText}" - Watermark="{locale:Locale MenuSearch}" /> - <ui:DropDownButton - Width="150" - HorizontalAlignment="Right" - VerticalAlignment="Center" - Content="{Binding SortName}" - DockPanel.Dock="Right"> - <ui:DropDownButton.Flyout> - <Flyout Placement="Bottom"> - <StackPanel - Margin="0" - HorizontalAlignment="Stretch" - Orientation="Vertical"> - <StackPanel> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale CommonFavorite}" - GroupName="Sort" - IsChecked="{Binding IsSortedByFavorite, Mode=OneTime}" - Tag="Favorite" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderApplication}" - GroupName="Sort" - IsChecked="{Binding IsSortedByTitle, Mode=OneTime}" - Tag="Title" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderDeveloper}" - GroupName="Sort" - IsChecked="{Binding IsSortedByDeveloper, Mode=OneTime}" - Tag="Developer" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderTimePlayed}" - GroupName="Sort" - IsChecked="{Binding IsSortedByTimePlayed, Mode=OneTime}" - Tag="TotalTimePlayed" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderLastPlayed}" - GroupName="Sort" - IsChecked="{Binding IsSortedByLastPlayed, Mode=OneTime}" - Tag="LastPlayed" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderFileExtension}" - GroupName="Sort" - IsChecked="{Binding IsSortedByType, Mode=OneTime}" - Tag="FileType" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderFileSize}" - GroupName="Sort" - IsChecked="{Binding IsSortedBySize, Mode=OneTime}" - Tag="FileSize" /> - <RadioButton - Checked="Sort_Checked" - Content="{locale:Locale GameListHeaderPath}" - GroupName="Sort" - IsChecked="{Binding IsSortedByPath, Mode=OneTime}" - Tag="Path" /> - </StackPanel> - <Border - Width="60" - Height="2" - Margin="5" - HorizontalAlignment="Stretch" - BorderBrush="White" - BorderThickness="0,1,0,0"> - <Separator Height="0" HorizontalAlignment="Stretch" /> - </Border> - <RadioButton - Checked="Order_Checked" - Content="{locale:Locale OrderAscending}" - GroupName="Order" - IsChecked="{Binding IsAscending, Mode=OneTime}" - Tag="Ascending" /> - <RadioButton - Checked="Order_Checked" - Content="{locale:Locale OrderDescending}" - GroupName="Order" - IsChecked="{Binding !IsAscending, Mode=OneTime}" - Tag="Descending" /> - </StackPanel> - </Flyout> - </ui:DropDownButton.Flyout> - </ui:DropDownButton> - <TextBlock - Margin="10,0" - HorizontalAlignment="Right" - VerticalAlignment="Center" - DockPanel.Dock="Right" - Text="{locale:Locale CommonSort}" /> - </DockPanel> + <main:MainViewControls + Name="ViewControls" + Grid.Row="0"/> <controls:GameListView x:Name="GameList" Grid.Row="1" @@ -513,7 +159,8 @@ IsVisible="{Binding ShowLoadProgress}" Text="{Binding LoadHeading}" TextAlignment="Left" - TextWrapping="Wrap" /> + TextWrapping="Wrap" + MaxWidth="500" /> <Border Grid.Row="1" Margin="10" @@ -530,7 +177,6 @@ Margin="0" Padding="0" HorizontalAlignment="Stretch" - Background="{Binding ProgressBarBackgroundColor}" ClipToBounds="True" CornerRadius="5" Foreground="{Binding ProgressBarForegroundColor}" @@ -546,226 +192,14 @@ FontSize="18" IsVisible="{Binding ShowLoadProgress}" Text="{Binding CacheLoadStatus}" - TextAlignment="Left" /> + TextAlignment="Left" + MaxWidth="500" /> </Grid> </Grid> </Grid> - <Grid - Name="StatusBar" - Grid.Row="2" - Margin="0" - MinHeight="22" - HorizontalAlignment="Stretch" - VerticalAlignment="Bottom" - Background="{DynamicResource ThemeContentBackgroundColor}" - DockPanel.Dock="Bottom" - IsVisible="{Binding ShowMenuAndStatusBar}"> - <Grid.ColumnDefinitions> - <ColumnDefinition Width="Auto" /> - <ColumnDefinition Width="Auto" /> - <ColumnDefinition Width="*" /> - <ColumnDefinition Width="Auto" /> - </Grid.ColumnDefinitions> - <StackPanel - Grid.Column="0" - Margin="5" - VerticalAlignment="Center" - IsVisible="{Binding EnableNonGameRunningControls}"> - <Grid Margin="0"> - <Grid.ColumnDefinitions> - <ColumnDefinition Width="Auto" /> - <ColumnDefinition Width="Auto" /> - <ColumnDefinition /> - </Grid.ColumnDefinitions> - <Button - Width="25" - Height="25" - MinWidth="0" - Margin="0,0,5,0" - VerticalAlignment="Center" - Background="Transparent" - Command="{ReflectionBinding LoadApplications}"> - <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="{locale:Locale StatusBarGamesLoaded}" /> - <ProgressBar - Name="LoadProgressBar" - Grid.Column="2" - Height="6" - VerticalAlignment="Center" - Foreground="{DynamicResource HighlightColor}" - IsVisible="{Binding EnableNonGameRunningControls}" - Maximum="{Binding StatusBarProgressMaximum}" - Value="{Binding StatusBarProgressValue}" /> - </Grid> - </StackPanel> - <StackPanel - Grid.Column="1" - Margin="0,2" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding IsGameRunning}" - Orientation="Horizontal"> - <TextBlock - Name="VsyncStatus" - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - Foreground="{Binding VsyncColor}" - IsVisible="{Binding !ShowLoadProgress}" - PointerReleased="VsyncStatus_PointerReleased" - Text="VSync" - TextAlignment="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - 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="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <TextBlock - Name="AspectRatioStatus" - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding !ShowLoadProgress}" - PointerReleased="AspectRatioStatus_PointerReleased" - Text="{Binding AspectRatioStatusText}" - TextAlignment="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <ui:ToggleSplitButton - Name="VolumeStatus" - Padding="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - VerticalContentAlignment="Center" - Background="{DynamicResource ThemeContentBackgroundColor}" - BorderThickness="0" - Content="{Binding VolumeStatusText}" - IsChecked="{Binding VolumeMuted}" - IsVisible="{Binding !ShowLoadProgress}"> - <ui:ToggleSplitButton.Flyout> - <Flyout Placement="Bottom" ShowMode="TransientWithDismissOnPointerMoveAway"> - <Grid Margin="0"> - <Slider - MaxHeight="40" - Width="150" - Margin="0" - Padding="0" - IsSnapToTickEnabled="True" - LargeChange="0.05" - Maximum="1" - Minimum="0" - SmallChange="0.01" - TickFrequency="0.05" - ToolTip.Tip="{locale:Locale AudioVolumeTooltip}" - Value="{Binding Volume}" /> - </Grid> - </Flyout> - </ui:ToggleSplitButton.Flyout> - </ui:ToggleSplitButton> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <TextBlock - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding !ShowLoadProgress}" - Text="{Binding GameStatusText}" - TextAlignment="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <TextBlock - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding !ShowLoadProgress}" - Text="{Binding FifoStatusText}" - TextAlignment="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <TextBlock - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding !ShowLoadProgress}" - Text="{Binding BackendText}" - TextAlignment="Left" /> - <Border - Width="2" - Height="12" - Margin="0" - BorderBrush="Gray" - BorderThickness="1" - IsVisible="{Binding !ShowLoadProgress}" /> - <TextBlock - Margin="5,0,5,0" - HorizontalAlignment="Left" - VerticalAlignment="Center" - IsVisible="{Binding !ShowLoadProgress}" - Text="{Binding GpuNameText}" - TextAlignment="Left" /> - </StackPanel> - <StackPanel - Grid.Column="3" - Margin="0,0,5,0" - VerticalAlignment="Center" - IsVisible="{Binding ShowFirmwareStatus}" - Orientation="Horizontal"> - <TextBlock - Name="FirmwareStatus" - Margin="0" - HorizontalAlignment="Right" - VerticalAlignment="Center" - Text="{locale:Locale StatusBarSystemVersion}" /> - </StackPanel> - </Grid> + <main:MainStatusBarView + Name="StatusBarView" + Grid.Row="2" /> </Grid> </Grid> -</window:StyleableWindow> +</window:StyleableWindow>
\ No newline at end of file diff --git a/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs b/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs index b2d822c3..3c4534c5 100644 --- a/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs +++ b/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs @@ -1,19 +1,14 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Input; -using Avalonia.Interactivity; -using Avalonia.Media; using Avalonia.Threading; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; using Ryujinx.Ava.UI.Applet; -using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.UI.Models; using Ryujinx.Ava.UI.ViewModels; -using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.FileSystem; @@ -25,11 +20,9 @@ using Ryujinx.Ui.App.Common; using Ryujinx.Ui.Common; using Ryujinx.Ui.Common.Configuration; using Ryujinx.Ui.Common.Helper; -using SixLabors.ImageSharp.PixelFormats; using System; using System.ComponentModel; using System.IO; -using System.Threading; using System.Threading.Tasks; using InputManager = Ryujinx.Input.HLE.InputManager; @@ -38,19 +31,14 @@ namespace Ryujinx.Ava.UI.Windows public partial class MainWindow : StyleableWindow { internal static MainWindowViewModel MainWindowViewModel { get; private set; } - private bool _canUpdate; - private bool _isClosing; - private bool _isLoading; - private Control _mainViewContent; + private bool _isLoading; private UserChannelPersistence _userChannelPersistence; private static bool _deferLoad; private static string _launchPath; private static bool _startFullscreen; - private string _currentEmulatedGamePath; internal readonly AvaHostUiHandler UiHandler; - private AutoResetEvent _rendererWaitEvent; public VirtualFileSystem VirtualFileSystem { get; private set; } public ContentManager ContentManager { get; private set; } @@ -58,30 +46,17 @@ namespace Ryujinx.Ava.UI.Windows public LibHacHorizonManager LibHacHorizonManager { get; private set; } - internal AppHost AppHost { get; private set; } public InputManager InputManager { get; private set; } - internal RendererHost RendererControl { get; private set; } internal MainWindowViewModel ViewModel { get; private set; } public SettingsWindow SettingsWindow { get; set; } - public bool CanUpdate - { - get => _canUpdate; - set - { - _canUpdate = value; - - Dispatcher.UIThread.InvokeAsync(() => UpdateMenuItem.IsEnabled = _canUpdate); - } - } - public static bool ShowKeyErrorOnLoad { get; set; } public ApplicationLibrary ApplicationLibrary { get; set; } public MainWindow() { - ViewModel = new MainWindowViewModel(this); + ViewModel = new MainWindowViewModel(); MainWindowViewModel = ViewModel; @@ -92,10 +67,10 @@ namespace Ryujinx.Ava.UI.Windows UiHandler = new AvaHostUiHandler(this); - Title = $"Ryujinx {Program.Version}"; + ViewModel.Title = $"Ryujinx {Program.Version}"; // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point. - double barHeight = MenuBar.MinHeight + StatusBar.MinHeight; + double barHeight = MenuBar.MinHeight + StatusBarView.StatusBar.MinHeight; Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight; Width /= Program.WindowScaleFactor; @@ -103,14 +78,37 @@ namespace Ryujinx.Ava.UI.Windows { Initialize(); - ViewModel.Initialize(); - InputManager = new InputManager(new AvaloniaKeyboardDriver(this), new SDL2GamepadDriver()); + ViewModel.Initialize( + ContentManager, + ApplicationLibrary, + VirtualFileSystem, + AccountManager, + InputManager, + _userChannelPersistence, + LibHacHorizonManager, + UiHandler, + ShowLoading, + SwitchToGameControl, + SetMainContent, + this); + + ViewModel.RefreshFirmwareStatus(); + LoadGameList(); + + this.GetObservable(IsActiveProperty).Subscribe(IsActiveChanged); } - _rendererWaitEvent = new AutoResetEvent(false); + ApplicationLibrary.ApplicationCountUpdated += ApplicationLibrary_ApplicationCountUpdated; + ApplicationLibrary.ApplicationAdded += ApplicationLibrary_ApplicationAdded; + ViewModel.ReloadGameList += ReloadGameList; + } + + private void IsActiveChanged(bool obj) + { + ViewModel.IsActive = obj; } public void LoadGameList() @@ -122,205 +120,70 @@ namespace Ryujinx.Ava.UI.Windows _isLoading = true; - ViewModel.LoadApplications(); + LoadApplications(); _isLoading = false; } - private void Update_StatusBar(object sender, StatusUpdatedEventArgs args) - { - if (ViewModel.ShowMenuAndStatusBar && !ViewModel.ShowLoadProgress) - { - Dispatcher.UIThread.InvokeAsync(() => - { - if (args.VSyncEnabled) - { - ViewModel.VsyncColor = new SolidColorBrush(Color.Parse("#ff2eeac9")); - } - else - { - ViewModel.VsyncColor = new SolidColorBrush(Color.Parse("#ffff4554")); - } - - ViewModel.DockedStatusText = args.DockedMode; - ViewModel.AspectRatioStatusText = args.AspectRatio; - ViewModel.GameStatusText = args.GameStatus; - ViewModel.VolumeStatusText = args.VolumeStatus; - ViewModel.FifoStatusText = args.FifoStatus; - ViewModel.GpuNameText = args.GpuName; - ViewModel.BackendText = args.GpuBackend; - - ViewModel.ShowStatusSeparator = true; - }); - } - } - protected override void HandleScalingChanged(double scale) { Program.DesktopScaleFactor = scale; base.HandleScalingChanged(scale); } - public void Application_Opened(object sender, ApplicationOpenedEventArgs args) + public void AddApplication(ApplicationData applicationData) { - if (args.Application != null) - { - ViewModel.SelectedIcon = args.Application.Icon; - - string path = new FileInfo(args.Application.Path).FullName; - - LoadApplication(path); - } - - args.Handled = true; - } - - public async Task PerformanceCheck() - { - if (ConfigurationState.Instance.Logger.EnableTrace.Value) - { - string mainMessage = LocaleManager.Instance[LocaleKeys.DialogPerformanceCheckLoggingEnabledMessage]; - string secondaryMessage = LocaleManager.Instance[LocaleKeys.DialogPerformanceCheckLoggingEnabledConfirmMessage]; - - UserResult result = await ContentDialogHelper.CreateConfirmationDialog(mainMessage, secondaryMessage, - LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogNo], - LocaleManager.Instance[LocaleKeys.RyujinxConfirm]); - - if (result != UserResult.Yes) - { - ConfigurationState.Instance.Logger.EnableTrace.Value = false; - - SaveConfig(); - } - } - - if (!string.IsNullOrWhiteSpace(ConfigurationState.Instance.Graphics.ShadersDumpPath.Value)) + Dispatcher.UIThread.InvokeAsync(() => { - string mainMessage = LocaleManager.Instance[LocaleKeys.DialogPerformanceCheckShaderDumpEnabledMessage]; - string secondaryMessage = - LocaleManager.Instance[LocaleKeys.DialogPerformanceCheckShaderDumpEnabledConfirmMessage]; - - UserResult result = await ContentDialogHelper.CreateConfirmationDialog(mainMessage, secondaryMessage, - LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogNo], - LocaleManager.Instance[LocaleKeys.RyujinxConfirm]); - - if (result != UserResult.Yes) - { - ConfigurationState.Instance.Graphics.ShadersDumpPath.Value = ""; - - SaveConfig(); - } - } + ViewModel.Applications.Add(applicationData); + }); } - internal static void DeferLoadApplication(string launchPathArg, bool startFullscreenArg) + private void ApplicationLibrary_ApplicationAdded(object sender, ApplicationAddedEventArgs e) { - _deferLoad = true; - _launchPath = launchPathArg; - _startFullscreen = startFullscreenArg; + AddApplication(e.AppData); } -#pragma warning disable CS1998 - public async void LoadApplication(string path, bool startFullscreen = false, string titleName = "") -#pragma warning restore CS1998 + private void ApplicationLibrary_ApplicationCountUpdated(object sender, ApplicationCountUpdatedEventArgs e) { - if (AppHost != null) - { - await ContentDialogHelper.CreateInfoDialog( - LocaleManager.Instance[LocaleKeys.DialogLoadAppGameAlreadyLoadedMessage], - LocaleManager.Instance[LocaleKeys.DialogLoadAppGameAlreadyLoadedSubMessage], - LocaleManager.Instance[LocaleKeys.InputDialogOk], - "", - LocaleManager.Instance[LocaleKeys.RyujinxInfo]); - - return; - } - -#if RELEASE - await PerformanceCheck(); -#endif - - Logger.RestartTime(); + LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarGamesLoaded, e.NumAppsLoaded, e.NumAppsFound); - if (ViewModel.SelectedIcon == null) + Dispatcher.UIThread.Post(() => { - ViewModel.SelectedIcon = ApplicationLibrary.GetApplicationIcon(path); - } - - PrepareLoadScreen(); + ViewModel.StatusBarProgressValue = e.NumAppsLoaded; + ViewModel.StatusBarProgressMaximum = e.NumAppsFound; - _mainViewContent = MainContent.Content as Control; - - RendererControl = new RendererHost(ConfigurationState.Instance.Logger.GraphicsDebugLevel); - if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl) - { - RendererControl.CreateOpenGL(); - } - else - { - RendererControl.CreateVulkan(); - } - - AppHost = new AppHost(RendererControl, InputManager, path, VirtualFileSystem, ContentManager, AccountManager, _userChannelPersistence, this); - - Dispatcher.UIThread.Post(async () => - { - if (!await AppHost.LoadGuestApplication()) + if (e.NumAppsFound == 0) { - AppHost.DisposeContext(); - AppHost = null; - - return; + StatusBarView.LoadProgressBar.IsVisible = false; } - CanUpdate = false; - ViewModel.LoadHeading = string.IsNullOrWhiteSpace(titleName) ? string.Format(LocaleManager.Instance[LocaleKeys.LoadingHeading], AppHost.Device.Application.TitleName) : titleName; - ViewModel.TitleName = string.IsNullOrWhiteSpace(titleName) ? AppHost.Device.Application.TitleName : titleName; - - SwitchToGameControl(startFullscreen); - - _currentEmulatedGamePath = path; - - Thread gameThread = new(InitializeGame) + if (e.NumAppsLoaded == e.NumAppsFound) { - Name = "GUI.WindowThread" - }; - gameThread.Start(); + StatusBarView.LoadProgressBar.IsVisible = false; + } }); } - private void InitializeGame() + public void Application_Opened(object sender, ApplicationOpenedEventArgs args) { - RendererControl.RendererInitialized += GlRenderer_Created; - - AppHost.StatusUpdatedEvent += Update_StatusBar; - AppHost.AppExit += AppHost_AppExit; + if (args.Application != null) + { + ViewModel.SelectedIcon = args.Application.Icon; - _rendererWaitEvent.WaitOne(); + string path = new FileInfo(args.Application.Path).FullName; - AppHost?.Start(); + ViewModel.LoadApplication(path); + } - AppHost.DisposeContext(); + args.Handled = true; } - - private void HandleRelaunch() + internal static void DeferLoadApplication(string launchPathArg, bool startFullscreenArg) { - if (_userChannelPersistence.PreviousIndex != -1 && _userChannelPersistence.ShouldRestart) - { - _userChannelPersistence.ShouldRestart = false; - - Dispatcher.UIThread.Post(() => - { - LoadApplication(_currentEmulatedGamePath); - }); - } - else - { - // otherwise, clear state. - _userChannelPersistence = new UserChannelPersistence(); - _currentEmulatedGamePath = null; - } + _deferLoad = true; + _launchPath = launchPathArg; + _startFullscreen = startFullscreenArg; } public void SwitchToGameControl(bool startFullscreen = false) @@ -331,14 +194,10 @@ namespace Ryujinx.Ava.UI.Windows Dispatcher.UIThread.InvokeAsync(() => { - MainContent.Content = RendererControl; - - if (startFullscreen && WindowState != WindowState.FullScreen) + if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen) { ViewModel.ToggleFullscreen(); } - - RendererControl.Focus(); }); } @@ -350,71 +209,16 @@ namespace Ryujinx.Ava.UI.Windows Dispatcher.UIThread.InvokeAsync(() => { - if (startFullscreen && WindowState != WindowState.FullScreen) + if (startFullscreen && ViewModel.WindowState != WindowState.FullScreen) { ViewModel.ToggleFullscreen(); } }); } - private void GlRenderer_Created(object sender, EventArgs e) - { - ShowLoading(); - - _rendererWaitEvent.Set(); - } - - private void AppHost_AppExit(object sender, EventArgs e) - { - if (_isClosing) - { - return; - } - - ViewModel.IsGameRunning = false; - - Dispatcher.UIThread.InvokeAsync(() => - { - ViewModel.ShowMenuAndStatusBar = true; - ViewModel.ShowContent = true; - ViewModel.ShowLoadProgress = false; - ViewModel.IsLoadingIndeterminate = false; - CanUpdate = true; - Cursor = Cursor.Default; - - if (MainContent.Content != _mainViewContent) - { - MainContent.Content = _mainViewContent; - } - - AppHost = null; - - HandleRelaunch(); - }); - - RendererControl.RendererInitialized -= GlRenderer_Created; - RendererControl = null; - - ViewModel.SelectedIcon = null; - - Dispatcher.UIThread.InvokeAsync(() => - { - Title = $"Ryujinx {Program.Version}"; - }); - } - - public void Sort_Checked(object sender, RoutedEventArgs args) - { - if (sender is RadioButton button) - { - var sort = Enum.Parse<ApplicationSort>(button.Tag.ToString()); - ViewModel.Sort(sort); - } - } - protected override void HandleWindowStateChanged(WindowState state) { - WindowState = state; + ViewModel.WindowState = state; if (state != WindowState.Minimized) { @@ -422,15 +226,6 @@ namespace Ryujinx.Ava.UI.Windows } } - public void Order_Checked(object sender, RoutedEventArgs args) - { - if (sender is RadioButton button) - { - var tag = button.Tag.ToString(); - ViewModel.Sort(tag != "Descending"); - } - } - private void Initialize() { _userChannelPersistence = new UserChannelPersistence(); @@ -457,8 +252,6 @@ namespace Ryujinx.Ava.UI.Windows VirtualFileSystem.ReloadKeySet(); ApplicationHelper.Initialize(VirtualFileSystem, AccountManager, LibHacHorizonManager.RyujinxClient, this); - - RefreshFirmwareStatus(); } protected void CheckLaunchState() @@ -475,7 +268,7 @@ namespace Ryujinx.Ava.UI.Windows { _deferLoad = false; - LoadApplication(_launchPath, _startFullscreen); + ViewModel.LoadApplication(_launchPath, _startFullscreen); } if (ConfigurationState.Instance.CheckUpdatesOnStart.Value && Updater.CanUpdate(false, this)) @@ -487,35 +280,9 @@ namespace Ryujinx.Ava.UI.Windows } } - public void RefreshFirmwareStatus() - { - SystemVersion version = null; - try - { - version = ContentManager.GetCurrentFirmwareVersion(); - } - catch (Exception) { } - - bool hasApplet = false; - - if (version != null) - { - LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarSystemVersion, - version.VersionString); - - hasApplet = version.Major > 3; - } - else - { - LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarSystemVersion, "0.0"); - } - - ViewModel.IsAppletMenuActive = hasApplet; - } - private void Load() { - VolumeStatus.Click += VolumeStatus_CheckedChanged; + StatusBarView.VolumeStatus.Click += VolumeStatus_CheckedChanged; GameGrid.ApplicationOpened += Application_Opened; @@ -535,6 +302,19 @@ namespace Ryujinx.Ava.UI.Windows CheckLaunchState(); } + private void SetMainContent(Control content = null) + { + if (content == null) + { + content = GameLibrary; + } + + if (MainContent.Content != content) + { + MainContent.Content = content; + } + } + public static void UpdateGraphicsConfig() { GraphicsConfig.ResScale = ConfigurationState.Instance.Graphics.ResScale == -1 ? ConfigurationState.Instance.Graphics.ResScaleCustom : ConfigurationState.Instance.Graphics.ResScale; @@ -553,99 +333,6 @@ namespace Ryujinx.Ava.UI.Windows HotKeyManager.SetHotKey(ExitHotKey, new KeyGesture(Key.Escape)); } - public static void SaveConfig() - { - ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); - } - - public void UpdateGameMetadata(string titleId) - { - ApplicationLibrary.LoadAndSaveMetaData(titleId, appMetadata => - { - if (DateTime.TryParse(appMetadata.LastPlayed, out DateTime lastPlayedDateTime)) - { - double sessionTimePlayed = DateTime.UtcNow.Subtract(lastPlayedDateTime).TotalSeconds; - - appMetadata.TimePlayed += Math.Round(sessionTimePlayed, MidpointRounding.AwayFromZero); - } - }); - } - - private void PrepareLoadScreen() - { - using MemoryStream stream = new MemoryStream(ViewModel.SelectedIcon); - using var gameIconBmp = SixLabors.ImageSharp.Image.Load<Bgra32>(stream); - - var dominantColor = IconColorPicker.GetFilteredColor(gameIconBmp).ToPixel<Bgra32>(); - - const int ColorDivisor = 4; - - Color progressFgColor = Color.FromRgb(dominantColor.R, dominantColor.G, dominantColor.B); - Color progressBgColor = Color.FromRgb( - (byte)(dominantColor.R / ColorDivisor), - (byte)(dominantColor.G / ColorDivisor), - (byte)(dominantColor.B / ColorDivisor)); - - ViewModel.ProgressBarForegroundColor = new SolidColorBrush(progressFgColor); - ViewModel.ProgressBarBackgroundColor = new SolidColorBrush(progressBgColor); - } - - private void SearchBox_OnKeyUp(object sender, KeyEventArgs e) - { - ViewModel.SearchText = SearchBox.Text; - } - - private async void StopEmulation_Click(object sender, RoutedEventArgs e) - { - if (AppHost != null) - { - await AppHost.ShowExitPrompt(); - } - } - - private async void PauseEmulation_Click(object sender, RoutedEventArgs e) - { - await Task.Run(() => - { - AppHost?.Pause(); - }); - } - - private async void ResumeEmulation_Click(object sender, RoutedEventArgs e) - { - await Task.Run(() => - { - AppHost?.Resume(); - }); - } - - private void ScanAmiiboMenuItem_AttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e) - { - if (sender is MenuItem) - { - ViewModel.IsAmiiboRequested = AppHost.Device.System.SearchingForAmiibo(out _); - } - } - - private void VsyncStatus_PointerReleased(object sender, PointerReleasedEventArgs e) - { - AppHost.Device.EnableDeviceVsync = !AppHost.Device.EnableDeviceVsync; - - Logger.Info?.Print(LogClass.Application, $"VSync toggled to: {AppHost.Device.EnableDeviceVsync}"); - } - - private void DockedStatus_PointerReleased(object sender, PointerReleasedEventArgs e) - { - ConfigurationState.Instance.System.EnableDockedMode.Value = !ConfigurationState.Instance.System.EnableDockedMode.Value; - } - - private void AspectRatioStatus_PointerReleased(object sender, PointerReleasedEventArgs e) - { - AspectRatio aspectRatio = ConfigurationState.Instance.Graphics.AspectRatio.Value; - - ConfigurationState.Instance.Graphics.AspectRatio.Value = (int)aspectRatio + 1 > Enum.GetNames(typeof(AspectRatio)).Length - 1 ? AspectRatio.Fixed4x3 : aspectRatio + 1; - } - private void VolumeStatus_CheckedChanged(object sender, SplitButtonClickEventArgs e) { var volumeSplitButton = sender as ToggleSplitButton; @@ -653,20 +340,20 @@ namespace Ryujinx.Ava.UI.Windows { if (!volumeSplitButton.IsChecked) { - AppHost.Device.SetVolume(ConfigurationState.Instance.System.AudioVolume); + ViewModel.AppHost.Device.SetVolume(ConfigurationState.Instance.System.AudioVolume); } else { - AppHost.Device.SetVolume(0); + ViewModel.AppHost.Device.SetVolume(0); } - ViewModel.Volume = AppHost.Device.GetVolume(); + ViewModel.Volume = ViewModel.AppHost.Device.GetVolume(); } } protected override void OnClosing(CancelEventArgs e) { - if (!_isClosing && AppHost != null && ConfigurationState.Instance.ShowConfirmExit) + if (!ViewModel.IsClosing && ViewModel.AppHost != null && ConfigurationState.Instance.ShowConfirmExit) { e.Cancel = true; @@ -675,14 +362,14 @@ namespace Ryujinx.Ava.UI.Windows return; } - _isClosing = true; + ViewModel.IsClosing = true; - if (AppHost != null) + if (ViewModel.AppHost != null) { - AppHost.AppExit -= AppHost_AppExit; - AppHost.AppExit += (sender, e) => + ViewModel.AppHost.AppExit -= ViewModel.AppHost_AppExit; + ViewModel.AppHost.AppExit += (sender, e) => { - AppHost = null; + ViewModel.AppHost = null; Dispatcher.UIThread.Post(() => { @@ -691,7 +378,7 @@ namespace Ryujinx.Ava.UI.Windows Close(); }); }; - AppHost?.Stop(); + ViewModel.AppHost?.Stop(); e.Cancel = true; @@ -709,13 +396,43 @@ namespace Ryujinx.Ava.UI.Windows { Dispatcher.UIThread.InvokeAsync(async () => { - _isClosing = await ContentDialogHelper.CreateExitDialog(); + ViewModel.IsClosing = await ContentDialogHelper.CreateExitDialog(); - if (_isClosing) + if (ViewModel.IsClosing) { Close(); } }); } + + public async void LoadApplications() + { + await Dispatcher.UIThread.InvokeAsync(() => + { + ViewModel.Applications.Clear(); + + StatusBarView.LoadProgressBar.IsVisible = true; + ViewModel.StatusBarProgressMaximum = 0; + ViewModel.StatusBarProgressValue = 0; + + LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarGamesLoaded, 0, 0); + }); + + ReloadGameList(); + } + + private void ReloadGameList() + { + if (_isLoading) + { + return; + } + + _isLoading = true; + + ApplicationLibrary.LoadApplications(ConfigurationState.Instance.Ui.GameDirs.Value, ConfigurationState.Instance.System.Language); + + _isLoading = false; + } } }
\ No newline at end of file |
