Skip to content

Commit bb60caa

Browse files
committed
Implement tryRemovingItem
1 parent d0e1228 commit bb60caa

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

Sources/OpenSwiftUICore/Layout/Dynamic/DynamicContainer.swift

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,11 @@ package struct DynamicContainer {
200200
private class DynamicAnimationListener: AnimationListener, @unchecked Sendable {
201201
weak var viewGraph: ViewGraph?
202202
let asyncSignal: WeakAttribute<Void>
203-
var count: Int
203+
var count: Int = 0
204204

205205
init(viewGraph: ViewGraph?, asyncSignal: WeakAttribute<Void>) {
206206
self.viewGraph = viewGraph
207207
self.asyncSignal = asyncSignal
208-
self.count = 0
209208
}
210209

211210
override func animationWasAdded() {
@@ -583,8 +582,43 @@ struct DynamicContainerInfo<Adapter>: StatefulRule, AsyncAttribute, ObservedAttr
583582
at index: Int,
584583
disableTransitions: Bool
585584
) -> Bool {
586-
_openSwiftUIUnimplementedWarning()
587-
return .random()
585+
let items = info.items
586+
guard let phase = items[index].phase else {
587+
return false
588+
}
589+
switch phase {
590+
case .willAppear:
591+
preconditionFailure("")
592+
case .identity:
593+
guard !disableTransitions, items[index].needsTransitions else {
594+
eraseItem(at: index)
595+
return true
596+
}
597+
lastRemoved = max(lastRemoved &+ 1, 1)
598+
items[index].removalOrder = lastRemoved
599+
info.removedCount &+= 1
600+
items[index].phase = .didDisappear
601+
if let listener = items[index].listener {
602+
listener.viewGraph = nil
603+
}
604+
let newListener = DynamicAnimationListener(
605+
viewGraph: .current,
606+
asyncSignal: WeakAttribute($asyncSignal)
607+
)
608+
items[index].listener = newListener
609+
newListener.animationWasAdded()
610+
Update.enqueueAction { // TODO: reason
611+
newListener.animationWasRemoved()
612+
}
613+
return false
614+
case .didDisappear:
615+
let listener = items[index].listener!
616+
guard listener.count == 0 else {
617+
return false
618+
}
619+
eraseItem(at: index)
620+
return true
621+
}
588622
}
589623

590624
func unremoveItem(at index: Int) {

0 commit comments

Comments
 (0)