Navigate the ⌘T and ⌘P task lists with arrow keys and Enter

This commit is contained in:
Ian Gulliver
2026-10-22 20:36:28 -07:00
parent 1c0effc244
commit 2e2b898486
4 changed files with 113 additions and 20 deletions
+23 -4
View File
@@ -56,7 +56,8 @@ final class Overlays {
var leftTab = LeftTab.lead
var leadFocus = 0
var tabFocus = 0
var projectFocus = false
var listKeys = false
var listCursor: String?
var projectTab = ProjectTab.tasks
var taskList = false
@ObservationIgnored var pickerFrame: CGRect = .zero
@@ -70,6 +71,7 @@ final class Overlays {
@ObservationIgnored private var holders = 0
@ObservationIgnored private var ctrl: @MainActor (String) -> Bool = { _ in false }
@ObservationIgnored private var escape: @MainActor () -> Bool = { false }
@ObservationIgnored private var list: @MainActor (UInt16) -> Bool = { _ in false }
#endif
var isOpen: Bool {
@@ -138,6 +140,14 @@ final class Overlays {
switcher = SwitcherModel(store: store, overlays: self, anchor: pickerFrame)
}
func takeListKeys(_ cursor: String?) {
listKeys = true
listCursor = cursor
#if os(macOS)
window?.makeFirstResponder(nil)
#endif
}
func closeTop() {
if !alerts.isEmpty {
alerts.removeLast()
@@ -151,10 +161,11 @@ final class Overlays {
}
#if os(macOS)
func install(_ ctrl: @escaping @MainActor (String) -> Bool, escape: @escaping @MainActor () -> Bool) {
func install(_ ctrl: @escaping @MainActor (String) -> Bool, escape: @escaping @MainActor () -> Bool, list: @escaping @MainActor (UInt16) -> Bool) {
holders += 1
self.ctrl = ctrl
self.escape = escape
self.list = list
if monitor != nil {
return
}
@@ -174,7 +185,11 @@ final class Overlays {
mouseMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDown, .rightMouseDown, .otherMouseDown]) { [weak self] event in
let win = event.window.map(ObjectIdentifier.init)
MainActor.assumeIsolated {
if let self, let window = self.window, win == ObjectIdentifier(window), self.menu != nil, !self.menuHover {
guard let self, let window = self.window, win == ObjectIdentifier(window) else {
return
}
self.listKeys = false
if self.menu != nil, !self.menuHover {
self.menu = nil
}
}
@@ -198,10 +213,13 @@ final class Overlays {
_ = escape()
return true
}
let enter = code == 36 || code == 76
if !isOpen {
if listKeys && (enter || code == 125 || code == 126) && flags.isDisjoint(with: [.command, .control, .option, .shift]) {
return list(code)
}
return false
}
let enter = code == 36 || code == 76
if !alerts.isEmpty {
if enter {
alerts.removeLast()
@@ -248,6 +266,7 @@ final class Overlays {
}
ctrl = { _ in false }
escape = { false }
list = { _ in false }
if let monitor {
NSEvent.removeMonitor(monitor)
}