Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions Sources/OpenSwiftUI/View/Subview/Subview.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// Subview.swift
// OpenSwiftUI
//
// Audited for 6.5.4
// Status: Complete

@_spi(ForOpenSwiftUIOnly) public import OpenSwiftUICore

@_spi(DoNotImportVariadicView)
extension Subview {
@available(*, deprecated, renamed: "containerValues")
public var traits: TraitValues {
TraitValues(base: base.traits)
}
}
90 changes: 90 additions & 0 deletions Sources/OpenSwiftUI/View/Subview/SubviewCollection.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
//
// SubviewCollection.swift
// OpenSwiftUI
//
// Audited for 6.5.4
// Status: Complete

@_spi(ForOpenSwiftUIOnly) public import OpenSwiftUICore

// MARK: - Group + SubviewCollection

@_spi(DoNotImportVariadicView)
extension Group {
@available(*, deprecated, message: "Use the public API instead.")
@_disfavoredOverload
public init<Base, Result>(
elementsOf view: Base,
@ViewBuilder transform: @escaping (SubviewCollection) -> Result
) where Content == GroupElementsOfContent<Base, Result>, Base: View, Result: View {
self.init {
GroupElementsOfContent(subviews: view) { subviews in
transform(SubviewCollection(subviews))
}
}
}
}

// MARK: - SubviewCollection

@_spi(DoNotImportVariadicView)
@available(*, deprecated, renamed: "SubviewsCollection")
public struct SubviewCollection: RandomAccessCollection {
package var base: _VariadicView.Children

@usableFromInline
init(_ subviews: SubviewsCollection) {
base = subviews.base
}

public subscript(index: Int) -> Subview {
Subview(base[index])
}

public subscript(bounds: Range<Int>) -> Slice<SubviewCollection> {
Slice(base: self, bounds: bounds)
}

public var startIndex: Int { base.startIndex }

public var endIndex: Int { base.endIndex }

public func selectedSubview<V>(selection: V) -> Subview? where V: Hashable {
var start = 0
var index = 0
var selectedIndex: Int?
base.list.applySublists(from: &start, list: nil) { sublist in
if sublist.traits.tag(for: V.self) == selection,
!sublist.traits.isAuxiliaryContent {
selectedIndex = index
return false
}
index &+= sublist.count
return true
}
return selectedIndex.map { Subview(base[$0]) }
}
}

@_spi(DoNotImportVariadicView)
@available(*, unavailable)
extension SubviewCollection: Sendable {}

@_spi(DoNotImportVariadicView)
@available(OpenSwiftUI_v6_0, *)
extension SubviewCollection: View, MultiView, PrimitiveView {
public var body: some View {
base
}

nonisolated public static func _makeViewList(
view: _GraphValue<Self>,
inputs: _ViewListInputs
) -> _ViewListOutputs {
_VariadicView.Children._makeViewList(view: view[\.base], inputs: inputs)
}

nonisolated public static func _viewListCount(inputs: _ViewListCountInputs) -> Int? {
_VariadicView.Children._viewListCount(inputs: inputs)
}
}
34 changes: 28 additions & 6 deletions Sources/OpenSwiftUICore/View/DynamicViewContent/ForEach.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// OpenSwiftUICore
//
// Audited for 6.5.4
// Status: Blocked by Subview
// Status: Complete
// ID: 1A3DD35AB7F6976908CD7AF959F34D1F (SwiftUICore)

import Foundation
Expand Down Expand Up @@ -148,7 +148,7 @@ public struct ForEach<Data, ID, Content> where Data: RandomAccessCollection, ID:
@available(*, unavailable)
extension ForEach: Sendable {}

// MARK: - ForEach + View [Blocked by Subview]
// MARK: - ForEach + View

@available(OpenSwiftUI_v1_0, *)
extension ForEach: View, PrimitiveView where Content: View {
Expand All @@ -169,8 +169,19 @@ extension ForEach: View, PrimitiveView where Content: View {
view: _GraphValue<Self>,
inputs: _ViewInputs
) -> _ViewOutputs? {
// TODO: Subview stuff
return nil
if let view = view as? _GraphValue<ForEach<ForEachSubviewCollection<Content>, Subview.ID, Content>> {
return AnyView._makeView(
view: view[offset: { .of(&$0.data.substituteView) }],
inputs: inputs
)
} else if let view = view as? _GraphValue<ForEach<ForEachSectionCollection<Content>, SectionConfiguration.ID, Content>> {
return AnyView._makeView(
view: view[offset: { .of(&$0.data.substituteView) }],
inputs: inputs
)
} else {
return nil
}
}

nonisolated public static func _makeViewList(
Expand Down Expand Up @@ -217,8 +228,19 @@ extension ForEach: View, PrimitiveView where Content: View {
view: _GraphValue<Self>,
inputs: _ViewListInputs
) -> _ViewListOutputs? {
// TODO: Subview stuff
return nil
if let view = view as? _GraphValue<ForEach<ForEachSubviewCollection<Content>, Subview.ID, Content>> {
return AnyView._makeViewList(
view: view[offset: { .of(&$0.data.substituteView) }],
inputs: inputs
)
} else if let view = view as? _GraphValue<ForEach<ForEachSectionCollection<Content>, SectionConfiguration.ID, Content>> {
return AnyView._makeViewList(
view: view[offset: { .of(&$0.data.substituteView) }],
inputs: inputs
)
} else {
return nil
}
}
}

Expand Down
Loading
Loading