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
@@ -66,6 +66,7 @@ final class LauncherWindowController: NSWindowController, NSWindowDelegate, NSSe
else if let picker = self.emojiPicker { picker.moveSelection(by: offset) }
else { self.moveSelection(by: offset) }
}
window.commandNavigation = { [weak self] key in self?.emojiPicker?.handleControlKey(key) ?? false }
window.dismiss = { [weak self] in self?.dismiss() }
window.canUseNumberShortcuts = { [weak self] in
guard let self else { return false }
@@ -806,6 +807,7 @@ final class LauncherWindowController: NSWindowController, NSWindowDelegate, NSSe
let tool = EmojiPickerController()
emojiPicker = tool
tool.input = { [weak self] in self?.searchField.stringValue ?? "" }
tool.focusSearch = { [weak self] in self?.window?.makeFirstResponder(self?.searchField) }
tool.copied = { [weak self] in self?.dismiss() }
controller = tool
placeholder = "Search emoji by name or :shortcode:…"
@@ -1101,6 +1103,7 @@ final class LauncherPanel: NSPanel {
var canUseNumberShortcuts: (() -> Bool)?
var numberHintsChanged: (() -> Void)?
var launchNumber: ((Int) -> Void)?
var commandNavigation: ((String) -> Bool)?
private var numberShortcuts = CommandNumberShortcuts()
private var commandHoldTask: Task<Void, Never>?
var numberHintsVisible: Bool { numberShortcuts.isVisible }
@@ -1201,6 +1204,7 @@ final class LauncherPanel: NSPanel {
}
if event.type == .keyDown, attachedSheet == nil,
event.modifierFlags.intersection([.control, .command, .option, .shift]) == .control {
if commandNavigation?(event.charactersIgnoringModifiers?.lowercased() ?? "") == true { return }
switch event.charactersIgnoringModifiers?.lowercased() {
case "j":
navigateSelection?(1)