GridLayout: columns

This commit is contained in:
Bixilon 2021-09-09 21:14:46 +02:00
parent 5fed1600eb
commit dcb8a05cb5
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 46 additions and 9 deletions

View File

@ -20,6 +20,7 @@ import de.bixilon.minosoft.gui.rendering.gui.hud.HUDRenderer
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
import de.bixilon.minosoft.gui.rendering.util.vec.Vec4Util.offset
import glm_.vec2.Vec2i
import java.lang.Integer.min
import kotlin.math.max
class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Layout(hudRenderer) {
@ -30,6 +31,8 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Layout(hudRenderer
private var columnStart = IntArray(grid.x)
private var rowStart = IntArray(grid.y)
operator fun set(position: Vec2i, element: Element) = add(position, element)
fun add(position: Vec2i, element: Element) {
children[position.x][position.y]?.parent = null
@ -51,6 +54,7 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Layout(hudRenderer
override fun silentApply() {
// ToDo: This works with columns, but rows are not yet implemented
/*
Calculate new grid layout (sizes) with the new size of the child
@ -65,18 +69,52 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Layout(hudRenderer
for (x in 0 until grid.x) {
for (y in 0 until grid.y) {
val child = children[x][y] ?: continue
width[x] = max(width[x], child.prefSize.x)
width[x] = min(max(width[x], child.prefSize.x), columnConstraints[x].maxWidth)
}
}
var alwaysGrowColumns = 0
// Set the NEVER growing widths
var availableWidth = maxSize.x
for (x in 0 until grid.x) {
columnConstraints[x].width = width[x]
val constraint = columnConstraints[x]
val nextAvailable = availableWidth - width[x]
if (constraint.grow == GridGrow.ALWAYS) {
alwaysGrowColumns++
}
if (constraint.grow != GridGrow.NEVER) {
continue
}
if (availableWidth != 0) {
if (nextAvailable < 0) {
constraint.width = availableWidth
availableWidth = 0
} else {
constraint.width = width[x]
availableWidth -= width[x]
}
}
}
// set ALWAYS growing widths (and split them)
var remainingAlwaysGrowColumns = alwaysGrowColumns
if (alwaysGrowColumns > 0) {
for (x in 0 until grid.x) {
val constraint = columnConstraints[x]
if (constraint.grow != GridGrow.ALWAYS) {
continue
}
val widthFraction = availableWidth / remainingAlwaysGrowColumns--
constraint.width = min(widthFraction, constraint.maxWidth)
availableWidth -= constraint.width
}
}
// apply the size changes to all children
applyOnlyChildren()
// ToDo: Respect maxSize?
val columnStart = IntArray(grid.x)
// set the start offsets
for (x in 1 until grid.x) {
@ -86,7 +124,7 @@ class GridLayout(hudRenderer: HUDRenderer, val grid: Vec2i) : Layout(hudRenderer
}
this.columnStart = columnStart
// ToDo: Set size
size = Vec2i(width.sum(), 0)
}
override fun apply() {

View File

@ -50,15 +50,13 @@ class DebugHUD(val hudRenderer: HUDRenderer) : HUD<GridLayout> {
override fun init() {
val left = initLeft()
val right = initRight()
layout.add(Vec2i(0, 0), left)
layout.add(Vec2i(2, 0), right)
layout[Vec2i(0, 0)] = initLeft()
layout[Vec2i(2, 0)] = initRight()
}
private fun initLeft(): Element {
val layout = RowLayout(hudRenderer)
// ToDo: layout.margin = Vec4i(5)
layout += TextElement(hudRenderer, TextComponent(RunConfiguration.VERSION_STRING, ChatColors.RED))
layout += AutoTextElement(hudRenderer, 1) { "FPS ${renderWindow.renderStats.smoothAvgFPS.round10}" }
renderWindow[WorldRenderer]?.apply {
@ -83,7 +81,8 @@ class DebugHUD(val hudRenderer: HUDRenderer) : HUD<GridLayout> {
private fun initRight(): Element {
val layout = RowLayout(hudRenderer, ElementAlignments.RIGHT)
layout += TextElement(hudRenderer, "Java\n${Runtime.version()} ${System.getProperty("sun.arch.data.model")}bit", ElementAlignments.RIGHT)
// ToDo: layout.margin = Vec4i(5)
layout += TextElement(hudRenderer, "Java\n${Runtime.version()} ${System.getProperty("sun.arch.data.model")}bit", ElementAlignments.RIGHT) // ToDo: Remove \n
layout += LineSpacerElement(hudRenderer)