From 0f3b9eab8cd52d0e42a269f3f4d32caefaca7824 Mon Sep 17 00:00:00 2001
From: MidoriKami <9083275+MidoriKami@users.noreply.github.com>
Date: Sun, 10 Sep 2023 16:24:47 -0700
Subject: [PATCH] Add IToastGui (v9) (#1280)
---
Dalamud/Game/Gui/Toast/ToastGui.cs | 183 ++++++++++++++-------------
Dalamud/Plugin/Services/IToastGui.cs | 88 +++++++++++++
2 files changed, 186 insertions(+), 85 deletions(-)
create mode 100644 Dalamud/Plugin/Services/IToastGui.cs
diff --git a/Dalamud/Game/Gui/Toast/ToastGui.cs b/Dalamud/Game/Gui/Toast/ToastGui.cs
index e65fa1444..93126710b 100644
--- a/Dalamud/Game/Gui/Toast/ToastGui.cs
+++ b/Dalamud/Game/Gui/Toast/ToastGui.cs
@@ -1,4 +1,3 @@
-using System;
using System.Collections.Generic;
using System.Text;
@@ -6,16 +5,16 @@ using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Hooking;
using Dalamud.IoC;
using Dalamud.IoC.Internal;
+using Dalamud.Plugin.Services;
namespace Dalamud.Game.Gui.Toast;
///
/// This class facilitates interacting with and creating native toast windows.
///
-[PluginInterface]
[InterfaceVersion("1.0")]
[ServiceManager.BlockingEarlyLoadedService]
-public sealed partial class ToastGui : IDisposable, IServiceType
+internal sealed partial class ToastGui : IDisposable, IServiceType, IToastGui
{
private const uint QuestToastCheckmarkMagic = 60081;
@@ -39,38 +38,11 @@ public sealed partial class ToastGui : IDisposable, IServiceType
this.address = new ToastGuiAddressResolver();
this.address.Setup(sigScanner);
- this.showNormalToastHook = Hook.FromAddress(this.address.ShowNormalToast, new ShowNormalToastDelegate(this.HandleNormalToastDetour));
- this.showQuestToastHook = Hook.FromAddress(this.address.ShowQuestToast, new ShowQuestToastDelegate(this.HandleQuestToastDetour));
- this.showErrorToastHook = Hook.FromAddress(this.address.ShowErrorToast, new ShowErrorToastDelegate(this.HandleErrorToastDetour));
+ this.showNormalToastHook = Hook.FromAddress(this.address.ShowNormalToast, this.HandleNormalToastDetour);
+ this.showQuestToastHook = Hook.FromAddress(this.address.ShowQuestToast, this.HandleQuestToastDetour);
+ this.showErrorToastHook = Hook.FromAddress(this.address.ShowErrorToast, this.HandleErrorToastDetour);
}
- #region Event delegates
-
- ///
- /// A delegate type used when a normal toast window appears.
- ///
- /// The message displayed.
- /// Assorted toast options.
- /// Whether the toast has been handled or should be propagated.
- public delegate void OnNormalToastDelegate(ref SeString message, ref ToastOptions options, ref bool isHandled);
-
- ///
- /// A delegate type used when a quest toast window appears.
- ///
- /// The message displayed.
- /// Assorted toast options.
- /// Whether the toast has been handled or should be propagated.
- public delegate void OnQuestToastDelegate(ref SeString message, ref QuestToastOptions options, ref bool isHandled);
-
- ///
- /// A delegate type used when an error toast window appears.
- ///
- /// The message displayed.
- /// Whether the toast has been handled or should be propagated.
- public delegate void OnErrorToastDelegate(ref SeString message, ref bool isHandled);
-
- #endregion
-
#region Marshal delegates
private delegate IntPtr ShowNormalToastDelegate(IntPtr manager, IntPtr text, int layer, byte isTop, byte isFast, int logMessageId);
@@ -82,21 +54,15 @@ public sealed partial class ToastGui : IDisposable, IServiceType
#endregion
#region Events
+
+ ///
+ public event IToastGui.OnNormalToastDelegate? Toast;
- ///
- /// Event that will be fired when a toast is sent by the game or a plugin.
- ///
- public event OnNormalToastDelegate Toast;
+ ///
+ public event IToastGui.OnQuestToastDelegate? QuestToast;
- ///
- /// Event that will be fired when a quest toast is sent by the game or a plugin.
- ///
- public event OnQuestToastDelegate QuestToast;
-
- ///
- /// Event that will be fired when an error toast is sent by the game or a plugin.
- ///
- public event OnErrorToastDelegate ErrorToast;
+ ///
+ public event IToastGui.OnErrorToastDelegate? ErrorToast;
#endregion
@@ -172,31 +138,23 @@ public sealed partial class ToastGui : IDisposable, IServiceType
///
/// Handles normal toasts.
///
-public sealed partial class ToastGui
+internal sealed partial class ToastGui
{
- ///
- /// Show a toast message with the given content.
- ///
- /// The message to be shown.
- /// Options for the toast.
- public void ShowNormal(string message, ToastOptions options = null)
+ ///
+ public void ShowNormal(string message, ToastOptions? options = null)
{
options ??= new ToastOptions();
this.normalQueue.Enqueue((Encoding.UTF8.GetBytes(message), options));
}
-
- ///
- /// Show a toast message with the given content.
- ///
- /// The message to be shown.
- /// Options for the toast.
- public void ShowNormal(SeString message, ToastOptions options = null)
+
+ ///
+ public void ShowNormal(SeString message, ToastOptions? options = null)
{
options ??= new ToastOptions();
this.normalQueue.Enqueue((message.Encode(), options));
}
- private void ShowNormal(byte[] bytes, ToastOptions options = null)
+ private void ShowNormal(byte[] bytes, ToastOptions? options = null)
{
options ??= new ToastOptions();
@@ -255,31 +213,23 @@ public sealed partial class ToastGui
///
/// Handles quest toasts.
///
-public sealed partial class ToastGui
+internal sealed partial class ToastGui
{
- ///
- /// Show a quest toast message with the given content.
- ///
- /// The message to be shown.
- /// Options for the toast.
- public void ShowQuest(string message, QuestToastOptions options = null)
+ ///
+ public void ShowQuest(string message, QuestToastOptions? options = null)
{
options ??= new QuestToastOptions();
this.questQueue.Enqueue((Encoding.UTF8.GetBytes(message), options));
}
-
- ///
- /// Show a quest toast message with the given content.
- ///
- /// The message to be shown.
- /// Options for the toast.
- public void ShowQuest(SeString message, QuestToastOptions options = null)
+
+ ///
+ public void ShowQuest(SeString message, QuestToastOptions? options = null)
{
options ??= new QuestToastOptions();
this.questQueue.Enqueue((message.Encode(), options));
}
- private void ShowQuest(byte[] bytes, QuestToastOptions options = null)
+ private void ShowQuest(byte[] bytes, QuestToastOptions? options = null)
{
options ??= new QuestToastOptions();
@@ -365,21 +315,15 @@ public sealed partial class ToastGui
///
/// Handles error toasts.
///
-public sealed partial class ToastGui
+internal sealed partial class ToastGui
{
- ///
- /// Show an error toast message with the given content.
- ///
- /// The message to be shown.
+ ///
public void ShowError(string message)
{
this.errorQueue.Enqueue(Encoding.UTF8.GetBytes(message));
}
- ///
- /// Show an error toast message with the given content.
- ///
- /// The message to be shown.
+ ///
public void ShowError(SeString message)
{
this.errorQueue.Enqueue(message.Encode());
@@ -433,3 +377,72 @@ public sealed partial class ToastGui
}
}
}
+
+///
+/// Plugin scoped version of ToastGui.
+///
+[PluginInterface]
+[InterfaceVersion("1.0")]
+[ServiceManager.ScopedService]
+#pragma warning disable SA1015
+[ResolveVia]
+#pragma warning restore SA1015
+internal class ToastGuiPluginScoped : IDisposable, IServiceType, IToastGui
+{
+ [ServiceManager.ServiceDependency]
+ private readonly ToastGui toastGuiService = Service.Get();
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ internal ToastGuiPluginScoped()
+ {
+ this.toastGuiService.Toast += this.ToastForward;
+ this.toastGuiService.QuestToast += this.QuestToastForward;
+ this.toastGuiService.ErrorToast += this.ErrorToastForward;
+ }
+
+ ///
+ public event IToastGui.OnNormalToastDelegate? Toast;
+
+ ///
+ public event IToastGui.OnQuestToastDelegate? QuestToast;
+
+ ///
+ public event IToastGui.OnErrorToastDelegate? ErrorToast;
+
+ ///
+ public void Dispose()
+ {
+ this.toastGuiService.Toast -= this.ToastForward;
+ this.toastGuiService.QuestToast -= this.QuestToastForward;
+ this.toastGuiService.ErrorToast -= this.ErrorToastForward;
+ }
+
+ ///
+ public void ShowNormal(string message, ToastOptions? options = null) => this.toastGuiService.ShowNormal(message, options);
+
+ ///
+ public void ShowNormal(SeString message, ToastOptions? options = null) => this.toastGuiService.ShowNormal(message, options);
+
+ ///
+ public void ShowQuest(string message, QuestToastOptions? options = null) => this.toastGuiService.ShowQuest(message, options);
+
+ ///
+ public void ShowQuest(SeString message, QuestToastOptions? options = null) => this.toastGuiService.ShowQuest(message, options);
+
+ ///
+ public void ShowError(string message) => this.toastGuiService.ShowError(message);
+
+ ///
+ public void ShowError(SeString message) => this.toastGuiService.ShowError(message);
+
+ private void ToastForward(ref SeString message, ref ToastOptions options, ref bool isHandled)
+ => this.Toast?.Invoke(ref message, ref options, ref isHandled);
+
+ private void QuestToastForward(ref SeString message, ref QuestToastOptions options, ref bool isHandled)
+ => this.QuestToast?.Invoke(ref message, ref options, ref isHandled);
+
+ private void ErrorToastForward(ref SeString message, ref bool isHandled)
+ => this.ErrorToast?.Invoke(ref message, ref isHandled);
+}
diff --git a/Dalamud/Plugin/Services/IToastGui.cs b/Dalamud/Plugin/Services/IToastGui.cs
new file mode 100644
index 000000000..ef83e95ac
--- /dev/null
+++ b/Dalamud/Plugin/Services/IToastGui.cs
@@ -0,0 +1,88 @@
+using Dalamud.Game.Gui.Toast;
+using Dalamud.Game.Text.SeStringHandling;
+
+namespace Dalamud.Plugin.Services;
+
+///
+/// This class facilitates interacting with and creating native toast windows.
+///
+public interface IToastGui
+{
+ ///
+ /// A delegate type used when a normal toast window appears.
+ ///
+ /// The message displayed.
+ /// Assorted toast options.
+ /// Whether the toast has been handled or should be propagated.
+ public delegate void OnNormalToastDelegate(ref SeString message, ref ToastOptions options, ref bool isHandled);
+
+ ///
+ /// A delegate type used when a quest toast window appears.
+ ///
+ /// The message displayed.
+ /// Assorted toast options.
+ /// Whether the toast has been handled or should be propagated.
+ public delegate void OnQuestToastDelegate(ref SeString message, ref QuestToastOptions options, ref bool isHandled);
+
+ ///
+ /// A delegate type used when an error toast window appears.
+ ///
+ /// The message displayed.
+ /// Whether the toast has been handled or should be propagated.
+ public delegate void OnErrorToastDelegate(ref SeString message, ref bool isHandled);
+
+ ///
+ /// Event that will be fired when a toast is sent by the game or a plugin.
+ ///
+ public event OnNormalToastDelegate Toast;
+
+ ///
+ /// Event that will be fired when a quest toast is sent by the game or a plugin.
+ ///
+ public event OnQuestToastDelegate QuestToast;
+
+ ///
+ /// Event that will be fired when an error toast is sent by the game or a plugin.
+ ///
+ public event OnErrorToastDelegate ErrorToast;
+
+ ///
+ /// Show a toast message with the given content.
+ ///
+ /// The message to be shown.
+ /// Options for the toast.
+ public void ShowNormal(string message, ToastOptions? options = null);
+
+ ///
+ /// Show a toast message with the given content.
+ ///
+ /// The message to be shown.
+ /// Options for the toast.
+ public void ShowNormal(SeString message, ToastOptions? options = null);
+
+ ///
+ /// Show a quest toast message with the given content.
+ ///
+ /// The message to be shown.
+ /// Options for the toast.
+ public void ShowQuest(string message, QuestToastOptions? options = null);
+
+ ///
+ /// Show a quest toast message with the given content.
+ ///
+ /// The message to be shown.
+ /// Options for the toast.
+ public void ShowQuest(SeString message, QuestToastOptions? options = null);
+
+ ///
+ /// Show an error toast message with the given content.
+ ///
+ /// The message to be shown.
+ public void ShowError(string message);
+
+ ///
+ /// Show an error toast message with the given content.
+ ///
+ /// The message to be shown.
+ public void ShowError(SeString message);
+}