Open task views in a sheet over the left pane

This commit is contained in:
Ian Gulliver
2026-10-21 17:00:07 -07:00
parent ccb08ab6ec
commit 193401021a
22 changed files with 698 additions and 546 deletions
+11 -34
View File
@@ -43,8 +43,6 @@ enum LeftTab {
@Observable
final class Overlays {
var alerts: [OverlayAlert] = []
var image: NSImage?
var diagram: BoxLayout?
var menu: OverlayMenu? {
didSet {
menuHover = false
@@ -64,9 +62,10 @@ final class Overlays {
@ObservationIgnored private weak var behindModal: NSResponder?
@ObservationIgnored private var holders = 0
@ObservationIgnored private var ctrl: @MainActor (String) -> Bool = { _ in false }
@ObservationIgnored private var escape: @MainActor () -> Bool = { false }
var isOpen: Bool {
!alerts.isEmpty || image != nil || diagram != nil || menu != nil || modal != nil || switcher != nil
!alerts.isEmpty || menu != nil || modal != nil || switcher != nil
}
var dialogOpen: Bool {
@@ -130,10 +129,6 @@ final class Overlays {
alerts.removeLast()
} else if modal != nil {
answerModal("cancel")
} else if image != nil {
image = nil
} else if diagram != nil {
diagram = nil
} else if let switcher {
switcher.close()
} else if menu != nil {
@@ -141,9 +136,10 @@ final class Overlays {
}
}
func install(_ ctrl: @escaping @MainActor (String) -> Bool) {
func install(_ ctrl: @escaping @MainActor (String) -> Bool, escape: @escaping @MainActor () -> Bool) {
holders += 1
self.ctrl = ctrl
self.escape = escape
if monitor != nil {
return
}
@@ -181,7 +177,11 @@ final class Overlays {
closeTop()
return true
}
return !marked && !terminalFocused()
if marked || terminalFocused() {
return false
}
_ = escape()
return true
}
if !isOpen {
return false
@@ -204,7 +204,7 @@ final class Overlays {
}
return false
}
if image == nil, diagram == nil, !marked, let switcher {
if !marked, let switcher {
if code == 48 {
switcher.inList.toggle()
return true
@@ -232,6 +232,7 @@ final class Overlays {
return
}
ctrl = { _ in false }
escape = { false }
if let monitor {
NSEvent.removeMonitor(monitor)
}
@@ -275,30 +276,6 @@ struct OverlayHost: View {
}
SwitcherPlacement(model: switcher)
}
if let image = overlays.image {
Palette.imageBackdrop
.onTapGesture {
overlays.image = nil
}
Image(nsImage: image)
.resizable()
.scaledToFit()
.frame(maxWidth: image.size.width, maxHeight: image.size.height)
.padding(24)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.onTapGesture {
overlays.image = nil
}
}
if let diagram = overlays.diagram {
Palette.imageBackdrop
.onTapGesture {
overlays.diagram = nil
}
DiagramViewer(layout: diagram)
.id(diagram.id)
.padding(24)
}
if let menu = overlays.menu {
VStack(alignment: .leading, spacing: 0) {
ForEach(menu.entries) { entry in