window order
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user