From ca2832c5f8de0330b83f02fe39a00899775159c6 Mon Sep 17 00:00:00 2001 From: Alvie Stoddard Date: Fri, 24 Jul 2026 12:23:32 -0700 Subject: [PATCH 1/2] Add sharing for clipboard clips --- Sources/Pesty/AppController.swift | 20 ++++++++++++++++++++ Sources/Pesty/UI/ClipCardView.swift | 1 + 2 files changed, 21 insertions(+) diff --git a/Sources/Pesty/AppController.swift b/Sources/Pesty/AppController.swift index 168016f..7d8dcc3 100644 --- a/Sources/Pesty/AppController.swift +++ b/Sources/Pesty/AppController.swift @@ -16,6 +16,7 @@ final class AppController: NSObject, NSApplicationDelegate { private var settingsWindow: NSWindow? private var pasteStackController: PasteStackWindowController? private var keyMonitor: Any? + private var sharingPicker: NSSharingServicePicker? private let copyToast = CopyToastController() private(set) var previousApp: NSRunningApplication? @@ -250,6 +251,25 @@ final class AppController: NSObject, NSApplicationDelegate { copyToast.show() } + func shareItem(_ item: ClipItem) { + let picker = NSSharingServicePicker(items: sharingItems(for: item)) + sharingPicker = picker + guard let view = barController?.window?.contentView ?? NSApp.keyWindow?.contentView else { return } + let anchor = NSRect(x: view.bounds.midX, y: view.bounds.midY, width: 1, height: 1) + picker.show(relativeTo: anchor, of: view, preferredEdge: .maxY) + } + + private func sharingItems(for item: ClipItem) -> [Any] { + if item.type == .image, let image = store.loadImage(for: item) { + return [image] + } + if item.type == .file { + let urls = item.fileURLs.compactMap(URL.init(string:)).filter(\.isFileURL) + if !urls.isEmpty { return urls } + } + return [item.text ?? item.colorHex ?? item.displayTitle] + } + func commandCopy() { if store.source == .pasteStack, let entry = pasteSequence.selectedEntry { copyItem(entry.item) diff --git a/Sources/Pesty/UI/ClipCardView.swift b/Sources/Pesty/UI/ClipCardView.swift index 32ba404..71ffc86 100644 --- a/Sources/Pesty/UI/ClipCardView.swift +++ b/Sources/Pesty/UI/ClipCardView.swift @@ -270,6 +270,7 @@ struct ClipCardView: View { } } Divider() + Button("Share") { AppController.shared.shareItem(item) } Button("Delete", role: .destructive) { store.delete(item) } } } From 2266860d6190d7d5b3571259b5f8c102007fc2b5 Mon Sep 17 00:00:00 2001 From: Alvie Stoddard Date: Fri, 24 Jul 2026 12:48:48 -0700 Subject: [PATCH 2/2] Add icon to Share menu action --- Sources/Pesty/UI/ClipCardView.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/Pesty/UI/ClipCardView.swift b/Sources/Pesty/UI/ClipCardView.swift index 71ffc86..4b7b819 100644 --- a/Sources/Pesty/UI/ClipCardView.swift +++ b/Sources/Pesty/UI/ClipCardView.swift @@ -270,7 +270,9 @@ struct ClipCardView: View { } } Divider() - Button("Share") { AppController.shared.shareItem(item) } + Button { AppController.shared.shareItem(item) } label: { + Label("Share", systemImage: "square.and.arrow.up") + } Button("Delete", role: .destructive) { store.delete(item) } } }