diff --git a/Sources/OpenSwiftUI/App/App/AppGraph.swift b/Sources/OpenSwiftUI/App/App/AppGraph.swift index 02d631417..20898bdfd 100644 --- a/Sources/OpenSwiftUI/App/App/AppGraph.swift +++ b/Sources/OpenSwiftUI/App/App/AppGraph.swift @@ -95,6 +95,32 @@ package final class AppGraph: GraphHost { // MARK: - Override Methods + override package func instantiateOutputs() { + data.updateSeed &+= 1 + let outputs = rootSubgraph.apply { + var inputs = _SceneInputs( + base: graphInputs, + preferences: .init(hostKeys: data.$hostPreferenceKeys) + ) + inputs.base.environment = Attribute( + RootEnvironment( + environment: graphInputs.environment, + phase: $rootScenePhase, + sceneKeyboardShorts: $sceneKeyboardShortcuts + ) + ) + inputs.preferences.add(HostPreferencesKey.self) + inputs.preferences.add(SceneList.Key.self) + inputs.preferences.add(CommandsList.Key.self) + inputs.base.focusedValues = $focusedValues + inputs.base.focusStore = $focusStore + return makeRootScene(inputs) + } + $rootSceneList = outputs.preferences.sceneList + $rootCommandsList = outputs.preferences.commandsList + hostPreferenceValues = WeakAttribute(outputs.preferences.hostPreferenceValues) + } + // MARK: - Profile related func startProfilingIfNecessary() { @@ -167,3 +193,15 @@ private struct AppBodyAccessor: BodyAccessor where Application: App } } } + +// MARK: - RootEnvironment + +private struct RootEnvironment: Rule { + @Attribute var environment: EnvironmentValues + @Attribute var phase: ScenePhase + @Attribute var sceneKeyboardShorts: [SceneID: KeyboardShortcut] + + var value: EnvironmentValues { + environment + } +} diff --git a/Sources/OpenSwiftUI/App/Window/WindowGroup.swift b/Sources/OpenSwiftUI/App/Window/WindowGroup.swift index 058b4492a..b7082e668 100644 --- a/Sources/OpenSwiftUI/App/Window/WindowGroup.swift +++ b/Sources/OpenSwiftUI/App/Window/WindowGroup.swift @@ -290,7 +290,6 @@ struct WindowSceneList: PrimitiveScene where Attributes: WindowScene scene: _GraphValue, inputs: _SceneInputs ) -> _SceneOutputs { - _openSwiftUIBaseClassAbstractMethod() let configuration = scene[offset: { .of(&$0.configuration) }].value var outputs = _SceneOutputs() outputs.preferences diff --git a/Sources/OpenSwiftUI/Event/Focus/FocusStore.swift b/Sources/OpenSwiftUI/Event/Focus/FocusStore.swift index 3d3cd597b..396a2ed1b 100644 --- a/Sources/OpenSwiftUI/Event/Focus/FocusStore.swift +++ b/Sources/OpenSwiftUI/Event/Focus/FocusStore.swift @@ -1,3 +1,4 @@ +import OpenAttributeGraphShims @_spi(ForOpenSwiftUIOnly) import OpenSwiftUICore @@ -27,3 +28,23 @@ extension FocusStore { } } + +struct FocusStoreInputKey: ViewInput { + static var defaultValue: OptionalAttribute { + .init() + } +} + +extension _ViewInputs { + var focusStore: Attribute? { + get { base.focusStore } + set { base.focusStore = newValue } + } +} + +extension _GraphInputs { + var focusStore: Attribute? { + get { self[FocusStoreInputKey.self].attribute } + set { self[FocusStoreInputKey.self] = .init(newValue) } + } +} diff --git a/Sources/OpenSwiftUI/Event/Focus/FocusedValueKey.swift b/Sources/OpenSwiftUI/Event/Focus/FocusedValueKey.swift index 7d205243c..51f43c3b1 100644 --- a/Sources/OpenSwiftUI/Event/Focus/FocusedValueKey.swift +++ b/Sources/OpenSwiftUI/Event/Focus/FocusedValueKey.swift @@ -107,3 +107,17 @@ struct FocusedValuesInputKey: ViewInput { .init() } } + +extension _ViewInputs { + var focusedValues: Attribute? { + get { base.focusedValues } + set { base.focusedValues = newValue } + } +} + +extension _GraphInputs { + var focusedValues: Attribute? { + get { self[FocusedValuesInputKey.self].attribute } + set { self[FocusedValuesInputKey.self] = .init(newValue) } + } +} diff --git a/Sources/OpenSwiftUICore/Data/Preference/PreferenceBridge.swift b/Sources/OpenSwiftUICore/Data/Preference/PreferenceBridge.swift index 9a9d94778..126235c94 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/PreferenceBridge.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/PreferenceBridge.swift @@ -59,10 +59,10 @@ package final class PreferenceBridge { let combiner = Attribute( HostPreferencesCombiner( keys: inputs.preferences.hostKeys, - values: outputs[HostPreferencesKey.self] + values: outputs.hostPreferenceValues ) ) - outputs[HostPreferencesKey.self] = combiner + outputs.hostPreferenceValues = combiner _hostPreferenceKeys = WeakAttribute(inputs.preferences.hostKeys) _hostPreferencesCombiner = WeakAttribute(combiner) } else { diff --git a/Sources/OpenSwiftUICore/Data/Preference/PreferenceKey.swift b/Sources/OpenSwiftUICore/Data/Preference/PreferenceKey.swift index d68c8e575..cd86ca146 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/PreferenceKey.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/PreferenceKey.swift @@ -6,6 +6,8 @@ // Status: Complete // ID: 3D8838A231BB2CC7FC00E7880D8B2FC4 (SwiftUICore) +package import OpenAttributeGraphShims + // MARK: - PreferenceKey /// A named value produced by a view. @@ -160,6 +162,13 @@ package struct HostPreferencesKey: PreferenceKey { } } +extension PreferencesOutputs { + package var hostPreferenceValues: Attribute? { + get { self[HostPreferencesKey.self] } + set { self[HostPreferencesKey.self] = newValue } + } +} + // MARK: - HostPreferenceKey @_spi(Private) diff --git a/Sources/OpenSwiftUICore/Data/Preference/PreferenceTransformModifier.swift b/Sources/OpenSwiftUICore/Data/Preference/PreferenceTransformModifier.swift index 9d584ca9c..cca780e6d 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/PreferenceTransformModifier.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/PreferenceTransformModifier.swift @@ -86,11 +86,11 @@ extension PreferencesOutputs { } if K._isReadableByHost, inputs.contains(HostPreferencesKey.self) { - self[HostPreferencesKey.self] = Attribute( + hostPreferenceValues = Attribute( HostPreferencesTransform( transform: attribute ?? transform(), keys: inputs.hostKeys, - childValues: .init(self[HostPreferencesKey.self]), + childValues: .init(hostPreferenceValues), keyRequested: false, wasEmpty: false, delta: 0, diff --git a/Sources/OpenSwiftUICore/Data/Preference/PreferenceWritingModifier.swift b/Sources/OpenSwiftUICore/Data/Preference/PreferenceWritingModifier.swift index 1ca35a237..f10b22a91 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/PreferenceWritingModifier.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/PreferenceWritingModifier.swift @@ -97,11 +97,11 @@ extension PreferencesOutputs { } if K._isReadableByHost, inputs.contains(HostPreferencesKey.self) { - self[HostPreferencesKey.self] = Attribute( + hostPreferenceValues = Attribute( HostPreferencesWriter( keyValue: attribute ?? value(), keys: inputs.hostKeys, - childValues: .init(self[HostPreferencesKey.self]), + childValues: .init(hostPreferenceValues), keyRequested: false, wasEmpty: false, delta: 0, diff --git a/Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift b/Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift index 358037803..7ecb00270 100644 --- a/Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift +++ b/Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift @@ -274,7 +274,7 @@ package final class ViewGraph: GraphHost { if requestedOutputs.contains(.layout) { _rootLayoutComputer = WeakAttribute(outputs.layoutComputer) } - hostPreferenceValues = WeakAttribute(outputs.preferences[HostPreferencesKey.self]) + hostPreferenceValues = WeakAttribute(outputs.preferences.hostPreferenceValues) makePreferenceOutlets(outputs: outputs) }