Merge branch '1.21' into new-container-api

This commit is contained in:
DBotThePony 2025-03-21 18:18:18 +07:00
commit f16b003cdf
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 47 additions and 14 deletions

View File

@ -281,11 +281,13 @@ open class EditablePanel<out S : Screen>(
if (visibleChildrenParent?.contains(this) == false) { if (visibleChildrenParent?.contains(this) == false) {
visibleChildrenParent.add(this) visibleChildrenParent.add(this)
parent?.invalidateChildrenSorting()
parent?.layoutInvalidated = true parent?.layoutInvalidated = true
} }
} else { } else {
if (visibleChildrenParent?.contains(this) == true) { if (visibleChildrenParent?.contains(this) == true) {
visibleChildrenParent.remove(this) visibleChildrenParent.remove(this)
parent?.invalidateChildrenSorting()
parent?.layoutInvalidated = true parent?.layoutInvalidated = true
} }
} }
@ -1451,6 +1453,7 @@ open class EditablePanel<out S : Screen>(
if (old != new) { if (old != new) {
child.visibilityChanges(new, old) child.visibilityChanges(new, old)
child.invalidateChildrenSorting()
} }
child.updateVisible() child.updateVisible()

View File

@ -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.client.screen.panels.slot.AbstractSlotPanel
import ru.dbotthepony.mc.otm.core.collect.filter import ru.dbotthepony.mc.otm.core.collect.filter
import ru.dbotthepony.mc.otm.core.collect.maybe import ru.dbotthepony.mc.otm.core.collect.maybe
import java.util.stream.IntStream
import java.util.stream.Stream
import kotlin.math.max import kotlin.math.max
open class GridPanel<out S : Screen>( open class GridPanel<out S : Screen>(
@ -51,6 +53,14 @@ open class GridPanel<out S : Screen>(
} }
} }
var columnMajorOrder = false
set(value) {
if (field != value) {
field = value
invalidateLayout()
}
}
enum class Layout { enum class Layout {
TOP_LEFT { TOP_LEFT {
override fun get( override fun get(
@ -58,9 +68,14 @@ open class GridPanel<out S : Screen>(
row: Int, row: Int,
column: Int, column: Int,
rows: Int, rows: Int,
columns: Int columns: Int,
columnMajorOrder: Boolean
): EditablePanel<*>? { ): 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<out S : Screen>(
row: Int, row: Int,
column: Int, column: Int,
rows: Int, rows: Int,
columns: Int columns: Int,
columnMajorOrder: Boolean
): EditablePanel<*>? { ): 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<out S : Screen>(
row: Int, row: Int,
column: Int, column: Int,
rows: Int, rows: Int,
columns: Int columns: Int,
columnMajorOrder: Boolean
): EditablePanel<*>? { ): 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<out S : Screen>(
row: Int, row: Int,
column: Int, column: Int,
rows: Int, rows: Int,
columns: Int columns: Int,
columnMajorOrder: Boolean
): EditablePanel<*>? { ): 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<EditablePanel<*>>, row: Int, column: Int, rows: Int, columns: Int): EditablePanel<*>? abstract fun get(list: List<EditablePanel<*>>, row: Int, column: Int, rows: Int, columns: Int, columnMajorOrder: Boolean): EditablePanel<*>?
} }
override fun sizeToContents() { override fun sizeToContents() {
@ -114,14 +144,14 @@ open class GridPanel<out S : Screen>(
var width = 0f var width = 0f
var height = 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) { for (row in 0 until rows) {
var maxHeight = 0f var maxHeight = 0f
var rowWidth = 0f var rowWidth = 0f
for (column in 0 until columns) { 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 rowWidth += nextChild.width + nextChild.dockMargin.horizontal
maxHeight = max(maxHeight, nextChild.height + nextChild.dockMargin.vertical) maxHeight = max(maxHeight, nextChild.height + nextChild.dockMargin.vertical)
} }
@ -136,7 +166,7 @@ open class GridPanel<out S : Screen>(
override fun performLayout() { override fun performLayout() {
super.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 totalWidth = 0f
var totalHeight = 0f var totalHeight = 0f
@ -146,7 +176,7 @@ open class GridPanel<out S : Screen>(
var width = 0f var width = 0f
for (column in 0 until columns) { 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 width += child.dockedWidth
maxHeight = maxHeight.coerceAtLeast(child.dockedHeight) maxHeight = maxHeight.coerceAtLeast(child.dockedHeight)
} }
@ -166,7 +196,7 @@ open class GridPanel<out S : Screen>(
var width = 0f var width = 0f
for (column in 0 until columns) { 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.x = alignX + width
child.y = alignY + totalHeight child.y = alignY + totalHeight
width += child.dockedWidth width += child.dockedWidth