33// OpenSwiftUICore
44//
55// Audited for 6.5.4
6- // Status: WIP
6+ // Status: Blocked by Scrollable and ContentTransition
77// ID: FF3C661D9D8317A1C8FE2B7FD4EDE12C (SwiftUICore)
88
99import OpenAttributeGraphShims
@@ -18,51 +18,79 @@ extension Layout {
1818 list: Attribute < any ViewList >
1919 ) -> _ViewOutputs {
2020 var inputs = inputs
21- let containsScrollable = inputs. preferences. containsScrollable
22- let containsScrollTargetRoleContent = inputs. preferences. containsScrollTargetRoleContent
21+ let requiresScrollable = inputs. preferences. requiresScrollable
22+ let requiresScrollTargetRoleContent = inputs. preferences. requiresScrollTargetRoleContent
2323 let scrollTargetRole = inputs. scrollTargetRole
2424 let scrollTargetRemovePreference = inputs. scrollTargetRemovePreference
2525 let withinAccessibilityRotor = inputs. withinAccessibilityRotor
26-
27- // FIXME
28- var layoutComputer : Attribute < LayoutComputer > !
29- let childGeometry : Attribute < [ ViewGeometry ] > ?
26+ var childComputer : Attribute < LayoutComputer > ?
27+ let childGeometry : OptionalAttribute < [ ViewGeometry ] >
3028 let needLayout = inputs. requestsLayoutComputer || inputs. needsGeometry
31- if needLayout || containsScrollable || withinAccessibilityRotor {
32- layoutComputer = Attribute (
29+ if needLayout || requiresScrollable || withinAccessibilityRotor {
30+ let layoutComputer = Attribute (
3331 DynamicLayoutComputer (
3432 layout: root. value,
3533 environment: inputs. environment,
3634 containerInfo: . init( ) ,
3735 layoutMap: . init( )
3836 )
3937 )
40- childGeometry = Attribute (
38+ childComputer = layoutComputer
39+ childGeometry = . init( Attribute (
4140 LayoutChildGeometries (
4241 parentSize: inputs. size,
4342 parentPosition: inputs. position,
4443 layoutComputer: layoutComputer
4544 )
46- )
45+ ) )
4746 } else {
48- childGeometry = nil // .nil here
47+ childGeometry = . init ( )
4948 }
50-
51- // var context2
5249 var childInputs = inputs
5350 childInputs. requestsLayoutComputer = false
5451
55- if containsScrollTargetRoleContent && scrollTargetRemovePreference {
56- inputs. preferences. containsScrollTargetRoleContent = false
57- inputs. preferences. containsScrollStateRequest = false
52+ if requiresScrollTargetRoleContent && scrollTargetRemovePreference {
53+ inputs. preferences. requiresScrollTargetRoleContent = false
54+ inputs. preferences. requiresScrollStateRequest = false
5855 }
59- if let role = scrollTargetRole. attribute {
56+ if scrollTargetRole. attribute != nil {
6057 childInputs. base. scrollTargetRole = . init( )
6158 childInputs. base. scrollTargetRemovePreference = true
6259 childInputs. base. setScrollPosition ( storage: nil , kind: . scrollContent)
6360 childInputs. base. setScrollPositionAnchor ( . init( ) , kind: . scrollContent)
6461 }
65- _openSwiftUIUnimplementedFailure ( )
62+ func mapMutator( thunk: ( inout DynamicLayoutMap ) -> ( ) ) -> ( ) {
63+ guard let childComputer else { return }
64+ childComputer. mutateBody (
65+ as: DynamicLayoutComputer< Self> . self ,
66+ invalidating: true
67+ ) { computer in
68+ thunk ( & computer. layoutMap)
69+ }
70+ }
71+ var ( containerInfo, outputs) = DynamicContainer . makeContainer (
72+ adaptor: DynamicLayoutViewAdaptor (
73+ items: list,
74+ childGeometries: childGeometry,
75+ mutateLayoutMap: mapMutator ( thunk: )
76+ ) ,
77+ inputs: childInputs
78+ )
79+ if let childComputer {
80+ childComputer. mutateBody (
81+ as: DynamicLayoutComputer< Self> . self ,
82+ invalidating: true
83+ ) { computer in
84+ computer. $containerInfo = containerInfo
85+ }
86+ }
87+ if requiresScrollable || scrollTargetRole. attribute == nil || withinAccessibilityRotor {
88+ // TODO: Scrollable related
89+ }
90+ if inputs. requestsLayoutComputer, let childComputer {
91+ outputs. layoutComputer = childComputer
92+ }
93+ return outputs
6694 }
6795}
6896
0 commit comments