diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/component/base/IComponentScreen.java b/src/gui/java/speiger/src/coreengine/ui/gui/component/base/IComponentScreen.java index f1c12ef..96be004 100644 --- a/src/gui/java/speiger/src/coreengine/ui/gui/component/base/IComponentScreen.java +++ b/src/gui/java/speiger/src/coreengine/ui/gui/component/base/IComponentScreen.java @@ -4,12 +4,15 @@ import speiger.src.coreengine.ui.gui.layout.box.IGuiBox; import speiger.src.coreengine.ui.gui.layout.constraint.ConstraintContainer; public interface IComponentScreen { - public IGuiBox getBox(); - public long clock(); + IGuiBox getBox(); + long clock(); - public void pushLayer(); - public void popLayer(); - public GuiComponent addComponent(GuiComponent component, ConstraintContainer constraints); - public boolean hasComponent(GuiComponent component); - public boolean removeComponent(GuiComponent component); + void pushLayer(); + void popLayer(); + + GuiComponent addComponent(GuiComponent component, ConstraintContainer constraints); + boolean hasComponent(GuiComponent component); + boolean isAtTop(GuiComponent component); + boolean moveToTop(GuiComponent component); + boolean removeComponent(GuiComponent component); } diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/component/impl/TestComponent.java b/src/gui/java/speiger/src/coreengine/ui/gui/component/impl/TestComponent.java new file mode 100644 index 0000000..4aabcaa --- /dev/null +++ b/src/gui/java/speiger/src/coreengine/ui/gui/component/impl/TestComponent.java @@ -0,0 +1,21 @@ +package speiger.src.coreengine.ui.gui.component.impl; + +import speiger.src.coreengine.ui.gui.component.base.GuiComponent; +import speiger.src.coreengine.ui.gui.renderer.IUIRenderer; + +public class TestComponent extends GuiComponent { + + public TestComponent(float x, float y, float width, float height) { + super(x, y, width, height); + } + + @Override + public void init() { + } + + + @Override + protected void renderComponent(IUIRenderer renderer, int mouseX, int mouseY, float partialTicks) { + renderer.drawRect(getBox(), 0xFF00FFFF); + } +} diff --git a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java index 5734f7d..9a0cfa8 100644 --- a/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java +++ b/src/gui/java/speiger/src/coreengine/ui/gui/renderer/UIRenderer.java @@ -59,12 +59,12 @@ public class UIRenderer implements IUIRenderer { for(int i = 0,m=draws.size();i getChildren() { return container.interactables(); } + @Override + public void setFocusedChild(IInteractable child) { + if(focused != null) focused.setFocused(false); + this.focused = child; + if(focused != null) focused.setFocused(true); + } + @Override + public IInteractable getFocusedChild() { return focused; } + @Override + public IntSet getActiveButtons() { return activeButtons; } + @Override + public void pushLayer() { container.pushLayer(); } + @Override + public void popLayer() { container.popLayer(); } + @Override + public GuiComponent addComponent(GuiComponent component, ConstraintContainer constraints) { + if(component.screen() != null) throw new IllegalArgumentException("A Child can not have multiple Screens"); + container.add(component); + component.withConstraints(constraints); + component.setScreen(this); + component.init(); + component.onChanged(true); + return component; + } + + @Override + public boolean hasComponent(GuiComponent component) { + return component.screen() == this && container.contains(component); + } + + @Override + public boolean isAtTop(GuiComponent component) { + return component.screen() == this && container.children().contains(component); + } + + @Override + public boolean moveToTop(GuiComponent component) { + return component.screen() == this && container.moveToTop(component); + } + + @Override + public boolean removeComponent(GuiComponent component) { + if(component.screen() == this && container.remove(component)) { + component.close(); + component.setScreen(null); + return true; + } + return false; + } + + public void render(IUIRenderer renderer, int mouseX, int mouseY, float partialTicks) { + for(Object2BooleanMap.Entry entry : container) { + boolean keepMouse = entry.getBooleanValue(); + GuiComponent.renderComponent(entry.getKey(), renderer, keepMouse ? mouseX : -1, keepMouse ? mouseY : -1, partialTicks); + } + } + + public void tick() { + tick++; + for(Object2BooleanMap.Entry entry : container) { + GuiComponent.tickComponent(entry.getKey()); + } + } + + public static class LayeredContainer implements Iterable> { + Stack layers = new ObjectArrayList<>(); + + public LayeredContainer() { pushLayer(); } + + public void pushLayer() { + layers.push(new Layer()); + } + + public void popLayer() { + if(layers.size() == 1) return; + layers.pop(); + } + + public void add(GuiComponent component) { + layers.top().add(component); + } + + public boolean moveToTop(GuiComponent component) { + if(layers.top().contains(component)) return true; + for(int i = 1,m=layers.size();i 0) { + popLayer(); + } + } + + @Override + public Iterator> iterator() { + return new Iterator<>() { + BasicEntry entry = new BasicEntry<>(); + int myLayer = layers.size()-1; + Iterator childIterator = layers.peek(myLayer).components.iterator(); + + @Override + public boolean hasNext() { + return childIterator.hasNext(); + } + + @Override + public Entry next() { + if(!hasNext()) throw new IllegalStateException("Out of Elements to poll"); + entry.set(childIterator.next(), myLayer == 0); + if(!childIterator.hasNext() && myLayer > 0) { + childIterator = layers.peek(--myLayer).components.iterator(); + } + return entry; + } + + }; + } + + public List children() { + return layers.top().components; + } + + public List interactables() { + return layers.top().interactables; + } + } + + private static class Layer { + List components = new ObjectArrayList<>(); + List interactables = new ObjectArrayList<>(); + + public void add(GuiComponent component) { + components.add(component); + interactables.add(component.interactContainer()); + } + + public boolean contains(GuiComponent component) { + return components.contains(component); + } + + public boolean remove(GuiComponent component) { + if(components.remove(component)) { + interactables.remove(component.interactContainer()); + return true; + } + return false; + } + + public boolean isEmpty() { + return components.isEmpty(); + } + } +} diff --git a/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java b/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java index 8a12850..d330f93 100644 --- a/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java +++ b/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java @@ -410,7 +410,7 @@ public class GuiScreenBase extends GuiBase protected Iterator sortByHeight(List comp) { - comp.sort(ButtonSorter.SORTER); + comp.sort(Comparator.comparingDouble(IButtonComponent::getComponentZ)); return comp.iterator(); }