window order

This commit is contained in:
Ian Gulliver
2026-10-18 21:55:53 -07:00
parent d02f4c7280
commit 327aab069d
2 changed files with 35 additions and 3 deletions
+34 -2
View File
@@ -12,6 +12,7 @@ final class Servers {
private(set) var entries: [(origin: String, record: ServerRecord)] = []
private(set) var connections: [String: Connection] = [:]
@ObservationIgnored var shown: Set<String> = []
@ObservationIgnored var windows: [String: WindowSlot] = [:]
@ObservationIgnored var launched = false
@ObservationIgnored var openWindow: ((String?) -> Void)?
@@ -92,6 +93,18 @@ final class Servers {
return origins[(i + step + origins.count) % origins.count]
}
func arrange(_ group: NSWindowTabGroup?) {
guard let group else {
return
}
let selected = group.selectedWindow
let ordered = origins.compactMap { windows[$0]?.window }.filter { group.windows.contains($0) }
for (i, window) in ordered.enumerated() where group.windows[i] !== window {
group.insertWindow(window, at: i)
}
group.selectedWindow = selected
}
func openAll() {
if origins.isEmpty {
openWindow?(nil)
@@ -102,6 +115,11 @@ final class Servers {
}
}
@MainActor
final class WindowSlot {
weak var window: NSWindow?
}
@MainActor
@Observable
final class Connection {
@@ -341,6 +359,7 @@ struct ServerWindow: View {
@Binding var origin: String?
@ViewState private var overlays = Overlays()
@ViewState private var form = ConnectForm()
@ViewState private var slot = WindowSlot()
@Environment(\.openWindow) private var openWindow
@Environment(\.dismiss) private var dismissWindow
@@ -414,16 +433,27 @@ struct ServerWindow: View {
.onDisappear {
if let origin {
Servers.shared.shown.remove(origin)
release(origin)
}
}
}
private func moved(_ old: String?, _ new: String?) {
let servers = Servers.shared
if let old {
Servers.shared.shown.remove(old)
servers.shown.remove(old)
release(old)
}
if let new {
Servers.shared.shown.insert(new)
servers.shown.insert(new)
servers.windows[new] = slot
}
servers.arrange(slot.window?.tabGroup)
}
private func release(_ origin: String) {
if Servers.shared.windows[origin] === slot {
Servers.shared.windows[origin] = nil
}
}
@@ -449,11 +479,13 @@ struct ServerWindow: View {
private func joinTabs(_ window: NSWindow) {
window.tabbingMode = .preferred
slot.window = window
DispatchQueue.main.async {
let host = NSApp.windows.first { $0 !== window && $0.isVisible && $0.tabbingIdentifier == window.tabbingIdentifier }
if let host, !(host.tabbedWindows ?? []).contains(window) {
host.addTabbedWindow(window, ordered: .above)
}
Servers.shared.arrange(window.tabGroup)
}
}