diff --git a/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt b/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt index c5b1281..b279619 100644 --- a/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt +++ b/src/main/kotlin/net/shadowfacts/asmr/TestCacaoScreen.kt @@ -20,7 +20,7 @@ class TestCacaoScreen: CacaoScreen() { init { addWindow(Window().apply { - val stack = addView(StackView(Axis.VERTICAL, StackView.Distribution.CENTER).apply { + val stack = addView(StackView(Axis.VERTICAL, StackView.Distribution.CENTER, spacing = 4.0).apply { backgroundColor = Color.WHITE }) val red = stack.addArrangedSubview(TextureView(Texture(Identifier("textures/block/birch_log_top.png"), 0, 0, 16, 16)).apply { diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt b/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt index 0fe7bf3..83b9cda 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/DialogView.kt @@ -42,13 +42,13 @@ class DialogView( override fun wasAdded() { background = addSubview(NinePatchView(NinePatchTexture.PANEL_BG).apply { zIndex = -1.0 }) - hStack = addSubview(StackView(Axis.HORIZONTAL, StackView.Distribution.LEADING)) + hStack = addSubview(StackView(Axis.HORIZONTAL, StackView.Distribution.LEADING, spacing = 8.0)) if (iconTexture != null) { iconView = hStack.addArrangedSubview(TextureView(iconTexture)) } - vStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL)) + vStack = hStack.addArrangedSubview(StackView(Axis.VERTICAL, spacing = 4.0)) vStack.addArrangedSubview(Label(ChatFormat.BOLD.toString() + title, shadow = false).apply { textColor = Color(0x404040) @@ -79,7 +79,7 @@ class DialogView( centerXAnchor equalTo window.centerXAnchor centerYAnchor equalTo window.centerYAnchor - widthAnchor greaterThanOrEqualTo 150 + widthAnchor greaterThanOrEqualTo 175 background.leftAnchor equalTo leftAnchor - 8 background.rightAnchor equalTo rightAnchor + 8 diff --git a/src/main/kotlin/net/shadowfacts/cacao/view/StackView.kt b/src/main/kotlin/net/shadowfacts/cacao/view/StackView.kt index ce27be9..12a55ed 100644 --- a/src/main/kotlin/net/shadowfacts/cacao/view/StackView.kt +++ b/src/main/kotlin/net/shadowfacts/cacao/view/StackView.kt @@ -19,7 +19,11 @@ import java.util.* * @param distribution The mode by which this stack lays out its children along the axis perpendicular to the * primary [axis]. */ -class StackView(val axis: Axis, val distribution: Distribution = Distribution.FILL): View() { +class StackView( + val axis: Axis, + val distribution: Distribution = Distribution.FILL, + val spacing: Double = 0.0 +): View() { // the internal mutable, list of arranged subviews private val _arrangedSubviews = LinkedList() @@ -75,10 +79,10 @@ class StackView(val axis: Axis, val distribution: Distribution = Distribution.FI val previous = arrangedSubviews.getOrNull(index - 1) val next = arrangedSubviews.getOrNull(index + 1) if (next != null) { - arrangedSubviewConnections.add(index, anchor(TRAILING, view) equalTo anchor(LEADING, next)) + arrangedSubviewConnections.add(index, anchor(TRAILING, view) equalTo (anchor(LEADING, next) + spacing)) } if (previous != null) { - arrangedSubviewConnections.add(index - 1, anchor(TRAILING, previous) equalTo anchor(LEADING, view)) + arrangedSubviewConnections.add(index - 1, anchor(TRAILING, previous) equalTo (anchor(LEADING, view) - spacing)) } } } diff --git a/src/test/kotlin/net/shadowfacts/cacao/view/StackViewLayoutTests.kt b/src/test/kotlin/net/shadowfacts/cacao/view/StackViewLayoutTests.kt index b373cb7..ba79425 100644 --- a/src/test/kotlin/net/shadowfacts/cacao/view/StackViewLayoutTests.kt +++ b/src/test/kotlin/net/shadowfacts/cacao/view/StackViewLayoutTests.kt @@ -191,4 +191,57 @@ class StackViewLayoutTests { assertEquals(100.0, three.rightAnchor.value) } + @Test + fun testVerticalLayoutWithSpacing() { + val stack = window.addView(StackView(Axis.VERTICAL, spacing = 10.0)) + val one = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(50.0, 50.0) + }) + val two = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(75.0, 75.0) + }) + val three = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(50.0, 50.0) + }) + window.solver.dsl { + stack.topAnchor equalTo 0 + } + window.layout() + + assertEquals(0.0, abs(one.topAnchor.value)) // sometimes -0.0, which fails the assertion but is actually ok + assertEquals(50.0, one.bottomAnchor.value) + assertEquals(60.0, two.topAnchor.value) + assertEquals(135.0, two.bottomAnchor.value) + assertEquals(145.0, three.topAnchor.value) + assertEquals(195.0, three.bottomAnchor.value) + + assertEquals(195.0, stack.heightAnchor.value) + } + + @Test + fun testHorizontalLayoutWithSpacing() { + val stack = window.addView(StackView(Axis.HORIZONTAL, spacing = 10.0)) + val one = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(50.0, 50.0) + }) + val two = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(75.0, 75.0) + }) + val three = stack.addArrangedSubview(View().apply { + intrinsicContentSize = Size(50.0, 50.0) + }) + window.solver.dsl { + stack.leftAnchor equalTo 0 + } + window.layout() + + assertEquals(0.0, abs(one.leftAnchor.value)) // sometimes -0.0, which fails the assertion but is actually ok + assertEquals(50.0, one.rightAnchor.value) + assertEquals(60.0, two.leftAnchor.value) + assertEquals(135.0, two.rightAnchor.value) + assertEquals(145.0, three.leftAnchor.value) + assertEquals(195.0, three.rightAnchor.value) + + assertEquals(195.0, stack.widthAnchor.value) + } } \ No newline at end of file