Skip to content
Open
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
7 changes: 6 additions & 1 deletion Sources/SkipUI/SkipUI/Containers/LazyHGrid.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,12 @@ public struct LazyHGrid: View, Renderable {
let scrollAxes: Axis.Set = isScrollEnabled ? Axis.Set.horizontal : []
let scrollTargetBehavior = EnvironmentValues.shared._scrollTargetBehavior

let renderables = content.EvaluateLazyItems(level: 0, context: context)
let renderables = EnvironmentValues.shared.setValuesWithReturn({
$0.set_lazySectionStackAxis(Axis.horizontal)
return ComposeResult.ok
}, in: {
content.EvaluateLazyItems(level: 0, context: context)
})
let itemContext = context.content()
let itemCollector = remember { mutableStateOf(LazyItemCollector()) }
ComposeContainer(axis: .vertical, scrollAxes: scrollAxes, modifier: context.modifier, fillWidth: true) { modifier in
Expand Down
7 changes: 6 additions & 1 deletion Sources/SkipUI/SkipUI/Containers/LazyHStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,12 @@ public struct LazyHStack : View, Renderable {
let scrollAxes: Axis.Set = isScrollEnabled ? Axis.Set.horizontal : []
let scrollTargetBehavior = EnvironmentValues.shared._scrollTargetBehavior

let renderables = content.EvaluateLazyItems(level: 0, context: context)
let renderables = EnvironmentValues.shared.setValuesWithReturn({
$0.set_lazySectionStackAxis(Axis.horizontal)
return ComposeResult.ok
}, in: {
content.EvaluateLazyItems(level: 0, context: context)
})
let itemContext = context.content()
let itemCollector = remember { mutableStateOf(LazyItemCollector()) }
ComposeContainer(axis: .horizontal, scrollAxes: scrollAxes, modifier: context.modifier, fillWidth: true) { modifier in
Expand Down
7 changes: 6 additions & 1 deletion Sources/SkipUI/SkipUI/Containers/LazyVGrid.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,12 @@ public struct LazyVGrid: View, Renderable {
let searchableState = EnvironmentValues.shared._searchableState
let isSearchable = searchableState?.isOnNavigationStack == false

let renderables = content.EvaluateLazyItems(level: 0, context: context)
let renderables = EnvironmentValues.shared.setValuesWithReturn({
$0.set_lazySectionStackAxis(Axis.vertical)
return ComposeResult.ok
}, in: {
content.EvaluateLazyItems(level: 0, context: context)
})
let itemContext = context.content()
let itemCollector = remember { mutableStateOf(LazyItemCollector()) }
ComposeContainer(axis: .vertical, scrollAxes: scrollAxes, modifier: context.modifier, fillWidth: true) { modifier in
Expand Down
7 changes: 6 additions & 1 deletion Sources/SkipUI/SkipUI/Containers/LazyVStack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,12 @@ public struct LazyVStack : View, Renderable {
let searchableState = EnvironmentValues.shared._searchableState
let isSearchable = searchableState?.isOnNavigationStack == false

let renderables = content.EvaluateLazyItems(level: 0, context: context)
let renderables = EnvironmentValues.shared.setValuesWithReturn({
$0.set_lazySectionStackAxis(Axis.vertical)
return ComposeResult.ok
}, in: {
content.EvaluateLazyItems(level: 0, context: context)
})
let itemContext = context.content()
let itemCollector = remember { mutableStateOf(LazyItemCollector()) }
ComposeContainer(axis: .vertical, scrollAxes: scrollAxes, modifier: context.modifier, fillWidth: true) { modifier in
Expand Down
20 changes: 12 additions & 8 deletions Sources/SkipUI/SkipUI/Containers/List.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,18 @@ public final class List : View, Renderable {
}

@Composable private func RenderList(context: ComposeContext, styling: ListStyling, arguments: ListArguments) {
let renderables: kotlin.collections.List<Renderable>
if let forEach {
renderables = forEach.EvaluateLazyItems(level: 0, context: context)
} else if let fixedContent {
renderables = fixedContent.EvaluateLazyItems(level: 0, context: context)
} else {
renderables = listOf()
}
let renderables = EnvironmentValues.shared.setValuesWithReturn({
$0.set_lazySectionStackAxis(Axis.vertical)
return ComposeResult.ok
}, in: {
if let forEach {
return forEach.EvaluateLazyItems(level: 0, context: context)
} else if let fixedContent {
return fixedContent.EvaluateLazyItems(level: 0, context: context)
} else {
return listOf()
}
})

var modifier = context.modifier
if styling.style != .plain {
Expand Down
23 changes: 21 additions & 2 deletions Sources/SkipUI/SkipUI/Containers/Section.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,37 @@ public struct Section : View {

#if SKIP
@Composable override func Evaluate(context: ComposeContext, options: Int) -> kotlin.collections.List<Renderable> {
let stackAxis = EnvironmentValues.shared._lazySectionStackAxis ?? Axis.vertical
func combined(_ list: kotlin.collections.List<Renderable>?, stackAxis: Axis) -> Renderable {
let filtered = (list ?? listOf()).filter { !$0.isSwiftUIEmptyView }
if filtered.size == 0 {
return EmptyView()
}
if filtered.size == 1 {
return filtered[0]
}
if stackAxis == Axis.horizontal {
return HStack(alignment: .center, spacing: 0) {
ForEach(0..<filtered.size) { i in ComposeView { ctx in filtered[i].Render(context: ctx) } }
}
} else {
return VStack(alignment: .center, spacing: 0) {
ForEach(0..<filtered.size) { i in ComposeView { ctx in filtered[i].Render(context: ctx) } }
}
}
}
let isLazy = EvaluateOptions(options).lazyItemLevel != nil
var renderables: kotlin.collections.MutableList<Renderable> = mutableListOf()
let headerRenderables = header?.Evaluate(context: context, options: 0)
if isLazy {
renderables.add(LazySectionHeader(content: headerRenderables?.firstOrNull() ?? EmptyView()))
renderables.add(LazySectionHeader(content: combined(headerRenderables, stackAxis: stackAxis)))
} else if let headerRenderables {
renderables.addAll(headerRenderables)
}
renderables.addAll(content.Evaluate(context: context, options: options))
let footerRenderables = footer?.Evaluate(context: context, options: 0)
if isLazy {
renderables.add(LazySectionFooter(content: footerRenderables?.firstOrNull() ?? EmptyView()))
renderables.add(LazySectionFooter(content: combined(footerRenderables, stackAxis: stackAxis)))
} else if let footerRenderables {
renderables.addAll(footerRenderables)
}
Expand Down
7 changes: 7 additions & 0 deletions Sources/SkipUI/SkipUI/Environment/EnvironmentValues.swift
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,13 @@ extension EnvironmentValues {
set { setBuiltinValue(key: "_listStyle", value: newValue, defaultValue: { nil }) }
}

/// Axis for stacking multiple views in a Section header/footer when in a lazy container.
/// LazyVGrid/LazyVStack/List use .vertical (VStack); LazyHGrid/LazyHStack use .horizontal (HStack).
var _lazySectionStackAxis: Axis? {
get { builtinValue(key: "_lazySectionStackAxis", defaultValue: { nil }) as! Axis? }
set { setBuiltinValue(key: "_lazySectionStackAxis", value: newValue, defaultValue: { nil }) }
}

var _material3BottomAppBar: (@Composable (Material3BottomAppBarOptions) -> Material3BottomAppBarOptions)? {
get { builtinValue(key: "_material3BottomAppBar", defaultValue: { nil }) as! (@Composable (Material3BottomAppBarOptions) -> Material3BottomAppBarOptions)? }
set { setBuiltinValue(key: "_material3BottomAppBar", value: newValue, defaultValue: { nil }) }
Expand Down