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..4b7b819 100644 --- a/Sources/Pesty/UI/ClipCardView.swift +++ b/Sources/Pesty/UI/ClipCardView.swift @@ -270,6 +270,9 @@ struct ClipCardView: View { } } Divider() + Button { AppController.shared.shareItem(item) } label: { + Label("Share", systemImage: "square.and.arrow.up") + } Button("Delete", role: .destructive) { store.delete(item) } } }