@@ -671,7 +671,7 @@ extension Layout {
671
671
list: elements
672
672
)
673
673
}
674
- case let . dynamicList( viewList , modifier ) :
674
+ case . dynamicList:
675
675
return makeDynamicView (
676
676
root: root,
677
677
inputs: inputs,
@@ -1132,7 +1132,7 @@ private protocol DefaultAlignmentFunction {
1132
1132
) -> CGFloat ?
1133
1133
}
1134
1134
1135
- // MARK: - ViewLayoutEngine [6.4.41] [WIP]
1135
+ // MARK: - ViewLayoutEngine [6.4.41]
1136
1136
1137
1137
struct ViewLayoutEngine < L> : DefaultAlignmentFunction , LayoutEngine where L: Layout {
1138
1138
var layout : L
@@ -1225,7 +1225,51 @@ struct ViewLayoutEngine<L>: DefaultAlignmentFunction, LayoutEngine where L: Layo
1225
1225
}
1226
1226
1227
1227
mutating func childGeometries( at parentSize: ViewSize , origin: CGPoint ) -> [ ViewGeometry ] {
1228
- preconditionFailure ( " TODO " )
1228
+ let count = proxies. count
1229
+ if cachedAlignmentSize == parentSize, origin == . zero, cachedAlignmentGeometry. count == proxies. count {
1230
+ return cachedAlignmentGeometry
1231
+ } else {
1232
+ let proposal = parentSize. proposal
1233
+ let frame = CGRect ( origin: origin, size: parentSize. value)
1234
+ var data = PlacementData (
1235
+ unknown: false ,
1236
+ geometrys: Array ( repeating: ViewGeometry . invalidValue, count: count) ,
1237
+ invalidCount: 0 ,
1238
+ frame: frame,
1239
+ layoutDirection: layoutDirection
1240
+ )
1241
+ withUnsafeMutablePointer ( to: & data) { data in
1242
+ let oldData = threadLayoutData
1243
+ threadLayoutData = data
1244
+ layout. placeSubviews (
1245
+ in: frame,
1246
+ proposal: ProposedViewSize ( proposal) ,
1247
+ subviews: LayoutSubviews (
1248
+ context: proxies. context,
1249
+ storage: . direct( proxies. attributes) ,
1250
+ layoutDirection: layoutDirection
1251
+ ) ,
1252
+ cache: & cache
1253
+ )
1254
+ threadLayoutData = oldData
1255
+ guard data. pointee. invalidCount != count else {
1256
+ return
1257
+ }
1258
+ for (index, geometry) in data. pointee. geometrys. enumerated ( ) {
1259
+ guard geometry. isInvalid else {
1260
+ continue
1261
+ }
1262
+ let dimiensions = proxies [ index] . dimensions ( in: parentSize. proposal)
1263
+ let center = data. pointee. frame. center
1264
+ data. pointee. setGeometry (
1265
+ dimiensions. centered ( in: CGSize ( center) ) ,
1266
+ at: index,
1267
+ layoutDirection: . leftToRight
1268
+ )
1269
+ }
1270
+ }
1271
+ return data. geometrys
1272
+ }
1229
1273
}
1230
1274
1231
1275
mutating func explicitAlignment( _ k: AlignmentKey , at viewSize: ViewSize ) -> CGFloat ? {
@@ -1613,9 +1657,11 @@ public struct LayoutSubview: Equatable {
1613
1657
@available ( * , unavailable)
1614
1658
extension LayoutSubview : Sendable { }
1615
1659
1616
- // MARK: - PlacementData [6.4.41] [WIP]
1660
+ // MARK: - PlacementData [6.4.41]
1617
1661
1618
1662
private struct PlacementData {
1663
+ var unknown : Bool // FIXME
1664
+
1619
1665
var geometrys : [ ViewGeometry ]
1620
1666
1621
1667
var invalidCount : Int
@@ -1624,6 +1670,8 @@ private struct PlacementData {
1624
1670
1625
1671
var layoutDirection : LayoutDirection
1626
1672
1673
+ static var current : UnsafeMutablePointer < PlacementData > ? { threadLayoutData }
1674
+
1627
1675
mutating func setGeometry( _ geometry: ViewGeometry , at index: Int , layoutDirection: LayoutDirection ) {
1628
1676
if geometrys [ index] . isInvalid {
1629
1677
invalidCount += 1
@@ -1635,6 +1683,18 @@ private struct PlacementData {
1635
1683
}
1636
1684
}
1637
1685
1686
+ // MARK: - threadLayoutData
1687
+
1688
+ @_transparent
1689
+ private var threadLayoutData : UnsafeMutablePointer < PlacementData > ? {
1690
+ get {
1691
+ _threadLayoutData ( ) ? . assumingMemoryBound ( to: PlacementData . self)
1692
+ }
1693
+ set {
1694
+ _setThreadLayoutData ( newValue)
1695
+ }
1696
+ }
1697
+
1638
1698
// MARK: - LayoutValueKey
1639
1699
1640
1700
/// A key for accessing a layout value of a layout container's subviews.
@@ -1954,17 +2014,3 @@ public typealias ViewLayoutKey = LayoutValueKey
1954
2014
@_spi ( _)
1955
2015
@available ( * , deprecated, renamed: " _LayoutRoot " )
1956
2016
public typealias _ViewLayoutRoot < L> = _LayoutRoot < L > where L : Layout
1957
-
1958
- // MARK: - threadLayoutData
1959
-
1960
- @_transparent
1961
- private var threadLayoutData : AnyObject ? {
1962
- get {
1963
- _threadLayoutData ( ) as AnyObject ?
1964
- }
1965
- set {
1966
- _setThreadLayoutData (
1967
- newValue. map { Unmanaged . passUnretained ( $0) . toOpaque ( ) }
1968
- )
1969
- }
1970
- }
0 commit comments