From 407b66c48a970585e4f6f6a26bcb58187c3de49c Mon Sep 17 00:00:00 2001 From: Akshay Kolli Date: Tue, 30 Jun 2026 01:13:36 -0700 Subject: [PATCH] WIP --- .../services/PasteActionService.swift | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/sources/clipbored/services/PasteActionService.swift b/sources/clipbored/services/PasteActionService.swift index 4347ca8..633e9e0 100644 --- a/sources/clipbored/services/PasteActionService.swift +++ b/sources/clipbored/services/PasteActionService.swift @@ -72,6 +72,63 @@ final class PasteActionService { writeToPasteboard(item) ? .copied : .failed("Could not write item to clipboard.") } + func pasteboardWriters(for item: ClipboardItem) -> [NSPasteboardWriting] { + switch item.kind { + case .image: + guard let imagePath = item.imagePath, let image = cacheService.image(for: imagePath) else { return [] } + return [image] + + case .pdf: + guard let data = cacheService.data(for: item.payload) else { return [] } + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setData(data, forType: .pdf) + pasteboardItem.setString(dragLabel(for: item), forType: .string) + return [pasteboardItem] + + case .audio: + guard let data = cacheService.data(for: item.payload) else { return [] } + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setData(data, forType: .sound) + pasteboardItem.setString(dragLabel(for: item), forType: .string) + return [pasteboardItem] + + case .richText: + if let data = cacheService.data(for: item.payload) { + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setData(data, forType: .rtf) + let text = richTextPlainString(from: data) ?? item.displayText.clipboardTrimmed + if !text.isEmpty { + pasteboardItem.setString(text, forType: .string) + } + return [pasteboardItem] + } + + let fallbackText = richTextFallbackPlainString(for: item) + return fallbackText.isEmpty ? [] : [stringPasteboardItem(fallbackText)] + + case .file: + let urls = FilePayload.urls(from: item.payload) + guard !urls.isEmpty, urls.allSatisfy({ FileManager.default.fileExists(atPath: $0.path) }) else { + return [] + } + return urls.map { $0.standardizedFileURL as NSURL } + + case .url: + guard !item.payload.isEmpty else { return [] } + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setString(item.payload, forType: .string) + pasteboardItem.setString(item.payload, forType: .URL) + if let title = urlTitleForPasteboard(item.displayText, payload: item.payload) { + pasteboardItem.setString(title, forType: NSPasteboard.PasteboardType(rawValue: "public.url-name")) + } + return [pasteboardItem] + + case .text, .unknown: + guard !item.payload.isEmpty else { return [] } + return [stringPasteboardItem(item.payload)] + } + } + @discardableResult func writeToPasteboard(_ item: ClipboardItem) -> Bool { let board = NSPasteboard.general @@ -128,6 +185,20 @@ final class PasteActionService { return didWrite } + private func stringPasteboardItem(_ value: String) -> NSPasteboardItem { + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setString(value, forType: .string) + return pasteboardItem + } + + private func dragLabel(for item: ClipboardItem) -> String { + let display = item.displayText.clipboardTrimmed + if !display.isEmpty { + return display + } + return item.kind.displayName.capitalized + } + private func writeURL(_ payload: String, title: String?, to board: NSPasteboard) -> Bool { guard !payload.isEmpty else { return false } let wroteString = board.setString(payload, forType: .string)