Fix layering in GUI API
This commit is contained in:
@@ -38,7 +38,7 @@ public class RenderInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public RenderInfo layer(int layer) {
|
public RenderInfo layer(int layer) {
|
||||||
return new RenderInfo(partialTick, mouseX, mouseY, layer);
|
return this.layer == layer ? this : new RenderInfo(partialTick, mouseX, mouseY, layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addTo(CrashReport crashReport) {
|
public void addTo(CrashReport crashReport) {
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
|||||||
});
|
});
|
||||||
throw new ReportedException(crashReport);
|
throw new ReportedException(crashReport);
|
||||||
}
|
}
|
||||||
if (backgroundColor != null) {
|
if (backgroundColor != null && renderInfo.getLayer() == 0) {
|
||||||
renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), backgroundColor);
|
renderer.drawRect(0, 0, size.getWidth(), size.getHeight(), backgroundColor);
|
||||||
}
|
}
|
||||||
for (final Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> e : layedOutElements.entrySet()) {
|
for (final Map.Entry<GuiElement, Pair<ReadablePoint, ReadableDimension>> e : layedOutElements.entrySet()) {
|
||||||
@@ -164,7 +164,8 @@ public abstract class AbstractGuiContainer<T extends AbstractGuiContainer<T>>
|
|||||||
try {
|
try {
|
||||||
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize);
|
OffsetGuiRenderer eRenderer = new OffsetGuiRenderer(renderer, ePosition, eSize);
|
||||||
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()));
|
||||||
eRenderer.stopUsing();
|
eRenderer.stopUsing();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui");
|
CrashReport crashReport = CrashReport.makeCrashReport(ex, "Rendering Gui");
|
||||||
|
|||||||
@@ -22,15 +22,20 @@
|
|||||||
|
|
||||||
package de.johni0702.minecraft.gui.element;
|
package de.johni0702.minecraft.gui.element;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Ordering;
|
||||||
import de.johni0702.minecraft.gui.container.GuiContainer;
|
import de.johni0702.minecraft.gui.container.GuiContainer;
|
||||||
import net.minecraft.crash.CrashReport;
|
import net.minecraft.crash.CrashReport;
|
||||||
import net.minecraft.crash.CrashReportCategory;
|
import net.minecraft.crash.CrashReportCategory;
|
||||||
import net.minecraft.util.ReportedException;
|
import net.minecraft.util.ReportedException;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.lang.reflect.InvocationHandler;
|
import java.lang.reflect.InvocationHandler;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Proxy;
|
import java.lang.reflect.Proxy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
@@ -45,19 +50,15 @@ public abstract class AbstractComposedGuiElement<T extends AbstractComposedGuiEl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxLayer() {
|
public int getMaxLayer() {
|
||||||
int maxLayer = getLayer();
|
return getLayer() + Ordering.natural().max(Iterables.concat(Collections.singleton(0),
|
||||||
for (GuiElement element : getChildren()) {
|
Iterables.transform(getChildren(), new Function<GuiElement, Integer>() {
|
||||||
int elementMaxLayer;
|
|
||||||
if (element instanceof ComposedGuiElement) {
|
@Nullable
|
||||||
elementMaxLayer = ((ComposedGuiElement) element).getMaxLayer();
|
@Override
|
||||||
} else {
|
public Integer apply(GuiElement e) {
|
||||||
elementMaxLayer = element.getLayer();
|
return e instanceof ComposedGuiElement ? ((ComposedGuiElement) e).getMaxLayer() : e.getLayer();
|
||||||
}
|
}
|
||||||
if (elementMaxLayer > maxLayer) {
|
})));
|
||||||
maxLayer = elementMaxLayer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return maxLayer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -65,14 +66,14 @@ public abstract class AbstractComposedGuiElement<T extends AbstractComposedGuiEl
|
|||||||
public <C> C forEach(final Class<C> ofType) {
|
public <C> C forEach(final Class<C> ofType) {
|
||||||
int maxLayer = getMaxLayer();
|
int maxLayer = getMaxLayer();
|
||||||
final List<C> layers = new ArrayList<C>(maxLayer + 1);
|
final List<C> layers = new ArrayList<C>(maxLayer + 1);
|
||||||
for (int i = 0; i <= maxLayer; i++) {
|
for (int i = maxLayer; i >= 0; i--) {
|
||||||
layers.add(forEach(i, ofType));
|
layers.add(forEach(i, ofType));
|
||||||
}
|
}
|
||||||
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
return (C) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ofType}, new InvocationHandler() {
|
||||||
@Override
|
@Override
|
||||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||||
boolean isGetter = method.getName().startsWith("get");
|
boolean isGetter = method.getName().startsWith("get");
|
||||||
Object handled = method.getReturnType().equals(Boolean.class) ? false : null;
|
Object handled = method.getReturnType().equals(boolean.class) ? false : null;
|
||||||
for (final C layer : layers) {
|
for (final C layer : layers) {
|
||||||
handled = method.invoke(layer, args);
|
handled = method.invoke(layer, args);
|
||||||
if (handled != null) {
|
if (handled != null) {
|
||||||
@@ -136,7 +137,7 @@ public abstract class AbstractComposedGuiElement<T extends AbstractComposedGuiEl
|
|||||||
if (element instanceof ComposedGuiElement) {
|
if (element instanceof ComposedGuiElement) {
|
||||||
ComposedGuiElement composed = (ComposedGuiElement) element;
|
ComposedGuiElement composed = (ComposedGuiElement) element;
|
||||||
if (layer <= composed.getMaxLayer()) {
|
if (layer <= composed.getMaxLayer()) {
|
||||||
Object elementProxy = composed.forEach(layer, ofType);
|
Object elementProxy = composed.forEach(layer - composed.getLayer(), ofType);
|
||||||
handled = method.invoke(elementProxy, args);
|
handled = method.invoke(elementProxy, args);
|
||||||
}
|
}
|
||||||
} else if (ofType.isInstance(element) && element.getLayer() == layer) {
|
} else if (ofType.isInstance(element) && element.getLayer() == layer) {
|
||||||
|
|||||||
Reference in New Issue
Block a user