diff options
| author | Ac_K <Acoustik666@gmail.com> | 2023-01-21 02:57:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-21 02:57:37 +0100 |
| commit | a47824f96101a1c1e63b7622f0c4e61ba6345a98 (patch) | |
| tree | a90592f9084c5243eefe3b542301168b52beb2d2 /Ryujinx.Ava/UI | |
| parent | 8474d52778d6bc45146b59a1fc921e6702f4b96a (diff) | |
Ava UI: Add Notifications and Cleanup (#4275)
* Ava UI: Add Notifications and Cleanup
* Revert notifications on ErrorDialog
* remove unused code from game list views
* Fix cast
Diffstat (limited to 'Ryujinx.Ava/UI')
| -rw-r--r-- | Ryujinx.Ava/UI/Controls/GameGridView.axaml | 5 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs | 50 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Controls/GameListView.axaml | 5 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Controls/GameListView.axaml.cs | 50 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Helpers/NotificationHelper.cs | 65 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs | 182 | ||||
| -rw-r--r-- | Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs | 2 |
7 files changed, 158 insertions, 201 deletions
diff --git a/Ryujinx.Ava/UI/Controls/GameGridView.axaml b/Ryujinx.Ava/UI/Controls/GameGridView.axaml index 862bc6d3..32cabfaa 100644 --- a/Ryujinx.Ava/UI/Controls/GameGridView.axaml +++ b/Ryujinx.Ava/UI/Controls/GameGridView.axaml @@ -14,7 +14,7 @@ Focusable="True"> <UserControl.Resources> <helpers:BitmapArrayValueConverter x:Key="ByteImage" /> - <MenuFlyout x:Key="GameContextMenu" Opened="MenuBase_OnMenuOpened"> + <MenuFlyout x:Key="GameContextMenu"> <MenuItem Command="{Binding ToggleFavorite}" Header="{locale:Locale GameListContextMenuToggleFavorite}" @@ -22,14 +22,17 @@ <Separator /> <MenuItem Command="{Binding OpenUserSaveDirectory}" + IsEnabled="{Binding EnabledUserSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenUserSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenUserSaveDirectoryToolTip}" /> <MenuItem Command="{Binding OpenDeviceSaveDirectory}" + IsEnabled="{Binding EnabledDeviceSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenDeviceSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenDeviceSaveDirectoryToolTip}" /> <MenuItem Command="{Binding OpenBcatSaveDirectory}" + IsEnabled="{Binding EnabledBcatSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenBcatSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenBcatSaveDirectoryToolTip}" /> <Separator /> diff --git a/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs b/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs index 531b5435..aa76b7c9 100644 --- a/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs +++ b/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs @@ -1,9 +1,7 @@ -using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; -using LibHac.Common; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ui.App.Common; @@ -13,16 +11,25 @@ namespace Ryujinx.Ava.UI.Controls { public partial class GameGridView : UserControl { - private ApplicationData _selectedApplication; public static readonly RoutedEvent<ApplicationOpenedEventArgs> ApplicationOpenedEvent = RoutedEvent.Register<GameGridView, ApplicationOpenedEventArgs>(nameof(ApplicationOpened), RoutingStrategies.Bubble); public event EventHandler<ApplicationOpenedEventArgs> ApplicationOpened { - add { AddHandler(ApplicationOpenedEvent, value); } + add { AddHandler(ApplicationOpenedEvent, value); } remove { RemoveHandler(ApplicationOpenedEvent, value); } } + public GameGridView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + public void GameList_DoubleTapped(object sender, RoutedEventArgs args) { if (sender is ListBox listBox) @@ -38,46 +45,13 @@ namespace Ryujinx.Ava.UI.Controls { if (sender is ListBox listBox) { - _selectedApplication = listBox.SelectedItem as ApplicationData; - - (DataContext as MainWindowViewModel).GridSelectedApplication = _selectedApplication; + (DataContext as MainWindowViewModel).GridSelectedApplication = listBox.SelectedItem as ApplicationData; } } - public ApplicationData SelectedApplication => _selectedApplication; - - public GameGridView() - { - InitializeComponent(); - } - - private void InitializeComponent() - { - AvaloniaXamlLoader.Load(this); - } - private void SearchBox_OnKeyUp(object sender, KeyEventArgs e) { (DataContext as MainWindowViewModel).SearchText = (sender as TextBox).Text; } - - private void MenuBase_OnMenuOpened(object sender, EventArgs e) - { - var selection = SelectedApplication; - - if (selection != null) - { - if (sender is ContextMenu menu) - { - bool canHaveUserSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.UserAccountSaveDataSize > 0; - bool canHaveDeviceSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.DeviceSaveDataSize > 0; - bool canHaveBcatSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; - - ((menu.Items as AvaloniaList<object>)[2] as MenuItem).IsEnabled = canHaveUserSave; - ((menu.Items as AvaloniaList<object>)[3] as MenuItem).IsEnabled = canHaveDeviceSave; - ((menu.Items as AvaloniaList<object>)[4] as MenuItem).IsEnabled = canHaveBcatSave; - } - } - } } } diff --git a/Ryujinx.Ava/UI/Controls/GameListView.axaml b/Ryujinx.Ava/UI/Controls/GameListView.axaml index 2ba4a204..c13eaae8 100644 --- a/Ryujinx.Ava/UI/Controls/GameListView.axaml +++ b/Ryujinx.Ava/UI/Controls/GameListView.axaml @@ -13,7 +13,7 @@ mc:Ignorable="d"> <UserControl.Resources> <helpers:BitmapArrayValueConverter x:Key="ByteImage" /> - <MenuFlyout x:Key="GameContextMenu" Opened="MenuBase_OnMenuOpened"> + <MenuFlyout x:Key="GameContextMenu"> <MenuItem Command="{Binding ToggleFavorite}" Header="{locale:Locale GameListContextMenuToggleFavorite}" @@ -21,14 +21,17 @@ <Separator /> <MenuItem Command="{Binding OpenUserSaveDirectory}" + IsEnabled="{Binding EnabledUserSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenUserSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenUserSaveDirectoryToolTip}" /> <MenuItem Command="{Binding OpenDeviceSaveDirectory}" + IsEnabled="{Binding EnabledDeviceSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenDeviceSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenDeviceSaveDirectoryToolTip}" /> <MenuItem Command="{Binding OpenBcatSaveDirectory}" + IsEnabled="{Binding EnabledBcatSaveDirectory}" Header="{locale:Locale GameListContextMenuOpenBcatSaveDirectory}" ToolTip.Tip="{locale:Locale GameListContextMenuOpenBcatSaveDirectoryToolTip}" /> <Separator /> diff --git a/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs b/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs index bded1dec..a6449709 100644 --- a/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs +++ b/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs @@ -1,9 +1,7 @@ -using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; -using LibHac.Common; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ui.App.Common; @@ -13,16 +11,25 @@ namespace Ryujinx.Ava.UI.Controls { public partial class GameListView : UserControl { - private ApplicationData _selectedApplication; public static readonly RoutedEvent<ApplicationOpenedEventArgs> ApplicationOpenedEvent = RoutedEvent.Register<GameGridView, ApplicationOpenedEventArgs>(nameof(ApplicationOpened), RoutingStrategies.Bubble); public event EventHandler<ApplicationOpenedEventArgs> ApplicationOpened { - add { AddHandler(ApplicationOpenedEvent, value); } + add { AddHandler(ApplicationOpenedEvent, value); } remove { RemoveHandler(ApplicationOpenedEvent, value); } } + public GameListView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + public void GameList_DoubleTapped(object sender, RoutedEventArgs args) { if (sender is ListBox listBox) @@ -38,46 +45,13 @@ namespace Ryujinx.Ava.UI.Controls { if (sender is ListBox listBox) { - _selectedApplication = listBox.SelectedItem as ApplicationData; - - (DataContext as MainWindowViewModel).ListSelectedApplication = _selectedApplication; + (DataContext as MainWindowViewModel).ListSelectedApplication = listBox.SelectedItem as ApplicationData; } } - public ApplicationData SelectedApplication => _selectedApplication; - - public GameListView() - { - InitializeComponent(); - } - - private void InitializeComponent() - { - AvaloniaXamlLoader.Load(this); - } - private void SearchBox_OnKeyUp(object sender, KeyEventArgs e) { (DataContext as MainWindowViewModel).SearchText = (sender as TextBox).Text; } - - private void MenuBase_OnMenuOpened(object sender, EventArgs e) - { - var selection = SelectedApplication; - - if (selection != null) - { - if (sender is ContextMenu menu) - { - bool canHaveUserSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.UserAccountSaveDataSize > 0; - bool canHaveDeviceSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.DeviceSaveDataSize > 0; - bool canHaveBcatSave = !Utilities.IsZeros(selection.ControlHolder.ByteSpan) && selection.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; - - ((menu.Items as AvaloniaList<object>)[2] as MenuItem).IsEnabled = canHaveUserSave; - ((menu.Items as AvaloniaList<object>)[3] as MenuItem).IsEnabled = canHaveDeviceSave; - ((menu.Items as AvaloniaList<object>)[4] as MenuItem).IsEnabled = canHaveBcatSave; - } - } - } } } diff --git a/Ryujinx.Ava/UI/Helpers/NotificationHelper.cs b/Ryujinx.Ava/UI/Helpers/NotificationHelper.cs new file mode 100644 index 00000000..7e2afb8b --- /dev/null +++ b/Ryujinx.Ava/UI/Helpers/NotificationHelper.cs @@ -0,0 +1,65 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Notifications; +using Avalonia.Threading; +using Ryujinx.Ava.Common.Locale; +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace Ryujinx.Ava.UI.Helpers +{ + public static class NotificationHelper + { + private const int MaxNotifications = 4; + private const int NotificationDelayInMs = 5000; + + private static WindowNotificationManager _notificationManager; + + private static readonly ManualResetEvent _templateAppliedEvent = new(false); + private static readonly BlockingCollection<Notification> _notifications = new(); + + public static void SetNotificationManager(Window host) + { + _notificationManager = new WindowNotificationManager(host) + { + Position = NotificationPosition.BottomRight, + MaxItems = MaxNotifications, + Margin = new Thickness(0, 0, 15, 40) + }; + + _notificationManager.TemplateApplied += (sender, args) => + { + _templateAppliedEvent.Set(); + }; + + Task.Run(async () => + { + _templateAppliedEvent.WaitOne(); + + foreach (var notification in _notifications.GetConsumingEnumerable()) + { + Dispatcher.UIThread.Post(() => + { + _notificationManager.Show(notification); + }); + + await Task.Delay(NotificationDelayInMs / MaxNotifications); + } + }); + } + + public static void Show(string title, string text, NotificationType type, bool waitingExit = false, Action onClick = null, Action onClose = null) + { + var delay = waitingExit ? TimeSpan.FromMilliseconds(0) : TimeSpan.FromMilliseconds(NotificationDelayInMs); + + _notifications.Add(new Notification(title, text, type, delay, onClick, onClose)); + } + + public static void ShowError(string message) + { + Show(LocaleManager.Instance[LocaleKeys.DialogErrorTitle], $"{LocaleManager.Instance[LocaleKeys.DialogErrorMessage]}\n\n{message}", NotificationType.Error); + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs index 8bd146ed..6fea1844 100644 --- a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs +++ b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs @@ -5,7 +5,7 @@ using Avalonia.Media; using Avalonia.Threading; using DynamicData; using DynamicData.Binding; -using LibHac.Bcat; +using LibHac.Common; using LibHac.Fs; using LibHac.FsSystem; using LibHac.Tools.Fs; @@ -344,6 +344,12 @@ namespace Ryujinx.Ava.UI.ViewModels } } + public bool EnabledUserSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.UserAccountSaveDataSize > 0; + + public bool EnabledDeviceSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.DeviceSaveDataSize > 0; + + public bool EnabledBcatSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; + public string LoadHeading { get => _loadHeading; @@ -735,19 +741,14 @@ namespace Ryujinx.Ava.UI.ViewModels { get { - switch (ConfigurationState.Instance.Ui.GridSize) + return ConfigurationState.Instance.Ui.GridSize.Value switch { - case 1: - return 78; - case 2: - return 100; - case 3: - return 120; - case 4: - return 140; - default: - return 16; - } + 1 => 78, + 2 => 100, + 3 => 120, + 4 => 140, + _ => 16, + }; } } @@ -755,19 +756,14 @@ namespace Ryujinx.Ava.UI.ViewModels { get { - switch (ConfigurationState.Instance.Ui.GridSize) + return ConfigurationState.Instance.Ui.GridSize.Value switch { - case 1: - return 120; - case 2: - return ShowNames ? 210 : 150; - case 3: - return ShowNames ? 240 : 180; - case 4: - return ShowNames ? 280 : 220; - default: - return 16; - } + 1 => 120, + 2 => ShowNames ? 210 : 150, + 3 => ShowNames ? 240 : 180, + 4 => ShowNames ? 280 : 220, + _ => 16, + }; } } @@ -1091,35 +1087,27 @@ namespace Ryujinx.Ava.UI.ViewModels })); } - private void OpenSaveDirectory(in SaveDataFilter filter, ApplicationData data, ulong titleId) - { - ApplicationHelper.OpenSaveDir(in filter, titleId, data.ControlHolder, data.TitleName); - } - private async void ExtractLogo() { - var selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Logo, selection.Path); + await ApplicationHelper.ExtractSection(NcaSectionType.Logo, SelectedApplication.Path, SelectedApplication.TitleName); } } private async void ExtractRomFs() { - var selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Data, selection.Path); + await ApplicationHelper.ExtractSection(NcaSectionType.Data, SelectedApplication.Path, SelectedApplication.TitleName); } } private async void ExtractExeFs() { - var selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Code, selection.Path); + await ApplicationHelper.ExtractSection(NcaSectionType.Code, SelectedApplication.Path, SelectedApplication.TitleName); } } @@ -1487,56 +1475,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public void OpenDeviceSaveDirectory() - { - ApplicationData selection = SelectedApplication; - if (selection != null) - { - Task.Run(() => - { - if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) - { - async void Action() - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); - } - - Dispatcher.UIThread.Post(Action); - - return; - } - - var saveDataFilter = SaveDataFilter.Make(titleIdNumber, SaveDataType.Device, userId: default, saveDataId: default, index: default); - OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); - }); - } - } - - public void OpenBcatSaveDirectory() - { - ApplicationData selection = SelectedApplication; - if (selection != null) - { - Task.Run(() => - { - if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) - { - async void Action() - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); - } - - Dispatcher.UIThread.Post(Action); - - return; - } - - var saveDataFilter = SaveDataFilter.Make(titleIdNumber, SaveDataType.Bcat, userId: default, saveDataId: default, index: default); - OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); - }); - } - } - public void ToggleFavorite() { ApplicationData selection = SelectedApplication; @@ -1555,37 +1493,45 @@ namespace Ryujinx.Ava.UI.ViewModels public void OpenUserSaveDirectory() { - ApplicationData selection = SelectedApplication; - if (selection != null) + OpenSaveDirectory(SaveDataType.Account, userId: new UserId((ulong)AccountManager.LastOpenedUser.UserId.High, (ulong)AccountManager.LastOpenedUser.UserId.Low)); + } + + public void OpenDeviceSaveDirectory() + { + OpenSaveDirectory(SaveDataType.Device, userId: default); + } + + public void OpenBcatSaveDirectory() + { + OpenSaveDirectory(SaveDataType.Bcat, userId: default); + } + + private void OpenSaveDirectory(SaveDataType saveDataType, UserId userId) + { + if (SelectedApplication != null) { - Task.Run(() => + if (!ulong.TryParse(SelectedApplication.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) { - if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) + Dispatcher.UIThread.InvokeAsync(async () => { - async void Action() - { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); - } + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); + }); - Dispatcher.UIThread.Post(Action); + return; + } - return; - } + var saveDataFilter = SaveDataFilter.Make(titleIdNumber, saveDataType, userId, saveDataId: default, index: default); - UserId userId = new((ulong)AccountManager.LastOpenedUser.UserId.High, (ulong)AccountManager.LastOpenedUser.UserId.Low); - SaveDataFilter saveDataFilter = SaveDataFilter.Make(titleIdNumber, saveType: default, userId, saveDataId: default, index: default); - OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); - }); + ApplicationHelper.OpenSaveDir(in saveDataFilter, titleIdNumber, SelectedApplication.ControlHolder, SelectedApplication.TitleName); } } public void OpenModsDirectory() { - ApplicationData selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { string modsBasePath = VirtualFileSystem.ModLoader.GetModsBasePath(); - string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(modsBasePath, selection.TitleId); + string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(modsBasePath, SelectedApplication.TitleId); OpenHelper.OpenFolder(titleModsPath); } @@ -1593,12 +1539,10 @@ namespace Ryujinx.Ava.UI.ViewModels public void OpenSdModsDirectory() { - ApplicationData selection = SelectedApplication; - - if (selection != null) + if (SelectedApplication != null) { string sdModsBasePath = VirtualFileSystem.ModLoader.GetSdModsBasePath(); - string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(sdModsBasePath, selection.TitleId); + string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(sdModsBasePath, SelectedApplication.TitleId); OpenHelper.OpenFolder(titleModsPath); } @@ -1614,25 +1558,17 @@ namespace Ryujinx.Ava.UI.ViewModels public async void OpenDownloadableContentManager() { - ApplicationData selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { - if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - await new DownloadableContentManagerWindow(VirtualFileSystem, ulong.Parse(selection.TitleId, NumberStyles.HexNumber), selection.TitleName).ShowDialog(desktop.MainWindow); - } + await new DownloadableContentManagerWindow(VirtualFileSystem, ulong.Parse(SelectedApplication.TitleId, NumberStyles.HexNumber), SelectedApplication.TitleName).ShowDialog(TopLevel as Window); } } public async void OpenCheatManager() { - ApplicationData selection = SelectedApplication; - if (selection != null) + if (SelectedApplication != null) { - if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - await new CheatWindow(VirtualFileSystem, selection.TitleId, selection.TitleName).ShowDialog(desktop.MainWindow); - } + await new CheatWindow(VirtualFileSystem, SelectedApplication.TitleId, SelectedApplication.TitleName).ShowDialog(TopLevel as Window); } } diff --git a/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs b/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs index 921dfbb1..81e05506 100644 --- a/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs +++ b/Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs @@ -104,6 +104,8 @@ namespace Ryujinx.Ava.UI.Windows ApplicationLibrary.ApplicationCountUpdated += ApplicationLibrary_ApplicationCountUpdated; ApplicationLibrary.ApplicationAdded += ApplicationLibrary_ApplicationAdded; ViewModel.ReloadGameList += ReloadGameList; + + NotificationHelper.SetNotificationManager(this); } private void IsActiveChanged(bool obj) |
