From ae6c966e279600ca610e1a3511c4753565e20d75 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Tue, 9 Apr 2024 01:39:26 +1000 Subject: [PATCH] feat: copy directly to clipboard, add copy content option Moves the options in the "Chat 2" submenu when right clicking a message to the parent menu if there are no specific context menu items for the right clicked payload. This moves the "Copy" button to the main context menu in the majority of cases and reduces the amount of clicks required to copy. Changes the "Copy" button to copy directly to the system clipboard and adds a notification. Adds a "Copy content" button beneath the "Copy" button which only copies the message content (not the sender). If the message doesn't have a sender, this option does not appear as they function identically in such cases. --- ChatTwo/PayloadHandler.cs | 56 ++++++++++++++++---------- ChatTwo/Resources/Language.Designer.cs | 27 +++++++++++++ ChatTwo/Resources/Language.resx | 17 ++++++-- 3 files changed, 75 insertions(+), 25 deletions(-) diff --git a/ChatTwo/PayloadHandler.cs b/ChatTwo/PayloadHandler.cs index a971615..f1ca361 100755 --- a/ChatTwo/PayloadHandler.cs +++ b/ChatTwo/PayloadHandler.cs @@ -100,6 +100,7 @@ public sealed class PayloadHandler { if (registered.Count == 0) { return; } + ImGui.Separator(); var contentId = chunk.Message?.ContentId ?? 0; var sender = chunk.Message?.Sender @@ -127,13 +128,18 @@ public sealed class PayloadHandler { } } - private void ContextFooter(bool separator, Chunk chunk) { - if (separator) { + private void ContextFooter(bool didCustomContext, Chunk chunk) { + if (didCustomContext) { ImGui.Separator(); - } - if (!ImGui.BeginMenu(Plugin.PluginName)) { - return; + // Only place these menu items in a submenu if we've already drawn + // custom context menu items based on the payload. + // + // It makes it much more convenient in the majority of cases to + // copy the message content without having to open a submenu. + if (!ImGui.BeginMenu(Plugin.PluginName)) { + return; + } } ImGui.Checkbox(Language.Context_ScreenshotMode, ref LogWindow.ScreenshotMode); @@ -143,21 +149,16 @@ public sealed class PayloadHandler { } if (chunk.Message is { } message) { - if (ImGui.BeginMenu(Language.Context_Copy)) { - var text = message.Sender - .Concat(message.Content) - .Where(chunk => chunk is TextChunk) - .Cast() - .Select(text => text.Content) - .Aggregate(string.Concat); - ImGui.InputTextMultiline( - "##chat2-copy", - ref text, - (uint) text.Length, - new Vector2(350, 100) * ImGuiHelpers.GlobalScale, - ImGuiInputTextFlags.ReadOnly - ); - ImGui.EndMenu(); + if (ImGui.Selectable(Language.Context_Copy)) { + ImGui.SetClipboardText(StringifyMessage(message, true)); + WrapperUtil.AddNotification(Language.Context_CopySuccess, NotificationType.Info); + } + + // Only show a separate "Copy content" option if the message has + // Sender chunks so it doesn't show for system messages. + if (message.Sender.Count > 0 && ImGui.Selectable(Language.Context_CopyContent)) { + ImGui.SetClipboardText(StringifyMessage(message, false)); + WrapperUtil.AddNotification(Language.Context_CopyContentSuccess, NotificationType.Info); } var col = ImGui.GetStyle().Colors[(int) ImGuiCol.TextDisabled]; @@ -172,7 +173,20 @@ public sealed class PayloadHandler { } } - ImGui.EndMenu(); + if (didCustomContext) ImGui.EndMenu(); + } + + internal static string StringifyMessage(Message message, bool withSender = false) + { + if (message == null) + return string.Empty; + + var chunks = withSender ? message.Sender.Concat(message.Content) : message.Content; + return chunks + .Where(chunk => chunk is TextChunk) + .Cast() + .Select(text => text.Content) + .Aggregate(string.Concat); } internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button) { diff --git a/ChatTwo/Resources/Language.Designer.cs b/ChatTwo/Resources/Language.Designer.cs index 2412b26..98170f2 100755 --- a/ChatTwo/Resources/Language.Designer.cs +++ b/ChatTwo/Resources/Language.Designer.cs @@ -1031,6 +1031,24 @@ namespace ChatTwo.Resources { } } + /// + /// Looks up a localized string similar to Copy content. + /// + internal static string Context_CopyContent { + get { + return ResourceManager.GetString("Context_CopyContent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copied message content to clipboard. + /// + internal static string Context_CopyContentSuccess { + get { + return ResourceManager.GetString("Context_CopyContentSuccess", resourceCulture); + } + } + /// /// Looks up a localized string similar to Copy Item Name. /// @@ -1040,6 +1058,15 @@ namespace ChatTwo.Resources { } } + /// + /// Looks up a localized string similar to Copied message to clipboard. + /// + internal static string Context_CopySuccess { + get { + return ResourceManager.GetString("Context_CopySuccess", resourceCulture); + } + } + /// /// Looks up a localized string similar to Hide chat. /// diff --git a/ChatTwo/Resources/Language.resx b/ChatTwo/Resources/Language.resx index 4af8f8a..d0dce97 100644 --- a/ChatTwo/Resources/Language.resx +++ b/ChatTwo/Resources/Language.resx @@ -859,16 +859,25 @@ Do not close FFXIV, unload Dalamud, or turn off your computer during this time. - + View Adventurer Plate - + Unable to open adventurer plate at this moment - + Tooltip offset - + Use this option if you experience cut-off tooltips. + + Copy content + + + Copied message content to clipboard + + + Copied message to clipboard +