Add non-strict mode to offset renderer so containers don't limit higher layers
This commit is contained in:
@@ -39,10 +39,44 @@ public class OffsetGuiRenderer implements GuiRenderer {
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final ReadableDimension size;
|
private final ReadableDimension size;
|
||||||
|
|
||||||
|
private final boolean strict;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new strict offset gui renderer with the same settings as the supplied one.
|
||||||
|
* @see #OffsetGuiRenderer(GuiRenderer, ReadablePoint, ReadableDimension, boolean)
|
||||||
|
* @param renderer The renderer to copy from
|
||||||
|
*/
|
||||||
|
public OffsetGuiRenderer(OffsetGuiRenderer renderer) {
|
||||||
|
this(renderer.renderer, renderer.position, renderer.size, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent
|
||||||
|
* renderer with coordinates offset by the specified position.
|
||||||
|
* This also ensures that drawing happens within the specified bounds.
|
||||||
|
* @param renderer The parent renderer
|
||||||
|
* @param position The position of this renderer within the parent (used as is, not copied)
|
||||||
|
* @param size The size of the drawable area (used as is, not copied)
|
||||||
|
*/
|
||||||
public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size) {
|
public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size) {
|
||||||
|
this(renderer, position, size, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new offset GUI renderer. All calls to this renderer are forwarded to the parent
|
||||||
|
* renderer with coordinates offset by the specified position.
|
||||||
|
* If strict is {@code true}, this also ensures that drawing happens within the specified bounds.
|
||||||
|
* @param renderer The parent renderer
|
||||||
|
* @param position The position of this renderer within the parent (used as is, not copied)
|
||||||
|
* @param size The size of the drawable area (used as is, not copied)
|
||||||
|
* @param strict Whether drawing should be forced to be within the drawable area
|
||||||
|
*/
|
||||||
|
public OffsetGuiRenderer(GuiRenderer renderer, ReadablePoint position, ReadableDimension size, boolean strict) {
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
this.position = position;
|
this.position = position;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
|
this.strict = strict;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -58,6 +92,7 @@ public class OffsetGuiRenderer implements GuiRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setDrawingArea(int x, int y, int width, int height) {
|
public void setDrawingArea(int x, int y, int width, int height) {
|
||||||
|
if (!strict) return;
|
||||||
int x2 = x + width;
|
int x2 = x + width;
|
||||||
int y2 = y + height;
|
int y2 = y + height;
|
||||||
// Convert and clamp top and left border
|
// Convert and clamp top and left border
|
||||||
|
|||||||
@@ -150,19 +150,22 @@ public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
|||||||
}
|
}
|
||||||
for (final Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> e : layedOutElements.entrySet()) {
|
for (final Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> e : layedOutElements.entrySet()) {
|
||||||
GuiElement element = e.getKey();
|
GuiElement element = e.getKey();
|
||||||
|
boolean strict;
|
||||||
if (element instanceof ComposedGuiElement) {
|
if (element instanceof ComposedGuiElement) {
|
||||||
if (((ComposedGuiElement) element).getMaxLayer() < renderInfo.layer) {
|
if (((ComposedGuiElement) element).getMaxLayer() < renderInfo.layer) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
strict = renderInfo.layer == 0;
|
||||||
} else {
|
} else {
|
||||||
if (element.getLayer() != renderInfo.layer) {
|
if (element.getLayer() != renderInfo.layer) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
strict = true;
|
||||||
}
|
}
|
||||||
final ReadablePoint ePosition = e.getValue().getLeft();
|
final ReadablePoint ePosition = e.getValue().getLeft();
|
||||||
final ReadableDimension eSize = e.getValue().getRight();
|
final ReadableDimension eSize = e.getValue().getRight();
|
||||||
try {
|
try {
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize);
|
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize, strict);
|
||||||
eRenderer.startUsing();
|
eRenderer.startUsing();
|
||||||
e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY())
|
e.getKey().draw(eRenderer, eSize, renderInfo.offsetMouse(ePosition.getX(), ePosition.getY())
|
||||||
.layer(renderInfo.getLayer() - e.getKey().getLayer()));
|
.layer(renderInfo.getLayer() - e.getKey().getLayer()));
|
||||||
|
|||||||
Reference in New Issue
Block a user