From 610eecc1c1fec2203fff1ebd71cd10798fbcc05a Mon Sep 17 00:00:00 2001
From: Ac_K <Acoustik666@gmail.com>
Date: Mon, 9 Jan 2023 04:37:20 +0100
Subject: [PATCH] ava: Fixes regressions from refactoring (#4237)

* ava: Fix regressions from #4178

* Remove duplicated code

* real fix for right click menu

Co-Authored-By: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>

* Remove ContentDialogOverlay

Co-authored-by: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
---
 Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs |   4 +-
 Ryujinx.Ava/UI/Controls/GameListView.axaml.cs |   4 +-
 Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs | 333 +++++++------
 .../UI/ViewModels/MainWindowViewModel.cs      |   5 +-
 .../UI/Views/Main/MainMenuBarView.axaml.cs    |   5 +-
 .../UI/Views/Main/MainStatusBarView.axaml.cs  |   2 +-
 .../UI/Views/Main/MainViewControls.axaml.cs   |   2 +-
 Ryujinx.Ava/UI/Windows/AboutWindow.axaml      | 460 +++++++++---------
 Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs   |  11 +-
 9 files changed, 427 insertions(+), 399 deletions(-)

diff --git a/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs b/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs
index 9965f75092..531b54357c 100644
--- a/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs
+++ b/Ryujinx.Ava/UI/Controls/GameGridView.axaml.cs
@@ -38,9 +38,9 @@ namespace Ryujinx.Ava.UI.Controls
         {
             if (sender is ListBox listBox)
             {
-                var selected = listBox.SelectedItem as ApplicationData;
+                _selectedApplication = listBox.SelectedItem as ApplicationData;
 
-                _selectedApplication = selected;
+                (DataContext as MainWindowViewModel).GridSelectedApplication = _selectedApplication;
             }
         }
 
diff --git a/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs b/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs
index 01e35990d8..bded1dec7f 100644
--- a/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs
+++ b/Ryujinx.Ava/UI/Controls/GameListView.axaml.cs
@@ -38,9 +38,9 @@ namespace Ryujinx.Ava.UI.Controls
         {
             if (sender is ListBox listBox)
             {
-                var selected = listBox.SelectedItem as ApplicationData;
+                _selectedApplication = listBox.SelectedItem as ApplicationData;
 
-                _selectedApplication = selected;
+                (DataContext as MainWindowViewModel).ListSelectedApplication = _selectedApplication;
             }
         }
 
diff --git a/Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs b/Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs
index a098a8eae6..f4334b5f6d 100644
--- a/Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs
+++ b/Ryujinx.Ava/UI/Helpers/ContentDialogHelper.cs
@@ -19,7 +19,56 @@ namespace Ryujinx.Ava.UI.Helpers
     {
         private static bool _isChoiceDialogOpen;
 
-        private async static Task<UserResult> ShowContentDialog(
+        public async static Task<UserResult> ShowContentDialog(
+             string title,
+             object content,
+             string primaryButton,
+             string secondaryButton,
+             string closeButton,
+             UserResult primaryButtonResult = UserResult.Ok,
+             ManualResetEvent deferResetEvent = null,
+             Func<Window, Task> doWhileDeferred = null,
+             TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
+        {
+            UserResult result = UserResult.None;
+
+            ContentDialog contentDialog = new()
+            {
+                Title               = title,
+                PrimaryButtonText   = primaryButton,
+                SecondaryButtonText = secondaryButton,
+                CloseButtonText     = closeButton,
+                Content             = content
+            };
+
+            contentDialog.PrimaryButtonCommand = MiniCommand.Create(() =>
+            {
+                result = primaryButtonResult;
+            });
+
+            contentDialog.SecondaryButtonCommand = MiniCommand.Create(() =>
+            {
+                result = UserResult.No;
+                contentDialog.PrimaryButtonClick -= deferCloseAction;
+            });
+
+            contentDialog.CloseButtonCommand = MiniCommand.Create(() =>
+            {
+                result = UserResult.Cancel;
+                contentDialog.PrimaryButtonClick -= deferCloseAction;
+            });
+
+            if (deferResetEvent != null)
+            {
+                contentDialog.PrimaryButtonClick += deferCloseAction;
+            }
+
+            await ShowAsync(contentDialog);
+
+            return result;
+        }
+
+        private async static Task<UserResult> ShowTextDialog(
             string title,
             string primaryText,
             string secondaryText,
@@ -32,119 +81,9 @@ namespace Ryujinx.Ava.UI.Helpers
             Func<Window, Task> doWhileDeferred = null,
             TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
         {
-            UserResult result = UserResult.None;
+            Grid content = CreateTextDialogContent(primaryText, secondaryText, iconSymbol);
 
-            bool useOverlay = false;
-            Window mainWindow = null;
-
-            if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al)
-            {
-                foreach (var item in al.Windows)
-                {
-                    if (item.IsActive && item is MainWindow window && window.ViewModel.IsGameRunning)
-                    {
-                        mainWindow = window;
-                        useOverlay = true;
-                        break;
-                    }
-                }
-            }
-
-            ContentDialog contentDialog = null;
-            ContentDialogOverlayWindow overlay = null;
-
-            if (useOverlay)
-            {
-                overlay = new ContentDialogOverlayWindow()
-                {
-                    Height = mainWindow.Bounds.Height,
-                    Width = mainWindow.Bounds.Width,
-                    Position = mainWindow.PointToScreen(new Point())
-                };
-
-                mainWindow.PositionChanged += OverlayOnPositionChanged;
-
-                void OverlayOnPositionChanged(object sender, PixelPointEventArgs e)
-                {
-                    overlay.Position = mainWindow.PointToScreen(new Point());
-                }
-
-                contentDialog = overlay.ContentDialog;
-
-                bool opened = false;
-
-                overlay.Opened += OverlayOnActivated;
-
-                async void OverlayOnActivated(object sender, EventArgs e)
-                {
-                    if (opened)
-                    {
-                        return;
-                    }
-
-                    opened = true;
-
-                    overlay.Position = mainWindow.PointToScreen(new Point());
-
-                    await ShowDialog();
-                }
-
-                await overlay.ShowDialog(mainWindow);
-            }
-            else
-            {
-                contentDialog = new ContentDialog();
-
-                await ShowDialog();
-            }
-
-            async Task ShowDialog()
-            {
-                contentDialog.Title = title;
-                contentDialog.PrimaryButtonText = primaryButton;
-                contentDialog.SecondaryButtonText = secondaryButton;
-                contentDialog.CloseButtonText = closeButton;
-                contentDialog.Content = CreateDialogTextContent(primaryText, secondaryText, iconSymbol);
-
-                contentDialog.PrimaryButtonCommand = MiniCommand.Create(() =>
-                {
-                    result = primaryButtonResult;
-                });
-                contentDialog.SecondaryButtonCommand = MiniCommand.Create(() =>
-                {
-                    result = UserResult.No;
-                    contentDialog.PrimaryButtonClick -= deferCloseAction;
-                });
-                contentDialog.CloseButtonCommand = MiniCommand.Create(() =>
-                {
-                    result = UserResult.Cancel;
-                    contentDialog.PrimaryButtonClick -= deferCloseAction;
-                });
-
-                if (deferResetEvent != null)
-                {
-                    contentDialog.PrimaryButtonClick += deferCloseAction;
-                }
-
-                if (useOverlay)
-                {
-                    await contentDialog.ShowAsync(overlay, ContentDialogPlacement.Popup);
-
-                    overlay!.Close();
-                }
-                else
-                {
-                    await contentDialog.ShowAsync(ContentDialogPlacement.Popup);
-                }
-            }
-
-            if (useOverlay)
-            {
-                overlay.Content = null;
-                overlay.Close();
-            }
-
-            return result;
+            return await ShowContentDialog(title, content, primaryButton, secondaryButton, closeButton, primaryButtonResult, deferResetEvent, doWhileDeferred, deferCloseAction);
         }
 
         public async static Task<UserResult> ShowDeferredContentDialog(
@@ -162,7 +101,7 @@ namespace Ryujinx.Ava.UI.Helpers
             bool startedDeferring = false;
             UserResult result = UserResult.None;
 
-            return await ShowContentDialog(
+            return await ShowTextDialog(
                 title,
                 primaryText,
                 secondaryText,
@@ -192,8 +131,7 @@ namespace Ryujinx.Ava.UI.Helpers
 
                 sender.PrimaryButtonClick -= DeferClose;
 
-#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
-                Task.Run(() =>
+                _ = Task.Run(() =>
                 {
                     deferResetEvent.WaitOne();
 
@@ -202,7 +140,6 @@ namespace Ryujinx.Ava.UI.Helpers
                         deferral.Complete();
                     });
                 });
-#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
 
                 if (doWhileDeferred != null)
                 {
@@ -213,34 +150,42 @@ namespace Ryujinx.Ava.UI.Helpers
             }
         }
 
-        private static Grid CreateDialogTextContent(string primaryText, string secondaryText, int symbol)
+        private static Grid CreateTextDialogContent(string primaryText, string secondaryText, int symbol)
         {
-            Grid content = new Grid();
-            content.RowDefinitions = new RowDefinitions() { new RowDefinition(), new RowDefinition() };
-            content.ColumnDefinitions = new ColumnDefinitions() { new ColumnDefinition(GridLength.Auto), new ColumnDefinition() };
+            Grid content = new()
+            {
+                RowDefinitions    = new RowDefinitions()    { new RowDefinition(), new RowDefinition() },
+                ColumnDefinitions = new ColumnDefinitions() { new ColumnDefinition(GridLength.Auto), new ColumnDefinition() },
 
-            content.MinHeight = 80;
+                MinHeight = 80
+            };
+
+            SymbolIcon icon = new()
+            {
+                Symbol            = (Symbol)symbol,
+                Margin            = new Thickness(10),
+                FontSize          = 40,
+                VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center
+            };
 
-            SymbolIcon icon = new SymbolIcon { Symbol = (Symbol)symbol, Margin = new Thickness(10) };
-            icon.FontSize = 40;
-            icon.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center;
             Grid.SetColumn(icon, 0);
             Grid.SetRowSpan(icon, 2);
             Grid.SetRow(icon, 0);
 
-            TextBlock primaryLabel = new TextBlock()
+            TextBlock primaryLabel = new()
             {
-                Text = primaryText,
-                Margin = new Thickness(5),
+                Text         = primaryText,
+                Margin       = new Thickness(5),
                 TextWrapping = TextWrapping.Wrap,
-                MaxWidth = 450
+                MaxWidth     = 450
             };
-            TextBlock secondaryLabel = new TextBlock()
+
+            TextBlock secondaryLabel = new()
             {
-                Text = secondaryText,
-                Margin = new Thickness(5),
+                Text         = secondaryText,
+                Margin       = new Thickness(5),
                 TextWrapping = TextWrapping.Wrap,
-                MaxWidth = 450
+                MaxWidth     = 450
             };
 
             Grid.SetColumn(primaryLabel, 1);
@@ -262,7 +207,7 @@ namespace Ryujinx.Ava.UI.Helpers
             string closeButton,
             string title)
         {
-            return await ShowContentDialog(
+            return await ShowTextDialog(
                 title,
                 primary,
                 secondaryText,
@@ -280,7 +225,7 @@ namespace Ryujinx.Ava.UI.Helpers
             string title,
             UserResult primaryButtonResult = UserResult.Yes)
         {
-            return await ShowContentDialog(
+            return await ShowTextDialog(
                 string.IsNullOrWhiteSpace(title) ? LocaleManager.Instance[LocaleKeys.DialogConfirmationTitle] : title,
                 primaryText,
                 secondaryText,
@@ -298,7 +243,7 @@ namespace Ryujinx.Ava.UI.Helpers
 
         internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText)
         {
-            await ShowContentDialog(
+            await ShowTextDialog(
                 LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle],
                 primary,
                 secondaryText,
@@ -310,7 +255,7 @@ namespace Ryujinx.Ava.UI.Helpers
 
         internal static async Task CreateWarningDialog(string primary, string secondaryText)
         {
-            await ShowContentDialog(
+            await ShowTextDialog(
                 LocaleManager.Instance[LocaleKeys.DialogWarningTitle],
                 primary,
                 secondaryText,
@@ -324,7 +269,7 @@ namespace Ryujinx.Ava.UI.Helpers
         {
             Logger.Error?.Print(LogClass.Application, errorMessage);
 
-            await ShowContentDialog(
+            await ShowTextDialog(
                 LocaleManager.Instance[LocaleKeys.DialogErrorTitle],
                 LocaleManager.Instance[LocaleKeys.DialogErrorMessage],
                 errorMessage,
@@ -343,16 +288,15 @@ namespace Ryujinx.Ava.UI.Helpers
 
             _isChoiceDialogOpen = true;
 
-            UserResult response =
-                await ShowContentDialog(
-                    title,
-                    primary,
-                    secondaryText,
-                    LocaleManager.Instance[LocaleKeys.InputDialogYes],
-                    "",
-                    LocaleManager.Instance[LocaleKeys.InputDialogNo],
-                    (int)Symbol.Help,
-                    UserResult.Yes);
+            UserResult response = await ShowTextDialog(
+                title,
+                primary,
+                secondaryText,
+                LocaleManager.Instance[LocaleKeys.InputDialogYes],
+                "",
+                LocaleManager.Instance[LocaleKeys.InputDialogNo],
+                (int)Symbol.Help,
+                UserResult.Yes);
 
             _isChoiceDialogOpen = false;
 
@@ -396,5 +340,98 @@ namespace Ryujinx.Ava.UI.Helpers
 
             return string.Empty;
         }
+
+        public static async Task<ContentDialogResult> ShowAsync(ContentDialog contentDialog)
+        {
+            ContentDialogResult result;
+
+            ContentDialogOverlayWindow contentDialogOverlayWindow = null;
+
+            Window parent = GetMainWindow();
+
+            if (parent.IsActive && parent is MainWindow window && window.ViewModel.IsGameRunning)
+            {
+                contentDialogOverlayWindow = new()
+                {
+                    Height        = parent.Bounds.Height,
+                    Width         = parent.Bounds.Width,
+                    Position      = parent.PointToScreen(new Point()),
+                    ShowInTaskbar = false
+                };
+
+                parent.PositionChanged += OverlayOnPositionChanged;
+
+                void OverlayOnPositionChanged(object sender, PixelPointEventArgs e)
+                {
+                    contentDialogOverlayWindow.Position = parent.PointToScreen(new Point());
+                }
+
+                contentDialogOverlayWindow.ContentDialog = contentDialog;
+
+                bool opened = false;
+
+                contentDialogOverlayWindow.Opened += OverlayOnActivated;
+
+                async void OverlayOnActivated(object sender, EventArgs e)
+                {
+                    if (opened)
+                    {
+                        return;
+                    }
+
+                    opened = true;
+
+                    contentDialogOverlayWindow.Position = parent.PointToScreen(new Point());
+
+                    result = await ShowDialog();
+                }
+
+                result = await contentDialogOverlayWindow.ShowDialog<ContentDialogResult>(parent);
+            }
+            else
+            {
+                result = await ShowDialog();
+            }
+
+            async Task<ContentDialogResult> ShowDialog()
+            {
+                if (contentDialogOverlayWindow is not null)
+                {
+                    result = await contentDialog.ShowAsync(contentDialogOverlayWindow);
+
+                    contentDialogOverlayWindow!.Close();
+                }
+                else
+                {
+                    result = await contentDialog.ShowAsync();
+                }
+
+                return result;
+            }
+
+            if (contentDialogOverlayWindow is not null)
+            {
+                contentDialogOverlayWindow.Content = null;
+                contentDialogOverlayWindow.Close();
+            }
+
+            return result;
+        }
+
+        private static Window GetMainWindow()
+        {
+            if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime al)
+            {
+                foreach (Window item in al.Windows)
+                {
+                    if (item.IsActive && item is MainWindow window)
+                    {
+                        return window;
+                    }
+                }
+            }
+
+            return null;
+        }
     }
 }
\ No newline at end of file
diff --git a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
index 9571af477b..073c4902d0 100644
--- a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
+++ b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs
@@ -87,8 +87,6 @@ namespace Ryujinx.Ava.UI.ViewModels
         private float _volume;
         private string _backendText;
 
-        public ApplicationData ListSelectedApplication;
-        public ApplicationData GridSelectedApplication;
         private bool _canUpdate;
         private Cursor _cursor;
         private string _title;
@@ -97,6 +95,9 @@ namespace Ryujinx.Ava.UI.ViewModels
         private WindowState _windowState;
         private bool _isActive;
 
+        public ApplicationData ListSelectedApplication;
+        public ApplicationData GridSelectedApplication;
+
         public event Action ReloadGameList;
 
         private string TitleName { get; set; }
diff --git a/Ryujinx.Ava/UI/Views/Main/MainMenuBarView.axaml.cs b/Ryujinx.Ava/UI/Views/Main/MainMenuBarView.axaml.cs
index 8c28abffe6..788f47a1ab 100644
--- a/Ryujinx.Ava/UI/Views/Main/MainMenuBarView.axaml.cs
+++ b/Ryujinx.Ava/UI/Views/Main/MainMenuBarView.axaml.cs
@@ -36,10 +36,7 @@ namespace Ryujinx.Ava.UI.Views.Main
 
         private async void StopEmulation_Click(object sender, RoutedEventArgs e)
         {
-            await Task.Run(() =>
-            {
-                Window.ViewModel.AppHost?.ShowExitPrompt();
-            });
+            await Window.ViewModel.AppHost?.ShowExitPrompt();
         }
 
         private async void PauseEmulation_Click(object sender, RoutedEventArgs e)
diff --git a/Ryujinx.Ava/UI/Views/Main/MainStatusBarView.axaml.cs b/Ryujinx.Ava/UI/Views/Main/MainStatusBarView.axaml.cs
index d1050dddf7..473de0ee2d 100644
--- a/Ryujinx.Ava/UI/Views/Main/MainStatusBarView.axaml.cs
+++ b/Ryujinx.Ava/UI/Views/Main/MainStatusBarView.axaml.cs
@@ -22,7 +22,7 @@ namespace Ryujinx.Ava.UI.Views.Main
         {
             base.OnAttachedToVisualTree(e);
 
-            if (this.VisualRoot is MainWindow window)
+            if (VisualRoot is MainWindow window)
             {
                 Window = window;
             }
diff --git a/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs b/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs
index 841d59dec9..fd75789396 100644
--- a/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs
+++ b/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml.cs
@@ -22,7 +22,7 @@ namespace Ryujinx.Ava.UI.Views.Main
         {
             base.OnAttachedToVisualTree(e);
 
-            if (this.VisualRoot is MainWindow window)
+            if (VisualRoot is MainWindow window)
             {
                 ViewModel = window.ViewModel;
             }
diff --git a/Ryujinx.Ava/UI/Windows/AboutWindow.axaml b/Ryujinx.Ava/UI/Windows/AboutWindow.axaml
index f446890cc0..7bd3e20d3d 100644
--- a/Ryujinx.Ava/UI/Windows/AboutWindow.axaml
+++ b/Ryujinx.Ava/UI/Windows/AboutWindow.axaml
@@ -1,253 +1,247 @@
 <UserControl
+    x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
     xmlns="https://github.com/avaloniaui"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-    xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale"
     xmlns:flex="clr-namespace:Avalonia.Flexbox;assembly=Avalonia.Flexbox"
+    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:viewModel="clr-namespace:Ryujinx.Ava.UI.ViewModels"
-    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-    mc:Ignorable="d"
+    Width="550"
+    Height="260"
+    Margin="0,-12,0,0"
     d:DesignHeight="260"
     d:DesignWidth="550"
-    Height="260"
-    Width="550"
-    x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
-    x:DataType="viewModel:AboutWindowViewModel"
     x:CompileBindings="True"
-    Margin="0 -12 0 0"
-    Focusable="True">
-	<Design.DataContext>
-		<viewModel:AboutWindowViewModel />
-	</Design.DataContext>
-	<Grid
-        HorizontalAlignment="Stretch"
-        VerticalAlignment="Stretch">
-		<Grid.ColumnDefinitions>
-			<ColumnDefinition Width="Auto" />
-			<ColumnDefinition Width="Auto" />
-			<ColumnDefinition Width="*" />
-		</Grid.ColumnDefinitions>
-		<Grid
+    x:DataType="viewModel:AboutWindowViewModel"
+    Focusable="True"
+    mc:Ignorable="d">
+    <Design.DataContext>
+        <viewModel:AboutWindowViewModel />
+    </Design.DataContext>
+    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="Auto" />
+            <ColumnDefinition Width="Auto" />
+            <ColumnDefinition Width="*" />
+        </Grid.ColumnDefinitions>
+        <Grid
             Grid.Column="0"
             HorizontalAlignment="Stretch"
             VerticalAlignment="Stretch">
-			<Grid.RowDefinitions>
-				<RowDefinition Height="Auto" />
-				<RowDefinition Height="*" />
-				<RowDefinition Height="Auto" />
-			</Grid.RowDefinitions>
-			<StackPanel
-				Grid.Row="0"
-				Spacing="10"
-				HorizontalAlignment="Stretch"
-				VerticalAlignment="Stretch">
-				<Grid>
-					<Grid.ColumnDefinitions>
-						<ColumnDefinition Width="Auto" />
-						<ColumnDefinition Width="*" />
-						<ColumnDefinition Width="Auto" />
-					</Grid.ColumnDefinitions>
-					<Image
-						Grid.Column="0"
-						Height="80"
-						Source="resm:Ryujinx.Ui.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.Ui.Common" />
-					<flex:FlexPanel
-						Grid.Column="2"
-						HorizontalAlignment="Stretch"
-						VerticalAlignment="Stretch"
-						Direction="Column"
-						JustifyContent="SpaceAround"
-						RowSpacing="2">
-						<TextBlock
-							FontSize="28"
-							FontWeight="Bold"
-							Text="Ryujinx"
-							TextAlignment="Left" />
-						<TextBlock
-							Text="(REE-YOU-JINX)"
-							TextAlignment="Left" />
-					</flex:FlexPanel>
-				</Grid>
-				<TextBlock
-					HorizontalAlignment="Center"
-					VerticalAlignment="Center"
-					Text="{Binding Version}"
-					TextAlignment="Center"
-					FontSize="10"
-					LineHeight="12" />
-			</StackPanel>
-			<StackPanel
-				Grid.Row="2"
-				Spacing="10"
-				HorizontalAlignment="Stretch"
-				VerticalAlignment="Stretch">
-				<TextBlock
-	                HorizontalAlignment="Center"
-	                Width="200"
-	                Text="{locale:Locale AboutDisclaimerMessage}"
-	                TextAlignment="Center"
-	                TextWrapping="Wrap"
-	                FontSize="10"
-	                LineHeight="12" />
-				<TextBlock
-	                Name="AmiiboLabel"
-	                HorizontalAlignment="Center"
-	                Width="200"
-	                PointerPressed="AmiiboLabel_OnPointerPressed"
-	                Text="{locale:Locale AboutAmiiboDisclaimerMessage}"
-	                TextAlignment="Center"
-	                TextWrapping="Wrap"
-	                FontSize="10"
-	                LineHeight="12" />
-				<StackPanel
-	                HorizontalAlignment="Center"
-	                Orientation="Horizontal"
-	                Spacing="10">
-					<Button
-						MaxHeight="30"
-						MaxWidth="30"
-						MinHeight="30"
-						MinWidth="30"
-						Padding="8"
-						CornerRadius="15"
-						Background="Transparent"
-						Click="Button_OnClick"
-						Tag="https://www.patreon.com/ryujinx"
-						ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
-						<Image Source="{Binding PatreonLogo}" />
-					</Button>
-					<Button
-						MaxHeight="30"
-						MaxWidth="30"
-						MinHeight="30"
-						MinWidth="30"
-						Padding="8"
-						CornerRadius="15"
-						Background="Transparent"
-						Click="Button_OnClick"
-						Tag="https://github.com/Ryujinx/Ryujinx"
-						ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
-						<Image Source="{Binding GithubLogo}" />
-					</Button>
-					<Button
-						MaxHeight="30"
-						MaxWidth="30"
-						MinHeight="30"
-						MinWidth="30"
-						Padding="8"
-						CornerRadius="15"
-						Background="Transparent"
-						Click="Button_OnClick"
-						Tag="https://discordapp.com/invite/N2FmfVc"
-						ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
-						<Image Source="{Binding DiscordLogo}" />
-					</Button>
-					<Button
-						MaxHeight="30"
-						MaxWidth="30"
-						MinHeight="30"
-						MinWidth="30"
-						Padding="8"
-						CornerRadius="15"
-						Background="Transparent"
-						Click="Button_OnClick"
-						Tag="https://twitter.com/RyujinxEmu"
-						ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
-						<Image Source="{Binding TwitterLogo}" />
-					</Button>
-					<Button
-						MaxHeight="30"
-						MaxWidth="30"
-						MinHeight="30"
-						MinWidth="30"
-						Padding="8"
-						CornerRadius="15"
-						Background="Transparent"
-						Click="Button_OnClick"
-						Tag="https://www.ryujinx.org"
-						ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
-						<ui:SymbolIcon
-							Symbol="Link"
-							Foreground="{DynamicResource ThemeForegroundColor}" />
-					</Button>
-				</StackPanel>
-			</StackPanel>
-		</Grid>
-		<Border
+            <Grid.RowDefinitions>
+                <RowDefinition Height="Auto" />
+                <RowDefinition Height="*" />
+                <RowDefinition Height="Auto" />
+            </Grid.RowDefinitions>
+            <StackPanel
+                Grid.Row="0"
+                HorizontalAlignment="Stretch"
+                VerticalAlignment="Stretch"
+                Spacing="10">
+                <Grid>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="Auto" />
+                        <ColumnDefinition Width="*" />
+                        <ColumnDefinition Width="Auto" />
+                    </Grid.ColumnDefinitions>
+                    <Image
+                        Grid.Column="0"
+                        Height="80"
+                        Source="resm:Ryujinx.Ui.Common.Resources.Logo_Ryujinx.png?assembly=Ryujinx.Ui.Common" />
+                    <flex:FlexPanel
+                        Grid.Column="2"
+                        HorizontalAlignment="Stretch"
+                        VerticalAlignment="Stretch"
+                        Direction="Column"
+                        JustifyContent="SpaceAround"
+                        RowSpacing="2">
+                        <TextBlock
+                            FontSize="28"
+                            FontWeight="Bold"
+                            Text="Ryujinx"
+                            TextAlignment="Left" />
+                        <TextBlock Text="(REE-YOU-JINX)" TextAlignment="Left" />
+                    </flex:FlexPanel>
+                </Grid>
+                <TextBlock
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    FontSize="10"
+                    LineHeight="12"
+                    Text="{Binding Version}"
+                    TextAlignment="Center" />
+            </StackPanel>
+            <StackPanel
+                Grid.Row="2"
+                HorizontalAlignment="Stretch"
+                VerticalAlignment="Stretch"
+                Spacing="10">
+                <TextBlock
+                    Width="200"
+                    HorizontalAlignment="Center"
+                    FontSize="10"
+                    LineHeight="12"
+                    Text="{locale:Locale AboutDisclaimerMessage}"
+                    TextAlignment="Center"
+                    TextWrapping="Wrap" />
+                <TextBlock
+                    Name="AmiiboLabel"
+                    Width="200"
+                    HorizontalAlignment="Center"
+                    FontSize="10"
+                    LineHeight="12"
+                    PointerPressed="AmiiboLabel_OnPointerPressed"
+                    Text="{locale:Locale AboutAmiiboDisclaimerMessage}"
+                    TextAlignment="Center"
+                    TextWrapping="Wrap" />
+                <StackPanel
+                    HorizontalAlignment="Center"
+                    Orientation="Horizontal"
+                    Spacing="10">
+                    <Button
+                        MinWidth="30"
+                        MinHeight="30"
+                        MaxWidth="30"
+                        MaxHeight="30"
+                        Padding="8"
+                        Background="Transparent"
+                        Click="Button_OnClick"
+                        CornerRadius="15"
+                        Tag="https://www.patreon.com/ryujinx"
+                        ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
+                        <Image Source="{Binding PatreonLogo}" />
+                    </Button>
+                    <Button
+                        MinWidth="30"
+                        MinHeight="30"
+                        MaxWidth="30"
+                        MaxHeight="30"
+                        Padding="8"
+                        Background="Transparent"
+                        Click="Button_OnClick"
+                        CornerRadius="15"
+                        Tag="https://github.com/Ryujinx/Ryujinx"
+                        ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
+                        <Image Source="{Binding GithubLogo}" />
+                    </Button>
+                    <Button
+                        MinWidth="30"
+                        MinHeight="30"
+                        MaxWidth="30"
+                        MaxHeight="30"
+                        Padding="8"
+                        Background="Transparent"
+                        Click="Button_OnClick"
+                        CornerRadius="15"
+                        Tag="https://discordapp.com/invite/N2FmfVc"
+                        ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
+                        <Image Source="{Binding DiscordLogo}" />
+                    </Button>
+                    <Button
+                        MinWidth="30"
+                        MinHeight="30"
+                        MaxWidth="30"
+                        MaxHeight="30"
+                        Padding="8"
+                        Background="Transparent"
+                        Click="Button_OnClick"
+                        CornerRadius="15"
+                        Tag="https://twitter.com/RyujinxEmu"
+                        ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
+                        <Image Source="{Binding TwitterLogo}" />
+                    </Button>
+                    <Button
+                        MinWidth="30"
+                        MinHeight="30"
+                        MaxWidth="30"
+                        MaxHeight="30"
+                        Padding="8"
+                        Background="Transparent"
+                        Click="Button_OnClick"
+                        CornerRadius="15"
+                        Tag="https://www.ryujinx.org"
+                        ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
+                        <ui:SymbolIcon Foreground="{DynamicResource ThemeForegroundColor}" Symbol="Link" />
+                    </Button>
+                </StackPanel>
+            </StackPanel>
+        </Grid>
+        <Border
             Grid.Column="1"
             Width="1"
+            Margin="20,0"
             VerticalAlignment="Stretch"
             BorderBrush="{DynamicResource ThemeControlBorderColor}"
-            BorderThickness="1,0,0,0"
-            Margin="20 0"/>
-		<Grid
+            BorderThickness="1,0,0,0" />
+        <Grid
             Grid.Column="2"
-			HorizontalAlignment="Stretch"
+            HorizontalAlignment="Stretch"
             VerticalAlignment="Stretch">
-			<Grid.RowDefinitions>
-				<RowDefinition Height="Auto" />
-				<RowDefinition Height="Auto" />
-				<RowDefinition Height="Auto" />
-			</Grid.RowDefinitions>
-			<StackPanel
-				Grid.Row="0"
-				Margin="0 10 0 0"
-				Spacing="2">
-				<TextBlock
-					FontWeight="Bold"
-					FontSize="15"
-					Text="{locale:Locale AboutRyujinxAboutTitle}" />
-				<TextBlock
-					FontSize="10"
-					TextWrapping="Wrap"
-					Text="{locale:Locale AboutRyujinxAboutContent}" />
-			</StackPanel>
-			<StackPanel
-				Grid.Row="1"
-				Margin="0 10 0 0"
-				Spacing="2">
-				<TextBlock
-					FontWeight="Bold"
-					FontSize="15"
-					Text="{locale:Locale AboutRyujinxMaintainersTitle}" />
-				<TextBlock
-					FontSize="10"
-					TextWrapping="Wrap"
-					Text="{Binding Developers}" />
-				<Button
-					HorizontalAlignment="Left"
-					Background="Transparent"
-					Click="Button_OnClick"
-					Padding="5"
-					Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a">
-					<TextBlock
-						FontSize="10"
-						Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
-						TextAlignment="Right"
-						ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
-				</Button>
-			</StackPanel>
-			<StackPanel
-				Grid.Row="2"
-				Margin="0 10 0 0"
-				Spacing="2">
-				<TextBlock
-					FontWeight="Bold"
-					FontSize="15"
-					Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
-				<ScrollViewer
-					VerticalScrollBarVisibility="Visible"
-					HorizontalScrollBarVisibility="Disabled"
-					Height="70">
-					<TextBlock
-						Name="SupportersTextBlock"
-						VerticalAlignment="Top"
-						FontSize="10"
-						TextWrapping="Wrap"
-						Text="{Binding Supporters}" />
-				</ScrollViewer>
-			</StackPanel>
-		</Grid>
-	</Grid>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="Auto" />
+                <RowDefinition Height="Auto" />
+                <RowDefinition Height="Auto" />
+            </Grid.RowDefinitions>
+            <StackPanel
+                Grid.Row="0"
+                Margin="0,10,0,0"
+                Spacing="2">
+                <TextBlock
+                    FontSize="15"
+                    FontWeight="Bold"
+                    Text="{locale:Locale AboutRyujinxAboutTitle}" />
+                <TextBlock
+                    FontSize="10"
+                    Text="{locale:Locale AboutRyujinxAboutContent}"
+                    TextWrapping="Wrap" />
+            </StackPanel>
+            <StackPanel
+                Grid.Row="1"
+                Margin="0,10,0,0"
+                Spacing="2">
+                <TextBlock
+                    FontSize="15"
+                    FontWeight="Bold"
+                    Text="{locale:Locale AboutRyujinxMaintainersTitle}" />
+                <TextBlock
+                    FontSize="10"
+                    Text="{Binding Developers}"
+                    TextWrapping="Wrap" />
+                <Button
+                    Padding="5"
+                    HorizontalAlignment="Left"
+                    Background="Transparent"
+                    Click="Button_OnClick"
+                    Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a">
+                    <TextBlock
+                        FontSize="10"
+                        Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
+                        TextAlignment="Right"
+                        ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
+                </Button>
+            </StackPanel>
+            <StackPanel
+                Grid.Row="2"
+                Margin="0,10,0,0"
+                Spacing="2">
+                <TextBlock
+                    FontSize="15"
+                    FontWeight="Bold"
+                    Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
+                <ScrollViewer
+                    Height="70"
+                    HorizontalScrollBarVisibility="Disabled"
+                    VerticalScrollBarVisibility="Visible">
+                    <TextBlock
+                        Name="SupportersTextBlock"
+                        VerticalAlignment="Top"
+                        FontSize="10"
+                        Text="{Binding Supporters}"
+                        TextWrapping="Wrap" />
+                </ScrollViewer>
+            </StackPanel>
+        </Grid>
+    </Grid>
 </UserControl>
\ No newline at end of file
diff --git a/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs b/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
index 5dbbbcdd78..36a28605ff 100644
--- a/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
+++ b/Ryujinx.Ava/UI/Windows/AboutWindow.axaml.cs
@@ -4,6 +4,7 @@ using Avalonia.Interactivity;
 using Avalonia.Styling;
 using FluentAvalonia.UI.Controls;
 using Ryujinx.Ava.Common.Locale;
+using Ryujinx.Ava.UI.Helpers;
 using Ryujinx.Ava.UI.ViewModels;
 using Ryujinx.Ui.Common.Helper;
 using System.Threading.Tasks;
@@ -22,14 +23,12 @@ namespace Ryujinx.Ava.UI.Windows
 
         public static async Task Show()
         {
-            var content = new AboutWindow();
-
             ContentDialog contentDialog = new()
             {
-                PrimaryButtonText = "",
+                PrimaryButtonText   = "",
                 SecondaryButtonText = "",
-                CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
-                Content = content
+                CloseButtonText     = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
+                Content             = new AboutWindow()
             };
 
             Style closeButton = new(x => x.Name("CloseButton"));
@@ -41,7 +40,7 @@ namespace Ryujinx.Ava.UI.Windows
             contentDialog.Styles.Add(closeButton);
             contentDialog.Styles.Add(closeButtonParent);
 
-            await contentDialog.ShowAsync();
+            await ContentDialogHelper.ShowAsync(contentDialog);
         }
 
         private void Button_OnClick(object sender, RoutedEventArgs e)