Skip to content

Commit 1503a46

Browse files
committed
Fix gap; padding measurements for containers; empty containers; AGP upgrade
1 parent 2d94819 commit 1503a46

7 files changed

Lines changed: 38 additions & 30 deletions

File tree

app/src/main/java/net/obsidianx/chakra/MainActivity.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,6 @@ enum class Page {
3636
UpdateContents,
3737
}
3838

39-
@Composable
40-
fun Test(modifier: Modifier = Modifier) {
41-
Flexbox(modifier = modifier
42-
.flex {
43-
debugTag("in")
44-
padding(4.dp)
45-
}
46-
.border(1.dp, Color.Red)) {
47-
}
48-
}
49-
5039
class MainActivity : ComponentActivity() {
5140
override fun onCreate(savedInstanceState: Bundle?) {
5241
super.onCreate(savedInstanceState)

build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
plugins {
3-
id 'com.android.application' version '8.0.2' apply false
4-
id 'com.android.library' version '8.0.2' apply false
3+
id 'com.android.application' version '8.1.0' apply false
4+
id 'com.android.library' version '8.1.0' apply false
55
id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
6-
}
6+
}

library/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ publishing {
6767
release(MavenPublication) {
6868
groupId = 'com.github.obsidianx'
6969
artifactId = 'chakra'
70-
version = '0.2.6'
70+
version = '0.2.7'
7171

7272
afterEvaluate {
7373
from components.release

library/src/main/java/net/obsidianx/chakra/Flexbox.kt

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import androidx.compose.runtime.getValue
77
import androidx.compose.runtime.remember
88
import androidx.compose.runtime.rememberUpdatedState
99
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.UiComposable
1011
import androidx.compose.ui.layout.MultiMeasureLayout
1112
import androidx.compose.ui.layout.layout
1213
import androidx.compose.ui.platform.LocalContext
14+
import androidx.compose.ui.platform.inspectable
1315
import androidx.compose.ui.unit.Constraints
1416
import androidx.compose.ui.util.fastForEach
1517
import androidx.compose.ui.util.fastForEachIndexed
@@ -28,6 +30,7 @@ import net.obsidianx.chakra.layout.asFloatOrZero
2830
import net.obsidianx.chakra.layout.getConstraints
2931
import net.obsidianx.chakra.layout.horizontalGap
3032
import net.obsidianx.chakra.layout.horizontalPadding
33+
import net.obsidianx.chakra.layout.isContainer
3134
import net.obsidianx.chakra.layout.isSet
3235
import net.obsidianx.chakra.layout.measureNode
3336
import net.obsidianx.chakra.layout.removeAllChildren
@@ -40,9 +43,9 @@ import kotlin.math.max
4043
import kotlin.math.roundToInt
4144

4245
@Composable
43-
fun FlexboxScope.Flexbox(
46+
inline fun FlexboxScope.Flexbox(
4447
modifier: Modifier = Modifier,
45-
content: @Composable FlexboxScope.() -> Unit = {}
48+
crossinline content: @Composable FlexboxScope.() -> Unit = {}
4649
) {
4750
Flexbox(
4851
modifier = modifier,
@@ -52,6 +55,7 @@ fun FlexboxScope.Flexbox(
5255

5356
@SuppressLint("RememberReturnType")
5457
@Composable
58+
@UiComposable
5559
fun Flexbox(
5660
modifier: Modifier = Modifier,
5761
parentLayoutState: FlexLayoutState? = null,
@@ -119,7 +123,7 @@ fun Flexbox(
119123
val placeable = measurable.measure(constraints)
120124
layout(placeable.measuredWidth, placeable.measuredHeight) {
121125
log("[Layout] Place [${layoutNode?.layoutWidth}, ${layoutNode?.layoutHeight}]@(${layoutNode?.layoutX}, ${layoutNode?.layoutY})")
122-
placeable.placeRelative(0, 0)
126+
placeable.place(0, 0)
123127
}
124128
},
125129
content = {
@@ -273,17 +277,16 @@ fun Flexbox(
273277
return@mapIndexed measurable.measure(Constraints())
274278
}
275279
val childNode = node.getChildAt(index)
276-
val isContainer = childNode.childCount > 0
277280

278281
val paddingStart = ceil(childNode.getLayoutPadding(YogaEdge.START))
279282
val paddingTop = ceil(childNode.getLayoutPadding(YogaEdge.TOP))
280283
val paddingEnd = ceil(childNode.getLayoutPadding(YogaEdge.END))
281284
val paddingBottom = ceil(childNode.getLayoutPadding(YogaEdge.BOTTOM))
282285

283286
val verticalPadding =
284-
(paddingTop + paddingBottom).takeIf { !isContainer } ?: 0f
287+
(paddingTop + paddingBottom).takeIf { !childNode.isContainer } ?: 0f
285288
val horizontalPadding =
286-
(paddingStart + paddingEnd).takeIf { !isContainer } ?: 0f
289+
(paddingStart + paddingEnd).takeIf { !childNode.isContainer } ?: 0f
287290

288291
val childWidth =
289292
(childNode.layoutWidth - horizontalPadding)
@@ -312,12 +315,11 @@ fun Flexbox(
312315
return@fastForEachIndexed
313316
}
314317
val childNode = node.getChildAt(index)
315-
val isContainer = childNode.childCount > 0
316318

317319
val paddingStart =
318-
childNode.getLayoutPadding(YogaEdge.START).takeIf { !isContainer } ?: 0f
320+
childNode.getLayoutPadding(YogaEdge.START).takeIf { !childNode.isContainer } ?: 0f
319321
val paddingTop =
320-
childNode.getLayoutPadding(YogaEdge.TOP).takeIf { !isContainer } ?: 0f
322+
childNode.getLayoutPadding(YogaEdge.TOP).takeIf { !childNode.isContainer } ?: 0f
321323

322324
val nodeX =
323325
(childNode.layoutX + paddingStart).coerceAtLeast(layoutPadStart).roundToInt()

library/src/main/java/net/obsidianx/chakra/layout/YogaExtensions.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.facebook.yoga.YogaGutter
88
import com.facebook.yoga.YogaNode
99
import com.facebook.yoga.YogaUnit
1010
import com.facebook.yoga.YogaValue
11+
import net.obsidianx.chakra.types.FlexNodeData
1112

1213
internal val YogaValue.isSet
1314
get() = unit == YogaUnit.PERCENT || unit == YogaUnit.POINT
@@ -88,3 +89,6 @@ internal val YogaNode.horizontalGap: Float
8889
internal val YogaNode.verticalGap: Float
8990
get() = getGap(YogaGutter.ALL).takeUnless { it.isNaN() }
9091
?: getGap(YogaGutter.ROW).takeUnless { it.isNaN() } ?: 0f
92+
93+
internal val YogaNode.isContainer: Boolean
94+
get() = (data as? FlexNodeData)?.isContainer == true

library/src/main/java/net/obsidianx/chakra/modifiers/FlexModifiers.kt

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,23 @@ fun FlexboxStyleScope.gap(all: Dp? = null, horizontal: Dp? = null, vertical: Dp?
5454
if (listOf(all, horizontal, vertical).count { it != null } > 1) {
5555
throw IllegalArgumentException("Only set one kind of gap in FlexboxStyleScope.gap")
5656
}
57-
val gutter = when {
58-
vertical != null -> FlexGutter.Row
59-
horizontal != null -> FlexGutter.Column
60-
else -> FlexGutter.All
57+
val gutter: FlexGutter
58+
val value: Float
59+
when {
60+
vertical != null -> {
61+
gutter = FlexGutter.Row
62+
value = vertical.value
63+
}
64+
65+
horizontal != null -> {
66+
gutter = FlexGutter.Column
67+
value = horizontal.value
68+
}
69+
70+
else -> {
71+
gutter = FlexGutter.All
72+
value = all?.value ?: 0f
73+
}
6174
}
62-
nodeData.style.gap = FlexGap(gutter, (all?.value ?: 0f) * density.density)
75+
nodeData.style.gap = FlexGap(gutter, value * density.density)
6376
}

library/src/main/java/net/obsidianx/chakra/modifiers/FlexboxModifier.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ fun Modifier.flex(block: FlexboxStyleScope.() -> Unit = {}) =
3535
)
3636
}
3737

38-
internal fun Modifier.flexContainer() = flex {
38+
fun Modifier.flexContainer() = flex {
3939
nodeData.isContainer = true
4040
}

0 commit comments

Comments
 (0)