Skip to content

Commit

Permalink
Refactor grid measure helper
Browse files Browse the repository at this point in the history
Separate MeasureHelper.measure() method to 2 method called measure() and
position().
  • Loading branch information
cheonjaeung committed Jul 8, 2023
1 parent b9133ef commit 5e06247
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 11 deletions.
48 changes: 37 additions & 11 deletions grid/src/commonMain/kotlin/io/woong/compose/grid/MeasureHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ internal class GridMeasureResult(
val crossAxisCount: Int,
val mainAxisSize: Int,
val crossAxisSize: Int,
)

internal class GridPositionResult(
val mainAxisPositions: IntArray,
val crossAxisPositions: IntArray,
)
Expand All @@ -48,7 +51,9 @@ internal class GridMeasureHelper(
val crossAxisArrangement: (Int, IntArray, LayoutDirection, Density, IntArray) -> Unit,
val crossAxisSpacing: Dp,
) {
@Suppress("IfThenToElvis")
/**
* Measures required grid layout size and children composable constraints.
*/
fun measure(
measureScope: MeasureScope,
constraints: Constraints,
Expand Down Expand Up @@ -111,13 +116,33 @@ internal class GridMeasureHelper(
val mainAxisLayoutSize = max(mainAxisTotalSize, constraints.mainAxisMinSize)
val crossAxisLayoutSize = max(crossAxisTotalSize, constraints.crossAxisMinSize)

// Measure children composable x, y positions.
GridMeasureResult(
mainAxisSize = mainAxisLayoutSize,
crossAxisSize = crossAxisLayoutSize,
mainAxisCount = mainAxisCount,
crossAxisCount = crossAxisCount,
)
}

/**
* Calculates positions where the children composable should be placed.
*/
fun position(
measureScope: MeasureScope,
measureResult: GridMeasureResult,
): GridPositionResult = with(measureScope) {
val mainAxisCount = measureResult.mainAxisCount
val crossAxisCount = measureResult.crossAxisCount
val mainAxisLayoutSize = measureResult.mainAxisSize
val crossAxisLayoutSize = measureResult.crossAxisSize

var mainAxisMaxPositions = IntArray(mainAxisCount) { 0 }
var mainAxisMinPositions = IntArray(mainAxisCount) { 0 }
for (c in 0 until crossAxisCount) {
val mainAxisPositions = IntArray(mainAxisCount) { 0 }
val mainAxisChildrenSizes = IntArray(mainAxisCount) { index ->
val placeable = placeables.getOrNull(index * crossAxisCount + c)
@Suppress("IfThenToElvis")
if (placeable != null) {
placeable.mainAxisSize()
} else {
Expand Down Expand Up @@ -153,6 +178,7 @@ internal class GridMeasureHelper(
val crossAxisPositions = IntArray(crossAxisCount) { 0 }
val crossAxisChildrenSizes = IntArray(crossAxisCount) { index ->
val placeable = placeables.getOrNull(index * mainAxisCount + m)
@Suppress("IfThenToElvis")
if (placeable != null) {
placeable.crossAxisSize()
} else {
Expand Down Expand Up @@ -182,19 +208,19 @@ internal class GridMeasureHelper(
)
}

GridMeasureResult(
mainAxisSize = mainAxisLayoutSize,
crossAxisSize = crossAxisLayoutSize,
mainAxisCount = mainAxisCount,
crossAxisCount = crossAxisCount,
GridPositionResult(
mainAxisPositions = mainAxisMaxPositions,
crossAxisPositions = crossAxisMaxPositions,
)
}

/**
* Places children composable at the collect position.
*/
fun place(
placeableScope: Placeable.PlacementScope,
measureResult: GridMeasureResult,
positionResult: GridPositionResult,
) = with(placeableScope) {
var i = 0
for (m in 0 until measureResult.mainAxisCount) {
Expand All @@ -205,13 +231,13 @@ internal class GridMeasureHelper(

if (orientation == LayoutOrientation.Horizontal) {
placeable.place(
x = measureResult.mainAxisPositions[m],
y = measureResult.crossAxisPositions[c],
x = positionResult.mainAxisPositions[m],
y = positionResult.crossAxisPositions[c],
)
} else {
placeable.place(
x = measureResult.crossAxisPositions[c],
y = measureResult.mainAxisPositions[m],
x = positionResult.crossAxisPositions[c],
y = positionResult.mainAxisPositions[m],
)
}
i++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ internal fun gridMeasurePolicy(
constraints = constraints,
)

val positionResult = measureHelper.position(
measureScope = this,
measureResult = measureResult,
)

val layoutWidth: Int
val layoutHeight: Int
when (orientation) {
Expand All @@ -70,6 +75,7 @@ internal fun gridMeasurePolicy(
measureHelper.place(
placeableScope = this,
measureResult = measureResult,
positionResult = positionResult,
)
}
}
Expand Down

0 comments on commit 5e06247

Please sign in to comment.