Skip to content

Commit f5a58db

Browse files
committed
Implement makeDynamicView
1 parent 806de8e commit f5a58db

File tree

4 files changed

+50
-22
lines changed

4 files changed

+50
-22
lines changed

Sources/OpenSwiftUICore/Layout/Dynamic/DynamicLayoutView.swift

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// OpenSwiftUICore
44
//
55
// Audited for 6.5.4
6-
// Status: WIP
6+
// Status: Blocked by Scrollable and ContentTransition
77
// ID: FF3C661D9D8317A1C8FE2B7FD4EDE12C (SwiftUICore)
88

99
import 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

Sources/OpenSwiftUICore/View/Scroll/ScrollStateRequest.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ package struct UpdateScrollStateRequestKey: PreferenceKey {
2424

2525
extension PreferencesInputs {
2626
@inline(__always)
27-
package var containsScrollStateRequest: Bool {
27+
package var requiresScrollStateRequest: Bool {
2828
get { contains(UpdateScrollStateRequestKey.self) }
2929
set {
3030
if newValue {

Sources/OpenSwiftUICore/View/Scroll/ScrollTarget.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ extension ScrollTargetRole {
125125

126126
extension PreferencesInputs {
127127
@inline(__always)
128-
package var containsScrollTargetRoleContent: Bool {
128+
package var requiresScrollTargetRoleContent: Bool {
129129
get {
130130
contains(ScrollTargetRole.ContentKey.self)
131131
}

Sources/OpenSwiftUICore/View/Scroll/Scrollable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ package struct ScrollablePreferenceKey: PreferenceKey {
2828

2929
extension PreferencesInputs {
3030
@inline(__always)
31-
package var containsScrollable: Bool {
31+
package var requiresScrollable: Bool {
3232
get {
3333
contains(ScrollablePreferenceKey.self)
3434
}

0 commit comments

Comments
 (0)