WIP: show filtered result in clipboard
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user