387 lines
8.1 KiB
Java
387 lines
8.1 KiB
Java
package speiger.src.coreengine.rendering.gui;
|
|
|
|
import java.util.function.IntToLongFunction;
|
|
|
|
import speiger.src.collections.ints.maps.impl.hash.Int2LongOpenHashMap;
|
|
import speiger.src.collections.ints.maps.interfaces.Int2LongMap;
|
|
import speiger.src.collections.ints.sets.IntSet;
|
|
import speiger.src.coreengine.rendering.gui.base.DebugOverlay;
|
|
import speiger.src.coreengine.rendering.gui.base.IButtonComponent;
|
|
import speiger.src.coreengine.rendering.gui.base.IKeyComponent;
|
|
import speiger.src.coreengine.rendering.gui.helper.Align;
|
|
import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox;
|
|
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrains;
|
|
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrain;
|
|
import speiger.src.coreengine.rendering.gui.renderer.FontRenderer;
|
|
import speiger.src.coreengine.rendering.gui.renderer.UIRenderer;
|
|
import speiger.src.coreengine.rendering.input.events.MouseEvent;
|
|
import speiger.src.coreengine.rendering.input.events.MouseEvent.MouseClickEvent;
|
|
import speiger.src.coreengine.rendering.input.events.MouseEvent.MouseMoveEvent;
|
|
import speiger.src.coreengine.rendering.input.events.MouseEvent.MouseScrollEvent;
|
|
import speiger.src.coreengine.rendering.input.window.ScaledResolution;
|
|
import speiger.src.coreengine.rendering.input.window.Window;
|
|
import speiger.src.coreengine.utils.profiler.IProfiler;
|
|
|
|
public abstract class GuiBase
|
|
{
|
|
ButtonMap pressedButtons = new ButtonMap();
|
|
public GuiManager manager;
|
|
public int width;
|
|
public int height;
|
|
boolean focus = false;
|
|
public int layers = 0;
|
|
int baseLayer = 0;
|
|
|
|
GuiBase prevGui;
|
|
|
|
public final void setGuiBounds(GuiManager newManager, int screenWidth, int screenHeight)
|
|
{
|
|
manager = newManager;
|
|
width = screenWidth;
|
|
height = screenHeight;
|
|
}
|
|
|
|
public void onInit()
|
|
{
|
|
|
|
}
|
|
|
|
public void onScreenChanged()
|
|
{
|
|
|
|
}
|
|
|
|
public void onFocusLost()
|
|
{
|
|
|
|
}
|
|
|
|
public void onClosed()
|
|
{
|
|
|
|
}
|
|
|
|
public <T extends GuiComponent> T addComponent(T comp)
|
|
{
|
|
return addComponent(comp, null);
|
|
}
|
|
|
|
public <T extends GuiComponent> T addComponent(int id, T comp)
|
|
{
|
|
return addComponent(id, comp, null);
|
|
}
|
|
|
|
public <T extends GuiComponent> T addComponent(T comp, Constrain xPos, Constrain yPos, Constrain width, Constrain height)
|
|
{
|
|
return addComponent(comp, new Constrains(xPos, yPos, width, height));
|
|
}
|
|
|
|
public <T extends GuiComponent> T addComponent(int id, T comp, Constrain xPos, Constrain yPos, Constrain width, Constrain height)
|
|
{
|
|
return addComponent(id, comp, new Constrains(xPos, yPos, width, height));
|
|
}
|
|
|
|
public abstract <T extends GuiComponent> T addComponent(T comp, Constrains contrains);
|
|
|
|
public abstract <T extends GuiComponent> T addComponent(int id, T comp, Constrains contrains);
|
|
|
|
public <T extends GuiComponent> T centerComponent(T comp)
|
|
{
|
|
IGuiBox box = comp.getBox();
|
|
comp.set(Align.CENTER.align(width, box.getWidth()), Align.CENTER.align(height, box.getHeight()));
|
|
return comp;
|
|
}
|
|
|
|
public abstract void addButtonListener(IButtonComponent listener);
|
|
|
|
public abstract void addKeyListener(IKeyComponent listener);
|
|
|
|
public abstract GuiComponent getComponent(int id);
|
|
|
|
public <T extends GuiComponent> T getCastedComponent(int id) {
|
|
GuiComponent component = getComponent(id);
|
|
return component == null ? null : component.cast();
|
|
}
|
|
|
|
public <T extends GuiComponent> T getCastedComponent(int id, Class<T> clz) {
|
|
GuiComponent component = getComponent(id);
|
|
return component == null ? null : component.cast(clz);
|
|
}
|
|
|
|
public abstract void removeComponent(GuiComponent comp);
|
|
|
|
public abstract void removeButtonListener(IButtonComponent listener);
|
|
|
|
public abstract void removeKeyListener(IKeyComponent listener);
|
|
|
|
protected void addConstrains(GuiComponent comp, Constrains contrains)
|
|
{
|
|
comp.constraints = contrains;
|
|
if(contrains != null)
|
|
{
|
|
contrains.setOwner(comp, null);
|
|
}
|
|
}
|
|
|
|
public final void draw(int mouseX, int mouseY, float particalTicks)
|
|
{
|
|
IProfiler prov = manager.getGPUProfiler();
|
|
prov.start(this instanceof DebugOverlay ? "Debug Overlay" : "Current UI");
|
|
prov.start("Update");
|
|
update(mouseX, mouseY, particalTicks);
|
|
prov.next("Render");
|
|
render(mouseX, mouseY, particalTicks);
|
|
prov.stop();
|
|
prov.stop();
|
|
}
|
|
|
|
public void onFixedUpdate()
|
|
{
|
|
|
|
}
|
|
|
|
protected void update(int mouseX, int mouseY, float particalTicks)
|
|
{
|
|
|
|
}
|
|
|
|
protected void render(int mouseX, int mouseY, float particalTicks)
|
|
{
|
|
|
|
}
|
|
|
|
public boolean isAllowingMovement()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public boolean onKeyTyped(char letter, int codepoint)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean onKeyPressed(int key)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public final void onMouseEvent(MouseEvent evt)
|
|
{
|
|
if(evt instanceof MouseClickEvent)
|
|
{
|
|
MouseClickEvent click = (MouseClickEvent)evt;
|
|
if(click.press)
|
|
{
|
|
pressedButtons.add(click.button);
|
|
if(onMousePressed(click.button, evt.mouseX, evt.mouseY))
|
|
{
|
|
evt.cancel();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pressedButtons.remove(click.button);
|
|
if(onMouseReleased(click.button, evt.mouseX, evt.mouseY))
|
|
{
|
|
evt.cancel();
|
|
}
|
|
}
|
|
}
|
|
else if(evt instanceof MouseMoveEvent && pressedButtons.size() > 0)
|
|
{
|
|
if(onMouseDragged(pressedButtons.getButtons(), evt.mouseX, evt.mouseY, pressedButtons))
|
|
{
|
|
evt.cancel();
|
|
}
|
|
}
|
|
else if(evt instanceof MouseScrollEvent)
|
|
{
|
|
MouseScrollEvent scroll = (MouseScrollEvent)evt;
|
|
if(onMouseScroll(evt.mouseX, evt.mouseY, scroll.scrollY))
|
|
{
|
|
evt.cancel();
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean onMousePressed(int button, int mouseX, int mouseY)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean onMouseReleased(int button, int mouseX, int mouseY)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean onMouseDragged(IntSet activeButtons, int mouseX, int mouseY, IntToLongFunction timeMap)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean onMouseScroll(int mouseX, int mouseY, int scrollX)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean isButtonPressed(int mouseButton)
|
|
{
|
|
return pressedButtons.getButtons().contains(mouseButton);
|
|
}
|
|
|
|
public long getPressedTime(int mouseButton)
|
|
{
|
|
return pressedButtons.applyAsLong(mouseButton);
|
|
}
|
|
|
|
public boolean hasComponentPressed(int mouseButton)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean hasFocus()
|
|
{
|
|
return focus;
|
|
}
|
|
|
|
public void requestComponentFocus(GuiComponent comp)
|
|
{
|
|
}
|
|
|
|
public boolean hasComponentInTheWay(GuiComponent comp, int mouseX, int mouseY)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean isComponentInWay(GuiComponent comp, int mouseX, int mouseY)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean isComponentFocused(GuiComponent comp)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public boolean isComponentInFront(GuiComponent comp)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public Window getWindow()
|
|
{
|
|
return manager.window;
|
|
}
|
|
|
|
public FontRenderer getFont()
|
|
{
|
|
return getUIManager().font;
|
|
}
|
|
|
|
public final long getGlobalClock()
|
|
{
|
|
return manager.globalClock;
|
|
}
|
|
|
|
public void closeGui()
|
|
{
|
|
manager.closeGui();
|
|
}
|
|
|
|
public void openGui(GuiBase gui)
|
|
{
|
|
manager.showGui(gui, false);
|
|
}
|
|
|
|
public void openGuiWithPrev(GuiBase base)
|
|
{
|
|
manager.showGui(base, true);
|
|
}
|
|
|
|
public boolean hasPrevGui()
|
|
{
|
|
return prevGui != null;
|
|
}
|
|
|
|
public void setLastGui(GuiBase newLast)
|
|
{
|
|
prevGui = newLast;
|
|
}
|
|
|
|
public void openPrevGui()
|
|
{
|
|
openGui(prevGui);
|
|
}
|
|
|
|
public void openPrevGui(boolean keepPrev)
|
|
{
|
|
manager.showGui(prevGui, keepPrev);
|
|
}
|
|
|
|
public GuiManager getUIManager()
|
|
{
|
|
return manager;
|
|
}
|
|
|
|
public UIRenderer getRenderer()
|
|
{
|
|
return manager.renderer;
|
|
}
|
|
|
|
public DebugOverlay getOverlay()
|
|
{
|
|
return manager.getDebug();
|
|
}
|
|
|
|
public ScaledResolution getRes()
|
|
{
|
|
return manager.getRes();
|
|
}
|
|
|
|
public final int getBaseLayer()
|
|
{
|
|
return baseLayer;
|
|
}
|
|
|
|
public <T extends GuiBase> T cast()
|
|
{
|
|
return (T)this;
|
|
}
|
|
|
|
public <T extends GuiBase> T cast(Class<? extends T> clz)
|
|
{
|
|
return (T)this;
|
|
}
|
|
|
|
public static class ButtonMap implements IntToLongFunction
|
|
{
|
|
Int2LongMap timeMap = new Int2LongOpenHashMap();
|
|
|
|
public void add(int button)
|
|
{
|
|
timeMap.put(button, System.nanoTime());
|
|
}
|
|
|
|
public void remove(int button)
|
|
{
|
|
timeMap.remove(button);
|
|
}
|
|
|
|
public int size()
|
|
{
|
|
return timeMap.size();
|
|
}
|
|
|
|
public IntSet getButtons()
|
|
{
|
|
return timeMap.keySet();
|
|
}
|
|
|
|
@Override
|
|
public long applyAsLong(int value)
|
|
{
|
|
return System.nanoTime() - timeMap.get(value);
|
|
}
|
|
}
|
|
}
|