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.
This commit is contained in:
Dean Sheather
2024-04-09 01:39:26 +10:00
parent fed420901c
commit ae6c966e27
3 changed files with 75 additions and 25 deletions
+35 -21
View File
@@ -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<TextChunk>()
.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<TextChunk>()
.Select(text => text.Content)
.Aggregate(string.Concat);
}
internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button) {
+27
View File
@@ -1031,6 +1031,24 @@ namespace ChatTwo.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Copy content.
/// </summary>
internal static string Context_CopyContent {
get {
return ResourceManager.GetString("Context_CopyContent", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copied message content to clipboard.
/// </summary>
internal static string Context_CopyContentSuccess {
get {
return ResourceManager.GetString("Context_CopyContentSuccess", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Copy Item Name.
/// </summary>
@@ -1040,6 +1058,15 @@ namespace ChatTwo.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Copied message to clipboard.
/// </summary>
internal static string Context_CopySuccess {
get {
return ResourceManager.GetString("Context_CopySuccess", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Hide chat.
/// </summary>
+13 -4
View File
@@ -859,16 +859,25 @@
<data name="Migration_Line4">
<value>Do not close FFXIV, unload Dalamud, or turn off your computer during this time.</value>
</data>
<data name="Context_AdventurerPlate" xml:space="preserve">
<data name="Context_AdventurerPlate">
<value>View Adventurer Plate</value>
</data>
<data name="Context_AdventurerPlateError" xml:space="preserve">
<data name="Context_AdventurerPlateError">
<value>Unable to open adventurer plate at this moment</value>
</data>
<data name="Options_TooltipOffset_Name" xml:space="preserve">
<data name="Options_TooltipOffset_Name">
<value>Tooltip offset </value>
</data>
<data name="Options_TooltipOffset_Desc" xml:space="preserve">
<data name="Options_TooltipOffset_Desc">
<value>Use this option if you experience cut-off tooltips.</value>
</data>
<data name="Context_CopyContent">
<value>Copy content</value>
</data>
<data name="Context_CopyContentSuccess">
<value>Copied message content to clipboard</value>
</data>
<data name="Context_CopySuccess">
<value>Copied message to clipboard</value>
</data>
</root>