From a2d9f43a2e8f5a030264425b0062ce56361cb322 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 21 Mar 2025 18:17:50 +0700 Subject: [PATCH] Fix grid panel layouts, introduce column major order --- .../client/screen/panels/util/GridPanel.kt | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/GridPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/GridPanel.kt index 008634fac..28b32a5fd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/GridPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/util/GridPanel.kt @@ -7,6 +7,8 @@ import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.maybe +import java.util.stream.IntStream +import java.util.stream.Stream import kotlin.math.max open class GridPanel( @@ -51,6 +53,14 @@ open class GridPanel( } } + var columnMajorOrder = false + set(value) { + if (field != value) { + field = value + invalidateLayout() + } + } + enum class Layout { TOP_LEFT { override fun get( @@ -58,9 +68,14 @@ open class GridPanel( row: Int, column: Int, rows: Int, - columns: Int + columns: Int, + columnMajorOrder: Boolean ): EditablePanel<*>? { - return list.getOrNull(column + row * columns) + if (columnMajorOrder) { + return list.getOrNull(row + column * rows) + } else { + return list.getOrNull(column + row * columns) + } } }, @@ -70,9 +85,14 @@ open class GridPanel( row: Int, column: Int, rows: Int, - columns: Int + columns: Int, + columnMajorOrder: Boolean ): EditablePanel<*>? { - return list.getOrNull((columns - column - 1) + row * columns) + if (columnMajorOrder) { + return list.getOrNull(row + (columns - column - 1) * rows) + } else { + return list.getOrNull((columns - column - 1) + row * columns) + } } }, @@ -82,9 +102,14 @@ open class GridPanel( row: Int, column: Int, rows: Int, - columns: Int + columns: Int, + columnMajorOrder: Boolean ): EditablePanel<*>? { - return list.getOrNull(column + (rows - row - 1) * columns) + if (columnMajorOrder) { + return list.getOrNull((rows - row - 1) + column * rows) + } else { + return list.getOrNull(column + (rows - row - 1) * columns) + } } }, @@ -94,13 +119,18 @@ open class GridPanel( row: Int, column: Int, rows: Int, - columns: Int + columns: Int, + columnMajorOrder: Boolean ): EditablePanel<*>? { - return list.getOrNull((columns - column - 1) + (rows - row - 1) * columns) + if (columnMajorOrder) { + return list.getOrNull((rows - row - 1) + (columns - column - 1) * rows) + } else { + return list.getOrNull((columns - column - 1) + (rows - row - 1) * columns) + } } }; - abstract fun get(list: List>, row: Int, column: Int, rows: Int, columns: Int): EditablePanel<*>? + abstract fun get(list: List>, row: Int, column: Int, rows: Int, columns: Int, columnMajorOrder: Boolean): EditablePanel<*>? } override fun sizeToContents() { @@ -114,14 +144,14 @@ open class GridPanel( var width = 0f var height = 0f - val children = visibleChildren.iterator().filter { it.dock == Dock.NONE } + val children = visibleChildren.filter { it.dock == Dock.NONE } for (row in 0 until rows) { var maxHeight = 0f var rowWidth = 0f for (column in 0 until columns) { - val nextChild = children.maybe() ?: break + val nextChild = layout.get(children, row, column, rows, columns, columnMajorOrder) ?: continue rowWidth += nextChild.width + nextChild.dockMargin.horizontal maxHeight = max(maxHeight, nextChild.height + nextChild.dockMargin.vertical) } @@ -136,7 +166,7 @@ open class GridPanel( override fun performLayout() { super.performLayout() - val children = visibleChildren.stream().filter { it.dock == Dock.NONE }.toList() + val children = visibleChildren.filter { it.dock == Dock.NONE } var totalWidth = 0f var totalHeight = 0f @@ -146,7 +176,7 @@ open class GridPanel( var width = 0f for (column in 0 until columns) { - val child = layout.get(children, row, column, rows, columns) ?: continue + val child = layout.get(children, row, column, rows, columns, columnMajorOrder) ?: continue width += child.dockedWidth maxHeight = maxHeight.coerceAtLeast(child.dockedHeight) } @@ -166,7 +196,7 @@ open class GridPanel( var width = 0f for (column in 0 until columns) { - val child = layout.get(children, row, column, rows, columns) ?: continue + val child = layout.get(children, row, column, rows, columns, columnMajorOrder) ?: continue child.x = alignX + width child.y = alignY + totalHeight width += child.dockedWidth