diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.dark.svg
new file mode 100644
index 0000000000..8865472f05
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.light.svg
new file mode 100644
index 0000000000..f39c0b594d
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.dark.svg
new file mode 100644
index 0000000000..d2658c1fde
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.light.svg
new file mode 100644
index 0000000000..4485e39cfa
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_image_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.dark.svg
new file mode 100644
index 0000000000..3e5845fac9
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.light.svg
new file mode 100644
index 0000000000..476f97953c
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_clipboard_letter_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.dark.svg
new file mode 100644
index 0000000000..f79782da20
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.light.svg
new file mode 100644
index 0000000000..75bba0c080
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_copy_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.dark.svg
new file mode 100644
index 0000000000..6f34f9daa7
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.light.svg
new file mode 100644
index 0000000000..fb380fe84f
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_document_copy_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.dark.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.dark.svg
new file mode 100644
index 0000000000..162dedad90
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.dark.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.light.svg b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.light.svg
new file mode 100644
index 0000000000..7aff1a515e
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Assets/Icons/ic_fluent_image_copy_20_regular.light.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/PrimaryAction.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/PrimaryAction.cs
new file mode 100644
index 0000000000..11d7bd0d5d
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/PrimaryAction.cs
@@ -0,0 +1,12 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CmdPal.Ext.ClipboardHistory.Helpers;
+
+internal enum PrimaryAction
+{
+ Default,
+ Paste,
+ Copy,
+}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/SettingsManager.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/SettingsManager.cs
index 6ccc987d52..40fda696a2 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/SettingsManager.cs
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Helpers/SettingsManager.cs
@@ -2,6 +2,7 @@
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System;
using System.IO;
using Microsoft.CmdPal.Ext.ClipboardHistory.Properties;
using Microsoft.CommandPalette.Extensions.Toolkit;
@@ -26,10 +27,22 @@ internal sealed class SettingsManager : JsonSettingsManager, ISettingOptions
Resources.settings_confirm_delete_description!,
true);
+ private readonly ChoiceSetSetting _primaryAction = new(
+ Namespaced(nameof(PrimaryAction)),
+ Resources.settings_primary_action_title!,
+ Resources.settings_primary_action_description!,
+ [
+ new ChoiceSetSetting.Choice(Resources.settings_primary_action_default!, PrimaryAction.Default.ToString("G")),
+ new ChoiceSetSetting.Choice(Resources.settings_primary_action_paste!, PrimaryAction.Paste.ToString("G")),
+ new ChoiceSetSetting.Choice(Resources.settings_primary_action_copy!, PrimaryAction.Copy.ToString("G"))
+ ]);
+
public bool KeepAfterPaste => _keepAfterPaste.Value;
public bool DeleteFromHistoryRequiresConfirmation => _confirmDelete.Value;
+ public PrimaryAction PrimaryAction => Enum.TryParse(_primaryAction.Value, out var action) ? action : PrimaryAction.Default;
+
private static string SettingsJsonPath()
{
var directory = Utilities.BaseSettingsPath("Microsoft.CmdPal");
@@ -45,6 +58,7 @@ internal sealed class SettingsManager : JsonSettingsManager, ISettingOptions
Settings.Add(_keepAfterPaste);
Settings.Add(_confirmDelete);
+ Settings.Add(_primaryAction);
// Load settings from file upon initialization
LoadSettings();
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Icons.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Icons.cs
index 824a6a2233..4bb4c30586 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Icons.cs
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Icons.cs
@@ -6,7 +6,7 @@ using Microsoft.CommandPalette.Extensions.Toolkit;
namespace Microsoft.CmdPal.Ext.ClipboardHistory;
-internal sealed class Icons
+internal static class Icons
{
internal static IconInfo CopyIcon { get; } = new("\xE8C8");
@@ -17,4 +17,21 @@ internal sealed class Icons
internal static IconInfo DeleteIcon { get; } = new("\uE74D");
internal static IconInfo ClipboardListIcon { get; } = IconHelpers.FromRelativePath("Assets\\ClipboardHistory.svg");
+
+ internal static IconInfo Clipboard { get; } = Create("ic_fluent_clipboard_20_regular");
+
+ internal static IconInfo ClipboardImage { get; } = Create("ic_fluent_clipboard_image_20_regular");
+
+ internal static IconInfo ClipboardLetter { get; } = Create("ic_fluent_clipboard_letter_20_regular");
+
+ internal static IconInfo Copy { get; } = Create(" ic_fluent_copy_20_regular");
+
+ internal static IconInfo DocumentCopy { get; } = Create("ic_fluent_document_copy_20_regular");
+
+ internal static IconInfo ImageCopy { get; } = Create("ic_fluent_image_copy_20_regular");
+
+ private static IconInfo Create(string name)
+ {
+ return IconHelpers.FromRelativePaths($"Assets\\Icons\\{name}.light.svg", $"Assets\\Icons\\{name}.dark.svg");
+ }
}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj
index 9b5057ecae..bc55f536e0 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Microsoft.CmdPal.Ext.ClipboardHistory.csproj
@@ -39,5 +39,41 @@
PreserveNewest
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Models/ClipboardItem.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Models/ClipboardItem.cs
index dd66410e6d..f6c89f53e6 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Models/ClipboardItem.cs
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Models/ClipboardItem.cs
@@ -3,14 +3,8 @@
// See the LICENSE file in the project root for more information.
using System;
-using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
-using System.Globalization;
-using System.Linq;
-using Microsoft.CmdPal.Common.Commands;
-using Microsoft.CmdPal.Ext.ClipboardHistory.Commands;
using Microsoft.CmdPal.Ext.ClipboardHistory.Helpers;
-using Microsoft.CommandPalette.Extensions.Toolkit;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage.Streams;
@@ -41,126 +35,8 @@ public class ClipboardItem
}
[MemberNotNullWhen(true, nameof(ImageData))]
- private bool IsImage => ImageData is not null;
+ internal bool IsImage => ImageData is not null;
[MemberNotNullWhen(true, nameof(Content))]
- private bool IsText => !string.IsNullOrEmpty(Content);
-
- public static List ShiftLinesLeft(List lines)
- {
- // Determine the minimum leading whitespace
- var minLeadingWhitespace = lines
- .Where(line => !string.IsNullOrWhiteSpace(line))
- .Min(line => line.TakeWhile(char.IsWhiteSpace).Count());
-
- // Check if all lines have at least that much leading whitespace
- if (lines.Any(line => line.TakeWhile(char.IsWhiteSpace).Count() < minLeadingWhitespace))
- {
- return lines; // Return the original lines if any line doesn't have enough leading whitespace
- }
-
- // Remove the minimum leading whitespace from each line
- var shiftedLines = lines.Select(line => line.Substring(minLeadingWhitespace)).ToList();
-
- return shiftedLines;
- }
-
- public static List StripLeadingWhitespace(List lines)
- {
- // Determine the minimum leading whitespace
- var minLeadingWhitespace = lines
- .Min(line => line.TakeWhile(char.IsWhiteSpace).Count());
-
- // Remove the minimum leading whitespace from each line
- var shiftedLines = lines.Select(line =>
- line.Length >= minLeadingWhitespace
- ? line.Substring(minLeadingWhitespace)
- : line).ToList();
-
- return shiftedLines;
- }
-
- public ListItem ToListItem()
- {
- ListItem listItem;
-
- List metadata = [];
- metadata.Add(new DetailsElement()
- {
- Key = "Copied on",
- Data = new DetailsLink(Item.Timestamp.DateTime.ToString(DateTimeFormatInfo.CurrentInfo)),
- });
-
- var deleteConfirmationCommand = new ConfirmableCommand()
- {
- Command = new DeleteItemCommand(this),
- ConfirmationTitle = Properties.Resources.delete_confirmation_title!,
- ConfirmationMessage = Properties.Resources.delete_confirmation_message!,
- IsConfirmationRequired = () => Settings.DeleteFromHistoryRequiresConfirmation,
- };
- var deleteContextMenuItem = new CommandContextItem(deleteConfirmationCommand)
- {
- IsCritical = true,
- RequestedShortcut = KeyChords.DeleteEntry,
- };
-
- if (IsImage)
- {
- var iconData = new IconData(ImageData);
- var heroImage = new IconInfo(iconData, iconData);
- listItem = new(new CopyCommand(this, ClipboardFormat.Image))
- {
- // Placeholder subtitle as there’s no BitmapImage dimensions to retrieve
- Title = "Image Data",
- Details = new Details()
- {
- HeroImage = heroImage,
- Title = GetDataType(),
- Body = Timestamp.ToString(CultureInfo.InvariantCulture),
- Metadata = metadata.ToArray(),
- },
- MoreCommands = [
- new CommandContextItem(new PasteCommand(this, ClipboardFormat.Image, Settings)),
- new Separator(),
- deleteContextMenuItem,
- ],
- };
- }
- else if (IsText)
- {
- var splitContent = Content.Split("\n");
- var head = splitContent.AsSpan(0, Math.Min(3, splitContent.Length)).ToArray().ToList();
- var preview2 = string.Join(
- "\n",
- StripLeadingWhitespace(head));
-
- listItem = new(new CopyCommand(this, ClipboardFormat.Text))
- {
- Title = preview2,
-
- Details = new Details
- {
- Title = GetDataType(),
- Body = $"```text\n{Content}\n```",
- Metadata = metadata.ToArray(),
- },
- MoreCommands = [
- new CommandContextItem(new PasteCommand(this, ClipboardFormat.Text, Settings)),
- new Separator(),
- deleteContextMenuItem,
- ],
- };
- }
- else
- {
- listItem = new(new NoOpCommand())
- {
- Title = "Unknown",
- Subtitle = GetDataType(),
- Details = new Details { Title = GetDataType() },
- };
- }
-
- return listItem;
- }
+ internal bool IsText => !string.IsNullOrEmpty(Content);
}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardHistoryListPage.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardHistoryListPage.cs
index c0d564eb5e..d17f6f5844 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardHistoryListPage.cs
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardHistoryListPage.cs
@@ -148,7 +148,7 @@ internal sealed partial class ClipboardHistoryListPage : ListPage
var item = clipboardHistory[i];
if (item is not null)
{
- listItems.Add(item.ToListItem());
+ listItems.Add(new ClipboardListItem(item, _settingsManager));
}
}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardListItem.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardListItem.cs
new file mode 100644
index 0000000000..ac19335bfa
--- /dev/null
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Pages/ClipboardListItem.cs
@@ -0,0 +1,201 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using Microsoft.CmdPal.Common.Commands;
+using Microsoft.CmdPal.Ext.ClipboardHistory.Commands;
+using Microsoft.CmdPal.Ext.ClipboardHistory.Helpers;
+using Microsoft.CommandPalette.Extensions;
+using Microsoft.CommandPalette.Extensions.Toolkit;
+
+namespace Microsoft.CmdPal.Ext.ClipboardHistory.Models;
+
+internal sealed partial class ClipboardListItem : ListItem
+{
+ private readonly SettingsManager _settingsManager;
+ private readonly ClipboardItem _item;
+
+ private readonly CommandContextItem _deleteContextMenuItem;
+ private readonly CommandContextItem? _pasteCommand;
+ private readonly CommandContextItem? _copyCommand;
+ private readonly Lazy _lazyDetails;
+
+ public override IDetails? Details
+ {
+ get => _lazyDetails.Value;
+ set
+ {
+ }
+ }
+
+ public ClipboardListItem(ClipboardItem item, SettingsManager settingsManager)
+ {
+ _item = item;
+ _settingsManager = settingsManager;
+ _settingsManager.Settings.SettingsChanged += SettingsOnSettingsChanged;
+
+ _lazyDetails = new(() => CreateDetails());
+
+ var deleteConfirmationCommand = new ConfirmableCommand
+ {
+ Command = new DeleteItemCommand(_item),
+ ConfirmationTitle = Properties.Resources.delete_confirmation_title!,
+ ConfirmationMessage = Properties.Resources.delete_confirmation_message!,
+ IsConfirmationRequired = () => _settingsManager.DeleteFromHistoryRequiresConfirmation,
+ };
+ _deleteContextMenuItem = new CommandContextItem(deleteConfirmationCommand)
+ {
+ IsCritical = true,
+ RequestedShortcut = KeyChords.DeleteEntry,
+ };
+
+ if (item.IsImage)
+ {
+ Title = "Image";
+
+ _pasteCommand = new CommandContextItem(new PasteCommand(_item, ClipboardFormat.Image, _settingsManager));
+ _copyCommand = new CommandContextItem(new CopyCommand(_item, ClipboardFormat.Image));
+ }
+ else if (item.IsText)
+ {
+ var splitContent = _item.Content?.Split("\n") ?? [];
+ var head = splitContent.Take(3);
+ var preview2 = string.Join(
+ "\n",
+ StripLeadingWhitespace(head));
+
+ Title = preview2;
+
+ _pasteCommand = new CommandContextItem(new PasteCommand(_item, ClipboardFormat.Text, _settingsManager));
+ _copyCommand = new CommandContextItem(new CopyCommand(_item, ClipboardFormat.Text));
+ }
+ else
+ {
+ _pasteCommand = null;
+ _copyCommand = null;
+ }
+
+ RefreshCommands();
+ }
+
+ private void SettingsOnSettingsChanged(object sender, Settings args)
+ {
+ RefreshCommands();
+ }
+
+ private void RefreshCommands()
+ {
+ if (_item is { IsText: false, IsImage: false })
+ {
+ MoreCommands = [_deleteContextMenuItem];
+ Icon = _settingsManager.PrimaryAction == PrimaryAction.Paste ? Icons.Clipboard : Icons.Copy;
+ }
+
+ switch (_settingsManager.PrimaryAction)
+ {
+ case PrimaryAction.Paste:
+ Command = _pasteCommand?.Command;
+ MoreCommands =
+ [
+ _copyCommand!,
+ new Separator(),
+ _deleteContextMenuItem,
+ ];
+
+ if (_item.IsText)
+ {
+ Icon = Icons.ClipboardLetter;
+ }
+ else if (_item.IsImage)
+ {
+ Icon = Icons.ClipboardImage;
+ }
+ else
+ {
+ Icon = Icons.ClipboardImage;
+ }
+
+ break;
+ case PrimaryAction.Default:
+ case PrimaryAction.Copy:
+ default:
+ Command = _copyCommand?.Command;
+ MoreCommands =
+ [
+ _pasteCommand!,
+ new Separator(),
+ _deleteContextMenuItem,
+ ];
+
+ if (_item.IsText)
+ {
+ Icon = Icons.DocumentCopy;
+ }
+ else if (_item.IsImage)
+ {
+ Icon = Icons.ImageCopy;
+ }
+ else
+ {
+ Icon = Icons.Copy;
+ }
+
+ break;
+ }
+ }
+
+ private Details CreateDetails()
+ {
+ IDetailsElement[] metadata =
+ [
+ new DetailsElement
+ {
+ Key = "Copied on",
+ Data = new DetailsLink(_item.Timestamp.DateTime.ToString(DateTimeFormatInfo.CurrentInfo)),
+ }
+ ];
+
+ if (_item.IsImage)
+ {
+ var iconData = new IconData(_item.ImageData);
+ var heroImage = new IconInfo(iconData);
+ return new Details
+ {
+ Title = _item.GetDataType(),
+ HeroImage = heroImage,
+ Metadata = metadata,
+ };
+ }
+
+ if (_item.IsText)
+ {
+ return new Details
+ {
+ Title = _item.GetDataType(),
+ Body = $"```text\n{_item.Content}\n```",
+ Metadata = metadata,
+ };
+ }
+
+ return new Details { Title = _item.GetDataType() };
+ }
+
+ private static List StripLeadingWhitespace(IEnumerable lines)
+ {
+ // Determine the minimum leading whitespace
+ var minLeadingWhitespace = lines
+ .Min(static line => line.TakeWhile(char.IsWhiteSpace).Count());
+
+ // Remove the minimum leading whitespace from each line
+ var shiftedLines = lines.Select(line =>
+ line.Length >= minLeadingWhitespace
+ ? line[minLeadingWhitespace..]
+ : line).ToList();
+
+ return shiftedLines;
+ }
+}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.Designer.cs b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.Designer.cs
index a0b1882d14..3fa9e8668e 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.Designer.cs
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.Designer.cs
@@ -212,5 +212,50 @@ namespace Microsoft.CmdPal.Ext.ClipboardHistory.Properties {
return ResourceManager.GetString("settings_keep_after_paste_title", resourceCulture);
}
}
+
+ ///
+ /// Looks up a localized string similar to Copy to Clipboard.
+ ///
+ public static string settings_primary_action_copy {
+ get {
+ return ResourceManager.GetString("settings_primary_action_copy", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Default (Copy to Clipboard).
+ ///
+ public static string settings_primary_action_default {
+ get {
+ return ResourceManager.GetString("settings_primary_action_default", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Primary action (Enter key).
+ ///
+ public static string settings_primary_action_description {
+ get {
+ return ResourceManager.GetString("settings_primary_action_description", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Paste.
+ ///
+ public static string settings_primary_action_paste {
+ get {
+ return ResourceManager.GetString("settings_primary_action_paste", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Primary action.
+ ///
+ public static string settings_primary_action_title {
+ get {
+ return ResourceManager.GetString("settings_primary_action_title", resourceCulture);
+ }
+ }
}
}
diff --git a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.resx b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.resx
index e67ba1747c..70226f7292 100644
--- a/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.resx
+++ b/src/modules/cmdpal/ext/Microsoft.CmdPal.Ext.ClipboardHistory/Properties/Resources.resx
@@ -168,4 +168,19 @@
Are you sure you want to delete this item from clipboard history? This action cannot be undone.
+
+ Primary action
+
+
+ Primary action (Enter key)
+
+
+ Default (Copy to Clipboard)
+
+
+ Paste
+
+
+ Copy to Clipboard
+
\ No newline at end of file