package gminers.glasspane;
import gminers.glasspane.event.KeyTypedEvent;
import gminers.glasspane.event.MouseDownEvent;
import gminers.glasspane.event.PaneDisplayEvent;
import gminers.glasspane.event.PaneHideEvent;
import gminers.kitchensink.Rendering;
import java.util.List;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import net.minecraft.client.gui.GuiScreen;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import com.gameminers.glasspane.internal.GlassPaneMod;
/**
* Simple class that wraps a GlassPane with a GuiScreen.
* All operations on the GuiScreen pass through to the underlying GlassPane, converting where necessary.
*
* @author Aesen Vismea
*
*/
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public final class GlassPaneMirror
extends GuiScreen {
/**
* The GlassPane that this GlassPaneMirror is mirroring.
*/
@Getter GlassPane mirrored;
@NonFinal boolean shown = false;
@Getter @Setter(AccessLevel.PACKAGE) @NonFinal List<GlassPane> modalUnderlays;
@Getter @Setter(AccessLevel.PACKAGE) @NonFinal GuiScreen modal;
@Override
public boolean doesGuiPauseGame() {
return !(mirrored instanceof NonPausingGlassPane);
}
@Override
public void initGui() {
if (isModal()) {
modal.setWorldAndResolution(mc, width, height);
}
if (!shown) {
shown = true;
mirrored.fireEvent(PaneDisplayEvent.class, mirrored);
}
mirrored.setWidth(width);
mirrored.setHeight(height);
if (mirrored.shadowbox != null) {
mirrored.shadowbox.setWidth(width);
mirrored.shadowbox.setHeight(height);
mirrored.shadowbox.winch();
}
for (final GlassPane pane : GlassPaneMod.inst.currentOverlays) {
pane.setWidth(width);
pane.setHeight(height);
}
}
@Override
public void updateScreen() {
if (isModal()) {
modal.updateScreen();
}
mirrored.tick();
if (mirrored.shadowbox != null) {
mirrored.shadowbox.tick();
}
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
if (GlassPaneMod.invertMouseCoordinates) {
mouseX = width - mouseX;
mouseY = height - mouseY;
}
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
if (isModal()) {
modal.drawScreen(-10, -10, partialTicks);
for (final GlassPane gp : modalUnderlays) {
if (gp == null) {
continue;
}
gp.render(-10, -10, partialTicks);
}
GL11.glTranslatef(0, 0, 20);
Rendering.drawGradientRect(0, 0, width, height, 0xC0101010, 0xD0101010, 0);
}
mirrored.render(mouseX, mouseY, partialTicks);
GL11.glDisable(GL11.GL_DEPTH_TEST);
}
@Override
protected void keyTyped(final char keyChar, final int keyCode) {
final KeyTypedEvent e = mirrored.fireEvent(KeyTypedEvent.class, mirrored, keyChar, keyCode);
if (e != null) {
if (e.isConsumed()) return;
}
if (keyCode == Keyboard.KEY_ESCAPE) {
mc.displayGuiScreen(null);
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, final int button) {
if (GlassPaneMod.invertMouseCoordinates) {
mouseX = width - mouseX;
mouseY = height - mouseY;
}
mirrored.fireEvent(MouseDownEvent.class, mirrored, mouseX, mouseY, button);
}
@Override
public void onGuiClosed() {
shown = false;
mirrored.fireEvent(PaneHideEvent.class, mirrored);
mirrored.setFocusedComponent(null);
}
public boolean isModal() {
return modal != null;
}
}