From 93aeecc4f337325ed11e3a0a72dd85768db6618f Mon Sep 17 00:00:00 2001
From: gnisman <gleb.nisman@gmail.com>
Date: Mon, 4 Dec 2023 18:52:25 +0200
Subject: Improve indication of emulation being paused by the User (#5836)

* Improve indication of emulation being paused by the User

* Use localised for Paused

* Backup original title - PR comments fix

* Add common helper method to assemble App title
---
 src/Ryujinx.Ava/AppHost.cs                  | 13 +++++--------
 src/Ryujinx.Ava/Assets/Locales/en_US.json   |  1 +
 src/Ryujinx.Ui.Common/Helper/TitleHelper.cs | 30 +++++++++++++++++++++++++++++
 src/Ryujinx/Ui/MainWindow.cs                |  4 ++++
 src/Ryujinx/Ui/RendererWidgetBase.cs        |  8 ++------
 5 files changed, 42 insertions(+), 14 deletions(-)
 create mode 100644 src/Ryujinx.Ui.Common/Helper/TitleHelper.cs

(limited to 'src')

diff --git a/src/Ryujinx.Ava/AppHost.cs b/src/Ryujinx.Ava/AppHost.cs
index a443c0be..dac4a3c5 100644
--- a/src/Ryujinx.Ava/AppHost.cs
+++ b/src/Ryujinx.Ava/AppHost.cs
@@ -346,16 +346,9 @@ namespace Ryujinx.Ava
 
             _viewModel.IsGameRunning = true;
 
-            var activeProcess = Device.Processes.ActiveApplication;
-
-            string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}";
-            string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}";
-            string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})";
-            string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)";
-
             Dispatcher.UIThread.InvokeAsync(() =>
             {
-                _viewModel.Title = $"Ryujinx {Program.Version} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
+                _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device.Processes.ActiveApplication, Program.Version);
             });
 
             _viewModel.SetUiProgressHandlers(Device);
@@ -727,6 +720,8 @@ namespace Ryujinx.Ava
             Device?.System.TogglePauseEmulation(false);
 
             _viewModel.IsPaused = false;
+            _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version);
+            Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
         }
 
         internal void Pause()
@@ -734,6 +729,8 @@ namespace Ryujinx.Ava
             Device?.System.TogglePauseEmulation(true);
 
             _viewModel.IsPaused = true;
+            _viewModel.Title = TitleHelper.ActiveApplicationTitle(Device?.Processes.ActiveApplication, Program.Version, LocaleManager.Instance[LocaleKeys.Paused]);
+            Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
         }
 
         private void InitializeSwitchInstance()
diff --git a/src/Ryujinx.Ava/Assets/Locales/en_US.json b/src/Ryujinx.Ava/Assets/Locales/en_US.json
index bc2bbfe8..493aaa81 100644
--- a/src/Ryujinx.Ava/Assets/Locales/en_US.json
+++ b/src/Ryujinx.Ava/Assets/Locales/en_US.json
@@ -600,6 +600,7 @@
   "Cancel": "Cancel",
   "Save": "Save",
   "Discard": "Discard",
+  "Paused": "Paused",
   "UserProfilesSetProfileImage": "Set Profile Image",
   "UserProfileEmptyNameError": "Name is required",
   "UserProfileNoImageError": "Profile image must be set",
diff --git a/src/Ryujinx.Ui.Common/Helper/TitleHelper.cs b/src/Ryujinx.Ui.Common/Helper/TitleHelper.cs
new file mode 100644
index 00000000..089b5215
--- /dev/null
+++ b/src/Ryujinx.Ui.Common/Helper/TitleHelper.cs
@@ -0,0 +1,30 @@
+using Ryujinx.HLE.Loaders.Processes;
+using System;
+
+namespace Ryujinx.Ui.Common.Helper
+{
+    public static class TitleHelper
+    {
+        public static string ActiveApplicationTitle(ProcessResult activeProcess, string applicationVersion, string pauseString = "")
+        {
+            if (activeProcess == null)
+            {
+                return String.Empty;
+            }
+
+            string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}";
+            string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}";
+            string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})";
+            string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)";
+
+            string appTitle = $"Ryujinx {applicationVersion} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
+
+            if (!string.IsNullOrEmpty(pauseString))
+            {
+                appTitle += $" ({pauseString})";
+            }
+
+            return appTitle;
+        }
+    }
+}
diff --git a/src/Ryujinx/Ui/MainWindow.cs b/src/Ryujinx/Ui/MainWindow.cs
index b12210f8..2a088f56 100644
--- a/src/Ryujinx/Ui/MainWindow.cs
+++ b/src/Ryujinx/Ui/MainWindow.cs
@@ -1453,6 +1453,8 @@ namespace Ryujinx.Ui
             _pauseEmulation.Sensitive = false;
             _resumeEmulation.Sensitive = true;
             _emulationContext.System.TogglePauseEmulation(true);
+            Title = TitleHelper.ActiveApplicationTitle(_emulationContext.Processes.ActiveApplication, Program.Version, "Paused");
+            Logger.Info?.Print(LogClass.Emulation, "Emulation was paused");
         }
 
         private void ResumeEmulation_Pressed(object sender, EventArgs args)
@@ -1460,6 +1462,8 @@ namespace Ryujinx.Ui
             _pauseEmulation.Sensitive = true;
             _resumeEmulation.Sensitive = false;
             _emulationContext.System.TogglePauseEmulation(false);
+            Title = TitleHelper.ActiveApplicationTitle(_emulationContext.Processes.ActiveApplication, Program.Version);
+            Logger.Info?.Print(LogClass.Emulation, "Emulation was resumed");
         }
 
         public void ActivatePauseMenu()
diff --git a/src/Ryujinx/Ui/RendererWidgetBase.cs b/src/Ryujinx/Ui/RendererWidgetBase.cs
index 6a68a792..6ae122a0 100644
--- a/src/Ryujinx/Ui/RendererWidgetBase.cs
+++ b/src/Ryujinx/Ui/RendererWidgetBase.cs
@@ -11,6 +11,7 @@ using Ryujinx.Input;
 using Ryujinx.Input.GTK3;
 using Ryujinx.Input.HLE;
 using Ryujinx.Ui.Common.Configuration;
+using Ryujinx.Ui.Common.Helper;
 using Ryujinx.Ui.Widgets;
 using SixLabors.ImageSharp;
 using SixLabors.ImageSharp.Formats.Png;
@@ -525,12 +526,7 @@ namespace Ryujinx.Ui
 
                 var activeProcess = Device.Processes.ActiveApplication;
 
-                string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}";
-                string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}";
-                string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})";
-                string titleArchSection = activeProcess.Is64Bit ? " (64-bit)" : " (32-bit)";
-
-                parent.Title = $"Ryujinx {Program.Version} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
+                parent.Title = TitleHelper.ActiveApplicationTitle(activeProcess, Program.Version);
             });
 
             Thread renderLoopThread = new(Render)
-- 
cgit v1.2.3-70-g09d2