feat: add emoji favorites and directional shortcuts

This commit is contained in:
Valdemar Lorenzen
2026-10-15 14:30:50 +02:00
parent 1de7983345
commit 6cb7ad8479
5 changed files with 194 additions and 23 deletions
@@ -13,7 +13,7 @@ final class ApplicationActionsController: NSViewController, NSSearchFieldDelegat
ActionEntry(title: "Uninstall application", symbol: "trash", color: .systemRed)
]
private var visibleEntries: [Int] = []
private var isCommand = false
private var availableEntries = Array(0..<6)
private var selectedEntry: Int? = 0
private var rowTopConstraints: [NSLayoutConstraint] = []
private var heightConstraint: NSLayoutConstraint?
@@ -125,19 +125,31 @@ final class ApplicationActionsController: NSViewController, NSSearchFieldDelegat
}
func show(for application: Application, relativeTo anchor: NSView) {
show(title: application.name, relativeTo: anchor,
available: application.command == nil ? Array(entries.indices) : [0, 1, 3])
}
func showEmoji(named name: String, relativeTo anchor: NSView) {
show(title: name, relativeTo: anchor, available: [0, 1], emoji: true)
}
private func show(title: String, relativeTo anchor: NSView, available: [Int], emoji: Bool = false) {
if isShown { close(); return }
guard let window = anchor.window, let host = window.contentView else { return }
let pill = anchor.superview ?? anchor
_ = view
applicationLabel.stringValue = application.name
isCommand = application.command != nil
applicationLabel.stringValue = title
availableEntries = available
entries[0].button.title = emoji ? "Copy Emoji" : "Open"
entries[0].icon.image = NSImage(systemSymbolName: emoji ? "doc.on.doc" : "arrow.up.forward.app", accessibilityDescription: nil)
search.setAccessibilityLabel(emoji ? "Search emoji actions" : "Search application actions")
let favorite = entries[1]
let favoriteTitle = isFavorite ? "Remove Favorite" : "Favorite"
favorite.button.attributedTitle = NSAttributedString(string: favoriteTitle, attributes: [
.foregroundColor: SunsetPalette.text, .font: NSFont.systemFont(ofSize: LauncherRowView.textSize, weight: .medium)
])
favorite.button.setAccessibilityLabel(favoriteTitle)
favorite.icon.image = NSImage(systemSymbolName: isFavorite ? "star.fill" : "star", accessibilityDescription: nil)
favorite.icon.image = emoji ? nil : NSImage(systemSymbolName: isFavorite ? "star.fill" : "star", accessibilityDescription: nil)
search.stringValue = ""
controlTextDidChange(Notification(name: NSControl.textDidChangeNotification))
transitionGeneration += 1
@@ -204,7 +216,7 @@ final class ApplicationActionsController: NSViewController, NSSearchFieldDelegat
func controlTextDidChange(_ notification: Notification) {
let query = search.stringValue.trimmingCharacters(in: .whitespacesAndNewlines)
visibleEntries = entries.indices.filter {
(!isCommand || $0 == 0 || $0 == 1 || $0 == 3)
availableEntries.contains($0)
&& (query.isEmpty || entries[$0].button.title.range(of: query, options: [.caseInsensitive, .diacriticInsensitive]) != nil)
}
selectedEntry = visibleEntries.first
@@ -235,6 +247,10 @@ final class ApplicationActionsController: NSViewController, NSSearchFieldDelegat
}
func control(_ control: NSControl, textView: NSTextView, doCommandBy selector: Selector) -> Bool {
handle(selector)
}
func handle(_ selector: Selector) -> Bool {
switch selector {
case #selector(NSResponder.insertNewline(_:)):
if let selectedEntry { chooseAction(at: selectedEntry) }