From 2b068269221ee5b4b39f37a44605ca681c7e4cd1 Mon Sep 17 00:00:00 2001 From: Evan Husted Date: Wed, 5 Mar 2025 02:08:36 -0600 Subject: [PATCH] UI: Rework the compatibility list into a Window --- src/Ryujinx/Assets/Styles/Styles.xaml | 2 +- src/Ryujinx/Assets/locales.json | 50 ++++++++++++ src/Ryujinx/Common/LocaleManager.cs | 3 + .../Controls/ApplicationContextMenu.axaml.cs | 2 +- .../UI/ViewModels/CompatibilityViewModel.cs | 1 + .../UI/Views/Main/MainMenuBarView.axaml.cs | 2 +- .../Views/Misc/ApplicationDataView.axaml.cs | 2 +- .../Views/Misc/ApplicationListView.axaml.cs | 3 +- .../UI/Views/Misc/CompatibilityList.axaml.cs | 48 ------------ .../CompatibilityListWindow.axaml} | 78 +++++++++---------- .../Windows/CompatibilityListWindow.axaml.cs | 50 ++++++++++++ 11 files changed, 149 insertions(+), 92 deletions(-) delete mode 100644 src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml.cs rename src/Ryujinx/UI/{Views/Misc/CompatibilityList.axaml => Windows/CompatibilityListWindow.axaml} (53%) create mode 100644 src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs diff --git a/src/Ryujinx/Assets/Styles/Styles.xaml b/src/Ryujinx/Assets/Styles/Styles.xaml index eb40e853c..112815fb5 100644 --- a/src/Ryujinx/Assets/Styles/Styles.xaml +++ b/src/Ryujinx/Assets/Styles/Styles.xaml @@ -440,7 +440,7 @@ 13 26 28 - 900 + 700 756 diff --git a/src/Ryujinx/Assets/locales.json b/src/Ryujinx/Assets/locales.json index d69c3ee9b..e64cae4d5 100644 --- a/src/Ryujinx/Assets/locales.json +++ b/src/Ryujinx/Assets/locales.json @@ -23822,6 +23822,31 @@ "zh_TW": "上次更新時間: {0}" } }, + { + "ID": "CompatibilityListTitle", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Compatibility List - {0} entries", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "CompatibilityListWarning", "Translations": { @@ -23872,6 +23897,31 @@ "zh_TW": "搜尋相容性列表紀錄..." } }, + { + "ID": "CompatibilityListSearchBoxWatermarkWithCount", + "Translations": { + "ar_SA": "", + "de_DE": "", + "el_GR": "", + "en_US": "Search {0} compatibility entries...", + "es_ES": "", + "fr_FR": "", + "he_IL": "", + "it_IT": "", + "ja_JP": "", + "ko_KR": "", + "no_NO": "Søk i {0} kompatibilitetsoppføringer...", + "pl_PL": "", + "pt_BR": "", + "ru_RU": "", + "sv_SE": "", + "th_TH": "", + "tr_TR": "", + "uk_UA": "", + "zh_CN": "", + "zh_TW": "" + } + }, { "ID": "CompatibilityListOpen", "Translations": { diff --git a/src/Ryujinx/Common/LocaleManager.cs b/src/Ryujinx/Common/LocaleManager.cs index f5194dd13..30b055d8b 100644 --- a/src/Ryujinx/Common/LocaleManager.cs +++ b/src/Ryujinx/Common/LocaleManager.cs @@ -1,4 +1,5 @@ using Gommon; +using Ryujinx.Ava.Systems; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Systems.Configuration; using Ryujinx.Common; @@ -55,6 +56,8 @@ namespace Ryujinx.Ava.Common.Locale SetDynamicValues(LocaleKeys.RyujinxConfirm, RyujinxApp.FullAppName); SetDynamicValues(LocaleKeys.RyujinxUpdater, RyujinxApp.FullAppName); SetDynamicValues(LocaleKeys.RyujinxRebooter, RyujinxApp.FullAppName); + SetDynamicValues(LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, CompatibilityCsv.Entries.Length); + } public string this[LocaleKeys key] diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs index 9230cb78b..9635582c8 100644 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml.cs @@ -407,7 +407,7 @@ namespace Ryujinx.Ava.UI.Controls public async void OpenApplicationCompatibility_Click(object sender, RoutedEventArgs args) { if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel }) - await CompatibilityList.Show(viewModel.SelectedApplication.IdString); + await CompatibilityListWindow.Show(viewModel.SelectedApplication.IdString); } public async void OpenApplicationData_Click(object sender, RoutedEventArgs args) diff --git a/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs index 650223e1f..d6c10044d 100644 --- a/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/CompatibilityViewModel.cs @@ -1,6 +1,7 @@ using Gommon; using Ryujinx.Ava.Systems; using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Windows; using System.Collections.Generic; using System.Linq; diff --git a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs index 30a195747..13c2f4c8a 100644 --- a/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs +++ b/src/Ryujinx/UI/Views/Main/MainMenuBarView.axaml.cs @@ -51,7 +51,7 @@ namespace Ryujinx.Ava.UI.Views.Main UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes); XciTrimmerMenuItem.Command = Commands.Create(XCITrimmerWindow.Show); AboutWindowMenuItem.Command = Commands.Create(AboutWindow.Show); - CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityList.Show()); + CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show()); UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand; diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml.cs index 37b2aaf60..796123362 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml.cs +++ b/src/Ryujinx/UI/Views/Misc/ApplicationDataView.axaml.cs @@ -44,7 +44,7 @@ namespace Ryujinx.Ava.UI.Views.Misc if (RyujinxApp.AppLifetime.Windows.TryGetFirst(x => x is ContentDialogOverlayWindow, out Window window)) window.Close(ContentDialogResult.None); - await CompatibilityList.Show((string)playabilityLabel.Tag); + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); } private async void IdString_OnClick(object sender, RoutedEventArgs e) diff --git a/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs index e7f476158..aa87a8c9a 100644 --- a/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs +++ b/src/Ryujinx/UI/Views/Misc/ApplicationListView.axaml.cs @@ -6,6 +6,7 @@ using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.Systems.AppLibrary; +using Ryujinx.Ava.UI.Windows; using System; using System.Linq; @@ -35,7 +36,7 @@ namespace Ryujinx.Ava.UI.Views.Misc if (sender is not Button { Content: TextBlock playabilityLabel }) return; - await CompatibilityList.Show((string)playabilityLabel.Tag); + await CompatibilityListWindow.Show((string)playabilityLabel.Tag); } private async void IdString_OnClick(object sender, RoutedEventArgs e) diff --git a/src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml.cs b/src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml.cs deleted file mode 100644 index 29c9700e3..000000000 --- a/src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Avalonia.Controls; -using Avalonia.Styling; -using FluentAvalonia.UI.Controls; -using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.Helpers; -using Ryujinx.Ava.UI.ViewModels; -using System.Threading.Tasks; - -namespace Ryujinx.Ava.UI.Views.Misc -{ - public partial class CompatibilityList : UserControl - { - public static async Task Show(string titleId = null) - { - ContentDialog contentDialog = new() - { - PrimaryButtonText = string.Empty, - SecondaryButtonText = string.Empty, - CloseButtonText = LocaleManager.Instance[LocaleKeys.SettingsButtonClose], - Content = new CompatibilityList - { - DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary), - SearchBox = { - Text = titleId ?? "" - } - } - }; - - await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles()); - } - - public CompatibilityList() - { - InitializeComponent(); - } - - private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) - { - if (DataContext is not CompatibilityViewModel cvm) - return; - - if (sender is not TextBox searchBox) - return; - - cvm.Search(searchBox.Text); - } - } -} diff --git a/src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml similarity index 53% rename from src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml rename to src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml index a9365d690..e3347252f 100644 --- a/src/Ryujinx/UI/Views/Misc/CompatibilityList.axaml +++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml @@ -1,82 +1,82 @@ - - + - - - - - - + + + + + + + - - + + - + - - + - + - + diff --git a/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs new file mode 100644 index 000000000..dde94f63b --- /dev/null +++ b/src/Ryujinx/UI/Windows/CompatibilityListWindow.axaml.cs @@ -0,0 +1,50 @@ +using Avalonia.Controls; +using Avalonia.Styling; +using FluentAvalonia.UI.Controls; +using FluentAvalonia.UI.Windowing; +using Ryujinx.Ava.Common.Locale; +using Ryujinx.Ava.Systems.Configuration; +using Ryujinx.Ava.UI.Helpers; +using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Windows; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Windows +{ + public partial class CompatibilityListWindow : StyleableAppWindow + { + public static Task Show(string titleId = null) => + ShowAsync(new CompatibilityListWindow + { + DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary), + SearchBoxFlush = { Text = titleId ?? string.Empty }, + SearchBoxNormal = { Text = titleId ?? string.Empty } + }); + + public CompatibilityListWindow() + { + Title = RyujinxApp.FormatTitle(LocaleKeys.CompatibilityListTitle); + + TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar; + TitleBar.TitleBarHitTestType = ConfigurationState.Instance.ShowTitleBar ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex; + TitleBar.Height = 37; + + InitializeComponent(); + + RyuLogo.Source = MainWindowViewModel.IconBitmap; + FlushControls.IsVisible = !ConfigurationState.Instance.ShowTitleBar; + NormalControls.IsVisible = ConfigurationState.Instance.ShowTitleBar; + } + + private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) + { + if (DataContext is not CompatibilityViewModel cvm) + return; + + if (sender is not TextBox searchBox) + return; + + cvm.Search(searchBox.Text); + } + } +}