Last active
May 17, 2024 21:32
-
-
Save Matt54/dbf490f9e9d4dce91f37df7896fd4875 to your computer and use it in GitHub Desktop.
Keeping track of visionOS windows being opened/closed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import SwiftUI | |
import RealityKit | |
import RealityKitContent | |
@main | |
struct WindowWatchingApp: App { | |
@State private var windowManager: WindowManager | |
init() { | |
_windowManager = State(initialValue: WindowManager()) | |
} | |
var body: some SwiftUI.Scene { | |
WindowGroup(id: "WindowA") { | |
WindowA() | |
.environment(windowManager) | |
} | |
.windowResizability(.contentSize) | |
WindowGroup(id: "WindowB") { | |
WindowB() | |
.environment(windowManager) | |
} | |
.windowResizability(.contentSize) | |
} | |
} | |
@Observable | |
class WindowManager { | |
var isWindowAOpen: Bool = false | |
var isWindowBOpen: Bool = false | |
} | |
struct WindowA: View { | |
@Environment(WindowManager.self) var windowManager | |
@Environment(\.openWindow) var openWindow | |
@Environment(\.scenePhase) private var scenePhase | |
var body: some View { | |
VStack { | |
Text("Window A").font(.title) | |
Button(action: { | |
openWindow(id: "WindowB") | |
}, label: { | |
Text("Open Window B") | |
}) | |
.disabled(windowManager.isWindowBOpen) | |
} | |
.padding() | |
.onAppear { | |
windowManager.isWindowAOpen = true | |
print("onAppear: windowManager.isWindowAOpen = \(windowManager.isWindowAOpen)") | |
} | |
.onDisappear { | |
windowManager.isWindowAOpen = false | |
print("onDisappear: windowManager.isWindowAOpen = \(windowManager.isWindowAOpen)") | |
} | |
.onChange(of: scenePhase) { oldValue, newValue in | |
print("Window A scene: \(newValue)") | |
if newValue == .background && !windowManager.isWindowBOpen { | |
// if you need to do something when the last window is closed | |
print("ALL WINDOWS ARE CLOSED") | |
windowManager.isWindowAOpen = false | |
} else if newValue == .active { | |
windowManager.isWindowAOpen = true | |
} | |
} | |
} | |
} | |
struct WindowB: View { | |
@Environment(WindowManager.self) var windowManager | |
@Environment(\.openWindow) var openWindow | |
@Environment(\.scenePhase) private var scenePhase | |
var body: some View { | |
VStack { | |
Text("Window B").font(.title) | |
Button(action: { | |
openWindow(id: "WindowA") | |
}, label: { | |
Text("Open Window A") | |
}) | |
.disabled(windowManager.isWindowAOpen) | |
} | |
.padding() | |
.onAppear { | |
windowManager.isWindowBOpen = true | |
print("onAppear: windowManager.isWindowBOpen = \(windowManager.isWindowBOpen)") | |
} | |
.onDisappear { | |
windowManager.isWindowBOpen = false | |
print("onDisappear: windowManager.isWindowBOpen = \(windowManager.isWindowBOpen)") | |
} | |
.onChange(of: scenePhase) { oldValue, newValue in | |
print("Window B scene: \(newValue)") | |
if newValue == .background && !windowManager.isWindowAOpen { | |
// if you need to do something when the last window is closed | |
print("ALL WINDOWS ARE CLOSED") | |
windowManager.isWindowBOpen = false | |
} else if newValue == .active { | |
windowManager.isWindowBOpen = true | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment