aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ava/UI
diff options
context:
space:
mode:
authorAc_K <Acoustik666@gmail.com>2023-01-21 02:57:37 +0100
committerGitHub <noreply@github.com>2023-01-21 02:57:37 +0100
commita47824f96101a1c1e63b7622f0c4e61ba6345a98 (patch)
treea90592f9084c5243eefe3b542301168b52beb2d2 /Ryujinx.Ava/UI
parent8474d52778d6bc45146b59a1fc921e6702f4b96a (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.axaml5
-rw-r--r--Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs50
-rw-r--r--Ryujinx.Ava/UI/Controls/GameListView.axaml5
-rw-r--r--Ryujinx.Ava/UI/Controls/GameListView.axaml.cs50
-rw-r--r--Ryujinx.Ava/UI/Helpers/NotificationHelper.cs65
-rw-r--r--Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs182
-rw-r--r--Ryujinx.Ava/UI/Windows/MainWindow.axaml.cs2
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)