Dock children in one pass, to match gmod api (and fix docking issues)

This commit is contained in:
DBotThePony 2021-08-24 12:01:19 +07:00
parent 002b335f47
commit 5d4842701e
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -634,54 +634,31 @@ public class EditablePanel implements GuiEventListener {
var dock_top = dock_padding.top;
var dock_bottom = dock_padding.bottom;
// determine sizes
for (var child : children) {
if (child.getVisible()) {
switch (child.dock) {
case TOP -> dock_top += child.height + child.dock_margin.top;
case BOTTOM -> dock_bottom += child.height + child.dock_margin.bottom;
case LEFT -> dock_left += child.width + child.dock_margin.left;
case RIGHT -> dock_right += child.width + child.dock_margin.right;
}
bound_x = Math.min(bound_x, child.x);
bound_y = Math.min(bound_y, child.y);
bound_width = Math.max(bound_width, child.x + child.width);
bound_height = Math.max(bound_height, child.y + child.height);
}
}
var dock_left2 = dock_padding.left;
var dock_right2 = dock_padding.right;
var dock_top2 = dock_padding.top;
var dock_bottom2 = dock_padding.bottom;
// apply values
for (var child : children) {
if (child.getVisible()) {
switch (child.dock) {
case TOP -> {
child.setPos(dock_left + child.dock_margin.left, dock_top2 + child.dock_margin.top);
dock_top2 += child.height + child.dock_margin.top + child.dock_margin.bottom;
child.setPos(dock_left + child.dock_margin.left, dock_top + child.dock_margin.top);
dock_top += child.height + child.dock_margin.top + child.dock_margin.bottom;
child.setWidth(Math.max(1, width - dock_left - dock_right - child.dock_margin.left - child.dock_margin.right));
}
case BOTTOM -> {
child.setPos(dock_left + child.dock_margin.left, height - dock_bottom2 - child.height - child.dock_margin.bottom);
dock_bottom2 += child.height + child.dock_margin.top + child.dock_margin.bottom;
child.setPos(dock_left + child.dock_margin.left, height - dock_bottom - child.height - child.dock_margin.bottom);
dock_bottom += child.height + child.dock_margin.top + child.dock_margin.bottom;
child.setWidth(Math.max(1, width - dock_left - dock_right - child.dock_margin.left - child.dock_margin.right));
}
case LEFT -> {
child.setPos(dock_left2 + child.dock_margin.left, dock_top + child.dock_margin.top);
dock_left2 += child.width + child.dock_margin.left + child.dock_margin.right;
child.setPos(dock_left + child.dock_margin.left, dock_top + child.dock_margin.top);
dock_left += child.width + child.dock_margin.left + child.dock_margin.right;
child.setHeight(Math.max(1, height - dock_top - dock_bottom - child.dock_margin.top - child.dock_margin.bottom));
}
case RIGHT -> {
child.setPos(width - dock_right2 - child.width - child.dock_margin.right, dock_top + child.dock_margin.top);
dock_right2 += child.width + child.dock_margin.left + child.dock_margin.right;
child.setPos(width - dock_right - child.width - child.dock_margin.right, dock_top + child.dock_margin.top);
dock_right += child.width + child.dock_margin.left + child.dock_margin.right;
child.setHeight(Math.max(1, height - dock_top - dock_bottom - child.dock_margin.top - child.dock_margin.bottom));
}
}
@ -692,10 +669,10 @@ public class EditablePanel implements GuiEventListener {
if (child.getVisible()) {
if (child.dock == Dock.FILL) {
child.setDimensions(
dock_left2 + child.dock_margin.left,
dock_top2 + child.dock_margin.top,
width - child.dock_margin.left - child.dock_margin.right - dock_right2 - dock_left2,
height - child.dock_margin.bottom - child.dock_margin.top - dock_bottom2 - dock_top2);
dock_left + child.dock_margin.left,
dock_top + child.dock_margin.top,
width - child.dock_margin.left - child.dock_margin.right - dock_right - dock_left,
height - child.dock_margin.bottom - child.dock_margin.top - dock_bottom - dock_top);
}
}
}