Merge pull request #3 from deansheather/dean/copy-to-clipboard

feat: copy directly to clipboard, add copy content option
This commit is contained in:
Infi
2024-04-09 16:10:06 +02:00
committed by GitHub
3 changed files with 75 additions and 25 deletions
+33 -19
View File
@@ -106,6 +106,7 @@ public sealed class PayloadHandler {
if (registered.Count == 0) {
return;
}
ImGui.Separator();
var contentId = chunk.Message?.ContentId ?? 0;
var sender = chunk.Message?.Sender.Select(c => c.Link).FirstOrDefault(p => p is PlayerPayload) as PlayerPayload;
@@ -131,14 +132,19 @@ public sealed class PayloadHandler {
}
}
private void ContextFooter(bool separator, Chunk chunk) {
if (separator) {
private void ContextFooter(bool didCustomContext, Chunk chunk) {
if (didCustomContext) {
ImGui.Separator();
}
// 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);
@@ -147,21 +153,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];
@@ -176,7 +177,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) {
+26
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>
@@ -1041,6 +1059,14 @@ 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);
}
}
/// Looks up a localized string similar to Copy link to clipboard.
/// </summary>
internal static string Context_CopyLink {
+14 -4
View File
@@ -859,18 +859,28 @@
<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>
<data name="Context_CopyLink" xml:space="preserve">
<value>Copy link to clipboard</value>
</data>