Skip to content

Commit 4e8b0ce

Browse files
authored
Add ModifiedViewList implementation (#565)
1 parent ddc4254 commit 4e8b0ce

File tree

1 file changed

+114
-3
lines changed

1 file changed

+114
-3
lines changed

Sources/OpenSwiftUICore/View/Input/ViewList.swift

Lines changed: 114 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,9 +1383,24 @@ extension _ViewListOutputs {
13831383
package mutating func multiModifier<T>(_ modifier: _GraphValue<T>, inputs: _ViewListInputs) where T: ViewModifier {
13841384
switch views {
13851385
case let .staticList(elements):
1386-
views = .staticList(ModifiedElements(base: elements, modifier: WeakAttribute(modifier.value), baseInputs: inputs.base))
1387-
case .dynamicList(_, _):
1388-
_openSwiftUIUnimplementedFailure()
1386+
views = .staticList(
1387+
ModifiedElements(
1388+
base: elements,
1389+
modifier: WeakAttribute(
1390+
modifier.value
1391+
),
1392+
baseInputs: inputs.base
1393+
)
1394+
)
1395+
case let .dynamicList(attribute, listModifier):
1396+
views = .dynamicList(
1397+
attribute,
1398+
ModifiedViewList.ListModifier(
1399+
pred: listModifier,
1400+
modifier: modifier,
1401+
inputs: inputs.base
1402+
)
1403+
)
13891404
}
13901405
}
13911406

@@ -1565,6 +1580,102 @@ private struct ModifiedElements<Modifier>: ViewList.Elements where Modifier: Vie
15651580
}
15661581
}
15671582

1583+
// MARK: - ModifiedViewList [6.5.4]
1584+
1585+
private struct ModifiedViewList<Modifier>: ViewList where Modifier: ViewModifier {
1586+
let base: ViewList
1587+
let modifier: WeakAttribute<Modifier>
1588+
let inputs: _GraphInputs
1589+
1590+
func count(style: IteratorStyle) -> Int {
1591+
base.count(style: style)
1592+
}
1593+
1594+
func estimatedCount(style: IteratorStyle) -> Int {
1595+
base.estimatedCount(style: style)
1596+
}
1597+
1598+
var traitKeys: ViewTraitKeys? {
1599+
base.traitKeys
1600+
}
1601+
1602+
var viewIDs: ID.Views? {
1603+
base.viewIDs
1604+
}
1605+
1606+
var traits: ViewTraitCollection {
1607+
base.traits
1608+
}
1609+
1610+
func applyNodes(
1611+
from start: inout Int,
1612+
style: IteratorStyle,
1613+
list: Attribute<any ViewList>?,
1614+
transform: inout SublistTransform,
1615+
to body: ApplyBody
1616+
) -> Bool {
1617+
let item = Transform(modifier: modifier, inputs: inputs)
1618+
transform.push(item)
1619+
defer { transform.pop() }
1620+
return base.applyNodes(
1621+
from: &start,
1622+
style: style,
1623+
list: list,
1624+
transform: &transform,
1625+
to: body
1626+
)
1627+
}
1628+
1629+
func edit(
1630+
forID id: ID,
1631+
since transaction: TransactionID
1632+
) -> Edit? {
1633+
base.edit(forID: id, since: transaction)
1634+
}
1635+
1636+
func firstOffset<OtherID>(
1637+
forID id: OtherID,
1638+
style: IteratorStyle
1639+
) -> Int? where OtherID : Hashable {
1640+
base.firstOffset(forID: id, style: style)
1641+
}
1642+
1643+
struct Transform: ViewList.SublistTransform.Item {
1644+
var modifier: WeakAttribute<Modifier>
1645+
var inputs: _GraphInputs
1646+
1647+
func apply(sublist: inout _ViewList_Sublist) {
1648+
sublist.elements = ModifiedElements(base: sublist.elements, modifier: modifier, baseInputs: inputs)
1649+
}
1650+
1651+
func bindID(_ id: inout _ViewList_ID) {
1652+
_openSwiftUIEmptyStub()
1653+
}
1654+
}
1655+
1656+
class ListModifier: _ViewListOutputs.ListModifier {
1657+
let pred: _ViewListOutputs.ListModifier?
1658+
let modifier: WeakAttribute<Modifier>
1659+
let inputs: _GraphInputs
1660+
1661+
init(
1662+
pred: _ViewListOutputs.ListModifier?,
1663+
modifier: _GraphValue<Modifier>,
1664+
inputs: _GraphInputs
1665+
) {
1666+
self.pred = pred
1667+
self.modifier = WeakAttribute(modifier.value)
1668+
self.inputs = inputs
1669+
}
1670+
1671+
override func apply(to list: inout any ViewList) {
1672+
pred?.apply(to: &list)
1673+
list = ModifiedViewList(base: list, modifier: modifier, inputs: inputs)
1674+
}
1675+
}
1676+
1677+
}
1678+
15681679
// MARK: - BaseViewList [6.4.41]
15691680

15701681
private struct BaseViewList: ViewList {

0 commit comments

Comments
 (0)