WIP: show filtered result in clipboard

This commit is contained in:
Akshay Kolli
2026-06-30 03:28:50 -07:00
parent 582d317d28
commit a2404ad4f9
8 changed files with 159 additions and 14 deletions

View File

@@ -21,6 +21,7 @@ enum ClipboardPanelShortcutAction: Equatable {
case pasteStackNext
case preview
case reveal
case showInClipboard
case toggleStack
}
@@ -407,6 +408,8 @@ final class ClipboardPanelController: NSObject, NSWindowDelegate, QLPreviewPanel
previewSelected()
case .reveal:
viewModel.revealSelected()
case .showInClipboard:
panelView.showSelectedInClipboard()
case .toggleStack:
viewModel.toggleSelectedStackMembership()
}
@@ -471,6 +474,8 @@ final class ClipboardPanelController: NSObject, NSWindowDelegate, QLPreviewPanel
return .copy
case 31:
return .open
case 5:
return .showInClipboard
case 16:
return .preview
case 15:

View File

@@ -638,7 +638,8 @@ final class ClipboardPanelView: NSVisualEffectView, NSSearchFieldDelegate {
layout: layout,
collectionNames: collectionNames,
isStacked: viewModel.isItemStacked(at: index),
stackCount: viewModel.stackCount
stackCount: viewModel.stackCount,
canShowInClipboard: viewModel.canShowVisibleItemsInClipboard
)
card.onSelect = { [weak self] selected in
self?.viewModel.selectItem(at: selected)
@@ -672,6 +673,9 @@ final class ClipboardPanelView: NSVisualEffectView, NSSearchFieldDelegate {
card.onClearStack = { [weak self] in
self?.viewModel.clearStack()
}
card.onShowInClipboard = { [weak self] selected in
self?.showSelectedInClipboard(at: selected)
}
card.onEditText = { [weak self] selected in
self?.editText(at: selected)
}
@@ -821,7 +825,7 @@ final class ClipboardPanelView: NSVisualEffectView, NSSearchFieldDelegate {
if lower.hasPrefix("captured") || lower.contains("capture running") || lower.contains("capture is running") || lower.contains("capture resumed") {
return .ready
}
if lower.hasPrefix("copied") || lower.hasPrefix("pasted") || lower.hasPrefix("updated") || lower.hasPrefix("added") || lower.hasPrefix("removed") || lower.hasPrefix("cleared") || lower.hasPrefix("ignored") {
if lower.hasPrefix("copied") || lower.hasPrefix("pasted") || lower.hasPrefix("updated") || lower.hasPrefix("added") || lower.hasPrefix("removed") || lower.hasPrefix("cleared") || lower.hasPrefix("ignored") || lower.hasPrefix("showing") {
return .action
}
if lower.hasPrefix("error") || lower.contains("failed") {
@@ -1240,6 +1244,14 @@ final class ClipboardPanelView: NSVisualEffectView, NSSearchFieldDelegate {
addSelectedClipToCollection()
}
func debugShowFirstCardInClipboard() {
showSelectedInClipboard(at: 0)
}
var debugSearchFieldText: String {
searchField.stringValue
}
func debugDropFirstCard(onCollectionNamed collectionName: String) {
guard let itemID = cardViews.first?.debugItemID else { return }
customCollectionButtons[collectionName]?.debugDropItem(itemID)
@@ -1298,6 +1310,16 @@ final class ClipboardPanelView: NSVisualEffectView, NSSearchFieldDelegate {
onSettings()
}
func showSelectedInClipboard() {
showSelectedInClipboard(at: viewModel.selectedIndex)
}
private func showSelectedInClipboard(at index: Int) {
viewModel.selectItem(at: index)
viewModel.showSelectedInClipboard()
searchField.stringValue = viewModel.searchText
}
@objc private func addSelectedClipToCollection() {
guard viewModel.selectedItem != nil,
let name = requestCollectionName() else {
@@ -1598,6 +1620,7 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
var onPasteStackNext: () -> Void = {}
var onCopyStackNext: () -> Void = {}
var onClearStack: () -> Void = {}
var onShowInClipboard: (Int) -> Void = { _ in }
var onEditText: (Int) -> Void = { _ in }
var onPreview: (Int) -> Void = { _ in }
var onPasteboardWriters: (Int) -> [NSPasteboardWriting] = { _ in [] }
@@ -1616,6 +1639,7 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
private let itemIsPinned: Bool
private let itemIsStacked: Bool
private let stackCount: Int
private let canShowInClipboard: Bool
private let itemSourceAppName: String?
private let itemSourceAppBundleID: String?
private let itemCollectionName: String?
@@ -1639,7 +1663,8 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
layout: ClipboardItemCardLayout = .regular,
collectionNames: [String] = [],
isStacked: Bool = false,
stackCount: Int = 0
stackCount: Int = 0,
canShowInClipboard: Bool = false
) {
self.index = index
self.itemID = item.id
@@ -1648,6 +1673,7 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
self.itemIsPinned = item.isPinned
self.itemIsStacked = isStacked
self.stackCount = stackCount
self.canShowInClipboard = canShowInClipboard
self.itemSourceAppName = Self.presentSourceText(item.sourceApp)
self.itemSourceAppBundleID = Self.presentSourceText(item.sourceAppBundleId)
self.itemCollectionName = ClipboardCollectionDefaults.normalizedName(item.collectionName)
@@ -1840,6 +1866,9 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
addMenuItem("Paste Plain Text", action: #selector(pastePlainTextFromMenu), to: menu)
addMenuItem("Copy Plain Text", action: #selector(copyPlainTextFromMenu), to: menu)
}
if canShowInClipboard {
addMenuItem("Show in Clipboard", action: #selector(showInClipboardFromMenu), to: menu)
}
addMenuItem(itemIsStacked ? "Remove from Stack" : "Add to Stack", action: #selector(toggleStackFromMenu), to: menu)
if stackCount > 0 {
addMenuItem("Paste Stack Next", action: #selector(pasteStackNextFromMenu), to: menu)
@@ -2138,6 +2167,10 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource {
onClearStack()
}
@objc private func showInClipboardFromMenu() {
onShowInClipboard(index)
}
@objc private func editTextFromMenu() {
onEditText(index)
}

View File

@@ -125,6 +125,18 @@ final class ClipboardPanelViewModel {
return visibleItems[selectedIndex]
}
var canShowSelectedInClipboard: Bool {
selectedItem != nil && canShowVisibleItemsInClipboard
}
var canShowVisibleItemsInClipboard: Bool {
!visibleItems.isEmpty
&& (!searchText.clipboardTrimmed.isEmpty
|| sortMode != .mostRecent
|| selectedCollectionName != nil
|| isStackFilterSelected)
}
var totalItemCount: Int {
items.count
}
@@ -464,6 +476,30 @@ final class ClipboardPanelViewModel {
searchText = ""
}
func showSelectedInClipboard() {
guard canShowSelectedInClipboard, let item = selectedItem else { return }
selectedItemID = item.id
if !searchText.isEmpty {
searchText = ""
}
if isStackFilterSelected {
isStackFilterSelected = false
}
if selectedCollectionName != nil {
selectedCollectionName = nil
}
if sortMode != .mostRecent {
sortMode = .mostRecent
}
if let index = visibleItems.firstIndex(where: { $0.id == item.id }) {
selectedIndex = index
selectedItemID = item.id
}
statusMessage = "Showing in Clipboard"
}
func recomputeVisibleItems() {
pruneStackItems()
let previousSelection = selectedItemID