From e81356d47622547c34da7c68d9d996a804904dea Mon Sep 17 00:00:00 2001 From: Anna Clemens Date: Tue, 6 Apr 2021 15:17:10 -0400 Subject: [PATCH] feat: add toast options --- Dalamud/Game/Internal/Gui/ToastGui.cs | 51 ++++++++++++++++++++------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/Dalamud/Game/Internal/Gui/ToastGui.cs b/Dalamud/Game/Internal/Gui/ToastGui.cs index c98980477..b916a5550 100755 --- a/Dalamud/Game/Internal/Gui/ToastGui.cs +++ b/Dalamud/Game/Internal/Gui/ToastGui.cs @@ -8,7 +8,7 @@ using Dalamud.Hooking; namespace Dalamud.Game.Internal.Gui { - public class ToastGui : IDisposable + public sealed class ToastGui : IDisposable { #region Events @@ -27,13 +27,13 @@ namespace Dalamud.Game.Internal.Gui #endregion - private delegate IntPtr ShowToastDelegate(IntPtr manager, IntPtr text, int layer, byte bool1, byte bool2, int logMessageId); + private delegate IntPtr ShowToastDelegate(IntPtr manager, IntPtr text, int layer, byte isTop, byte isFast, int logMessageId); private Dalamud Dalamud { get; } private ToastGuiAddressResolver Address { get; } - private Queue ToastQueue { get; } = new Queue(); + private Queue<(byte[] message, ToastOptions options)> ToastQueue { get; } = new Queue<(byte[] message, ToastOptions options)>(); public ToastGui(SigScanner scanner, Dalamud dalamud) @@ -61,18 +61,22 @@ namespace Dalamud.Game.Internal.Gui /// Show a toast message with the given content. /// /// The message to be shown - public void Show(string message) + /// Options for the toast + public void Show(string message, ToastOptions options = null) { - this.ToastQueue.Enqueue(Encoding.UTF8.GetBytes(message)); + options ??= new ToastOptions(); + this.ToastQueue.Enqueue((Encoding.UTF8.GetBytes(message), options)); } /// /// Show a toast message with the given content. /// /// The message to be shown - public void Show(SeString message) + /// Options for the toast + public void Show(SeString message, ToastOptions options = null) { - this.ToastQueue.Enqueue(message.Encode()); + options ??= new ToastOptions(); + this.ToastQueue.Enqueue((message.Encode(), options)); } /// @@ -82,13 +86,15 @@ namespace Dalamud.Game.Internal.Gui { while (this.ToastQueue.Count > 0) { - var message = this.ToastQueue.Dequeue(); - this.Show(message); + var (message, options) = this.ToastQueue.Dequeue(); + this.Show(message, options); } } - private void Show(byte[] bytes) + private void Show(byte[] bytes, ToastOptions options = null) { + options ??= new ToastOptions(); + var manager = this.Dalamud.Framework.Gui.GetUIModule(); // terminate the string @@ -100,12 +106,12 @@ namespace Dalamud.Game.Internal.Gui { fixed (byte* ptr = terminated) { - this.HandleToastDetour(manager, (IntPtr)ptr, 5, 0, 1, 0); + this.HandleToastDetour(manager, (IntPtr)ptr, 5, (byte)options.Position, (byte)options.Speed, 0); } } } - private IntPtr HandleToastDetour(IntPtr manager, IntPtr text, int layer, byte bool1, byte bool2, int logMessageId) + private IntPtr HandleToastDetour(IntPtr manager, IntPtr text, int layer, byte isTop, byte isFast, int logMessageId) { if (text == IntPtr.Zero) { @@ -145,9 +151,28 @@ namespace Dalamud.Game.Internal.Gui { fixed (byte* message = terminated) { - return this.showToastHook.Original(manager, (IntPtr)message, layer, bool1, bool2, logMessageId); + return this.showToastHook.Original(manager, (IntPtr)message, layer, isTop, isFast, logMessageId); } } } } + + public sealed class ToastOptions + { + public ToastPosition Position { get; set; } = ToastPosition.Bottom; + + public ToastSpeed Speed { get; set; } = ToastSpeed.Slow; + } + + public enum ToastPosition : byte + { + Bottom = 0, + Top = 1, + } + + public enum ToastSpeed : byte + { + Slow = 0, + Fast = 1, + } }