Add panel children sorting

This commit is contained in:
DBotThePony 2023-07-15 19:38:53 +07:00
parent c71a1ab0d6
commit d855234808
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 55 additions and 14 deletions

View File

@ -65,15 +65,15 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
float min_width = getWidth(); float min_width = getWidth();
// "финальная" ширина этой панели // "финальная" ширина этой панели
float this_width = getWidth() - getDockPadding().left() - getDockPadding().right(); float this_width = getWidth() - getDockPadding().getLeft() - getDockPadding().getRight();
if (this_width <= 0) { if (this_width <= 0) {
return; return;
} }
for (var child : children) { for (var child : children) {
min_width = Math.min(min_width, child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right()); min_width = Math.min(min_width, child.getWidth() + child.getDockMargin().getLeft() + child.getDockMargin().getRight());
desired_width += child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right(); desired_width += child.getWidth() + child.getDockMargin().getLeft() + child.getDockMargin().getRight();
} }
int rows = 1; int rows = 1;
@ -108,7 +108,7 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
for (int i = index; i < children.size(); i++) { for (int i = index; i < children.size(); i++) {
var child = children.get(i); var child = children.get(i);
var gain_width = child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right(); var gain_width = child.getWidth() + child.getDockMargin().getLeft() + child.getDockMargin().getRight();
index = i; index = i;
@ -121,7 +121,7 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
break; break;
} }
max_height = Math.max(max_height, child.getHeight() + child.getDockMargin().top() + child.getDockMargin().bottom()); max_height = Math.max(max_height, child.getHeight() + child.getDockMargin().getTop() + child.getDockMargin().getBottom());
total_width += gain_width; total_width += gain_width;
} }
@ -142,7 +142,7 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
this_width /= 2; this_width /= 2;
// определение точки по середине по высоте // определение точки по середине по высоте
float h_middle = (getHeight() - getDockPadding().bottom() - getDockPadding().top() - total_height) / 2; float h_middle = (getHeight() - getDockPadding().getBottom() - getDockPadding().getTop() - total_height) / 2;
// OverdriveThatMatters.LOGGER.info("Общая высота {}, рядов {}, середина {}", total_height, rows, h_middle); // OverdriveThatMatters.LOGGER.info("Общая высота {}, рядов {}, середина {}", total_height, rows, h_middle);
@ -154,7 +154,7 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
for (int i = index; i < children.size(); i++) { for (int i = index; i < children.size(); i++) {
var child = children.get(i); var child = children.get(i);
var gain_width = child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right(); var gain_width = child.getWidth() + child.getDockMargin().getLeft() + child.getDockMargin().getRight();
until = i; until = i;
@ -162,7 +162,7 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
break; break;
} }
max_height = Math.max(max_height, child.getHeight() + child.getDockMargin().top() + child.getDockMargin().bottom()); max_height = Math.max(max_height, child.getHeight() + child.getDockMargin().getTop() + child.getDockMargin().getBottom());
total_width += gain_width; total_width += gain_width;
} }
@ -176,8 +176,8 @@ public class FlexGridPanel<S extends Screen> extends EditablePanel<S> {
for (int i = index; i <= until; i++) { for (int i = index; i <= until; i++) {
var child = children.get(i); var child = children.get(i);
child.setPos((int) (this_width - total_width + accumulate_width + child.getDockMargin().left()), (int) (h_middle + max_height - child.getHeight() / 2)); child.setPos((int) (this_width - total_width + accumulate_width + child.getDockMargin().getLeft()), (int) (h_middle + max_height - child.getHeight() / 2));
accumulate_width += child.getWidth() + child.getDockMargin().left() + child.getDockMargin().right(); accumulate_width += child.getWidth() + child.getDockMargin().getLeft() + child.getDockMargin().getRight();
} }
h_middle += max_height * 2; h_middle += max_height * 2;

View File

@ -29,11 +29,9 @@ import java.util.*
import kotlin.collections.ArrayList import kotlin.collections.ArrayList
import kotlin.math.roundToInt import kotlin.math.roundToInt
@JvmRecord
data class ScreenPos(val x: Float, val y: Float) data class ScreenPos(val x: Float, val y: Float)
@JvmRecord data class DockProperty(val left: Float = 0f, val top: Float = 0f, val right: Float = 0f, val bottom: Float = 0f) {
data class DockProperty @JvmOverloads constructor(val left: Float = 0f, val top: Float = 0f, val right: Float = 0f, val bottom: Float = 0f) {
val isEmpty get() = left == 0f && right == 0f && top == 0f && bottom == 0f val isEmpty get() = left == 0f && right == 0f && top == 0f && bottom == 0f
companion object { companion object {
@ -73,7 +71,7 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
width: Float = 10f, width: Float = 10f,
height: Float = 10f, height: Float = 10f,
) { ) : Comparable<EditablePanel<*>> {
// layout engine does not support navigation using keyboard // layout engine does not support navigation using keyboard
// fuck off // fuck off
val listener: GuiEventListener = object : GuiEventListener { val listener: GuiEventListener = object : GuiEventListener {
@ -140,6 +138,18 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
} }
} }
var childrenOrder = 0
set(value) {
if (field != value) {
field = value
parent?.sortChildren()
}
}
override fun compareTo(other: EditablePanel<*>): Int {
return childrenOrder.compareTo(other.childrenOrder)
}
var parent: EditablePanel<*>? = null var parent: EditablePanel<*>? = null
set(value) { set(value) {
if (field === value) if (field === value)
@ -670,9 +680,17 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
this.parent = parent this.parent = parent
} }
var childrenSortingInvalidated = false
private set
fun invalidateChildrenSorting() {
childrenSortingInvalidated = true
}
private fun onParent(child: EditablePanel<*>) { private fun onParent(child: EditablePanel<*>) {
if (childrenInternal.contains(child)) throw IllegalStateException("Already containing $child") if (childrenInternal.contains(child)) throw IllegalStateException("Already containing $child")
childrenInternal.add(child) childrenInternal.add(child)
invalidateChildrenSorting()
if (child.visible) { if (child.visible) {
visibleChildrenInternal.add(child) visibleChildrenInternal.add(child)
@ -691,6 +709,7 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
val indexOf = childrenInternal.indexOf(child) val indexOf = childrenInternal.indexOf(child)
if (indexOf == -1) throw IllegalStateException("Already not containing $child") if (indexOf == -1) throw IllegalStateException("Already not containing $child")
childrenInternal.removeAt(indexOf) childrenInternal.removeAt(indexOf)
invalidateChildrenSorting()
if (child.visible) { if (child.visible) {
visibleChildrenInternal.remove(child) visibleChildrenInternal.remove(child)
@ -702,6 +721,18 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
} }
} }
private fun sortChildren() {
childrenSortingInvalidated = false
childrenInternal.sort()
val old = ArrayList(visibleChildrenInternal)
visibleChildrenInternal.sort()
if (old != visibleChildrenInternal) {
invalidateLayout()
}
}
protected open fun innerRender(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float) {} protected open fun innerRender(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float) {}
protected open fun innerRenderPost(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float) {} protected open fun innerRenderPost(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float) {}
protected open fun innerRenderTooltips(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean { protected open fun innerRenderTooltips(graphics: GuiGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean {
@ -731,6 +762,9 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
} }
fun performLayoutIfNeeded() { fun performLayoutIfNeeded() {
if (childrenSortingInvalidated)
sortChildren()
if (layoutInvalidated) { if (layoutInvalidated) {
performLayout() performLayout()
} else if (boundsInvalidated) { } else if (boundsInvalidated) {
@ -1267,7 +1301,14 @@ open class EditablePanel<out S : Screen> @JvmOverloads constructor(
return findHierarchicalFocus() != null return findHierarchicalFocus() != null
} }
/**
* Called when [hasFocusedChildren] changes
*/
protected open fun onHierarchicalFocusChanged() {} protected open fun onHierarchicalFocusChanged() {}
/**
* Called when [isFocusedThis] changes
*/
protected open fun onFocusChanged() {} protected open fun onFocusChanged() {}
fun isEverFocused(): Boolean { fun isEverFocused(): Boolean {