Navigate the ⌘T and ⌘P task lists with arrow keys and Enter
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user