Add panel children sorting
This commit is contained in:
parent
c71a1ab0d6
commit
d855234808
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user