diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Component.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Component.java new file mode 100644 index 00000000..8f1f696f --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Component.java @@ -0,0 +1,214 @@ +package com.bartlomiejpluta.base.api.game.gui; + +public abstract class Component implements Widget { + protected Widget parent; + + protected float absX; + protected float absY; + + protected float width; + protected float height; + + protected float marginTop; + protected float marginRight; + protected float marginBottom; + protected float marginLeft; + + protected float paddingTop; + protected float paddingRight; + protected float paddingBottom; + protected float paddingLeft; + + @Override + public Widget getParent() { + return parent; + } + + public void setParent(Widget parent) { + this.parent = parent; + } + + @Override + public float getAbsoluteX() { + return absX; + } + + @Override + public float getAbsoluteY() { + return absY; + } + + @Override + public void setAbsoluteX(float x) { + this.absX = x; + } + + @Override + public void setAbsoluteY(float y) { + this.absY = y; + } + + @Override + public float getWidth() { + return width; + } + + @Override + public float getHeight() { + return height; + } + + @Override + public void setWidth(float width) { + this.width = width; + } + + @Override + public void setHeight(float height) { + this.height = height; + } + + @Override + public void setMargin(float top, float right, float bottom, float left) { + this.marginTop = top; + this.marginRight = right; + this.marginBottom = bottom; + this.marginLeft = left; + } + + @Override + public void setMargin(float top, float rightLeft, float bottom) { + this.marginTop = top; + this.marginRight = rightLeft; + this.marginBottom = bottom; + this.marginLeft = rightLeft; + } + + @Override + public void setMargin(float topBottom, float rightLeft) { + this.marginTop = topBottom; + this.marginRight = rightLeft; + this.marginBottom = topBottom; + this.marginLeft = rightLeft; + } + + @Override + public void setMargin(float all) { + this.marginTop = all; + this.marginRight = all; + this.marginBottom = all; + this.marginLeft = all; + } + + @Override + public void setMarginTop(float margin) { + this.marginTop = margin; + } + + @Override + public void setMarginRight(float margin) { + this.marginRight = margin; + } + + @Override + public void setMarginBottom(float margin) { + this.marginBottom = margin; + } + + @Override + public void setMarginLeft(float margin) { + this.marginLeft = margin; + } + + @Override + public float getMarginTop() { + return marginTop; + } + + @Override + public float getMarginRight() { + return marginRight; + } + + @Override + public float getMarginBottom() { + return marginBottom; + } + + @Override + public float getMarginLeft() { + return marginLeft; + } + + @Override + public void setPadding(float top, float right, float bottom, float left) { + this.paddingTop = top; + this.paddingRight = right; + this.paddingBottom = bottom; + this.paddingLeft = left; + } + + @Override + public void setPadding(float top, float rightLeft, float bottom) { + this.paddingTop = top; + this.paddingRight = rightLeft; + this.paddingBottom = bottom; + this.paddingLeft = rightLeft; + } + + @Override + public void setPadding(float topBottom, float rightLeft) { + this.paddingTop = topBottom; + this.paddingRight = rightLeft; + this.paddingBottom = topBottom; + this.paddingLeft = rightLeft; + } + + @Override + public void setPadding(float all) { + this.paddingTop = all; + this.paddingRight = all; + this.paddingBottom = all; + this.paddingLeft = all; + } + + @Override + public void setPaddingTop(float padding) { + this.paddingTop = padding; + } + + @Override + public void setPaddingRight(float padding) { + this.paddingRight = padding; + } + + @Override + public void setPaddingBottom(float padding) { + this.paddingBottom = padding; + } + + @Override + public void setPaddingLeft(float padding) { + this.paddingLeft = padding; + } + + @Override + public float getPaddingTop() { + return paddingTop; + } + + @Override + public float getPaddingRight() { + return paddingRight; + } + + @Override + public float getPaddingBottom() { + return paddingBottom; + } + + @Override + public float getPaddingLeft() { + return paddingLeft; + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Container.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Container.java new file mode 100644 index 00000000..f7a1edb9 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Container.java @@ -0,0 +1,13 @@ +package com.bartlomiejpluta.base.api.game.gui; + +import java.util.LinkedList; +import java.util.List; + +public abstract class Container extends Component { + protected final List children = new LinkedList<>(); + + public void addChild(Component component) { + this.children.add(component); + component.setParent(this); + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/GUI.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/GUI.java index eed0c8c2..86a3b01d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/GUI.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/GUI.java @@ -8,6 +8,8 @@ public interface GUI extends Renderable, Disposable { void setRoot(Widget root); + void beginPath(); + void drawRectangle(float x, float y, float w, float h); void fillColor(Color color); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/HBox.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/HBox.java new file mode 100644 index 00000000..1af02f12 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/HBox.java @@ -0,0 +1,48 @@ +package com.bartlomiejpluta.base.api.game.gui; + +import com.bartlomiejpluta.base.api.game.screen.Screen; + +public class HBox extends Container { + + @Override + public float getWidth() { + var childrenWidth = 0.0f; + + for (var child : children) { + childrenWidth += child.getMarginLeft() + child.getWidth() + child.getMarginRight(); + } + + return paddingLeft + childrenWidth + paddingRight; + } + + @Override + public float getHeight() { + var theHighestChild = 0.0f; + + for (var child : children) { + var height = child.getMarginTop() + child.getHeight() + child.getMarginBottom(); + if (height > theHighestChild) { + theHighestChild = height; + } + } + + return paddingTop + theHighestChild + paddingBottom; + } + + @Override + public void draw(Screen screen, GUI gui) { + var currentX = absX + paddingLeft; + var currentY = absY + paddingTop; + + for (var child : children) { + var childAbsX = currentX + child.getMarginLeft(); + var childAbsY = currentY + child.getMarginTop(); + child.setAbsoluteX(childAbsX); + child.setAbsoluteY(childAbsY); + + currentX += child.getMarginLeft() + child.getWidth() + child.getMarginRight(); + + child.draw(screen, gui); + } + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/VBox.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/VBox.java new file mode 100644 index 00000000..efb09921 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/VBox.java @@ -0,0 +1,48 @@ +package com.bartlomiejpluta.base.api.game.gui; + +import com.bartlomiejpluta.base.api.game.screen.Screen; + +public class VBox extends Container { + + @Override + public float getWidth() { + var theWidestChild = 0.0f; + + for (var child : children) { + var width = child.getMarginLeft() + child.getWidth() + child.getMarginRight(); + if (width > theWidestChild) { + theWidestChild = width; + } + } + + return paddingLeft + theWidestChild + paddingRight; + } + + @Override + public float getHeight() { + var childrenHeight = 0.0f; + + for (var child : children) { + childrenHeight += child.getMarginTop() + child.getHeight() + child.getMarginBottom(); + } + + return paddingTop + childrenHeight + paddingBottom; + } + + @Override + public void draw(Screen screen, GUI gui) { + var currentX = absX + paddingLeft; + var currentY = absY + paddingTop; + + for (var child : children) { + var childAbsX = currentX + child.getMarginLeft(); + var childAbsY = currentY + child.getMarginTop(); + child.setAbsoluteX(childAbsX); + child.setAbsoluteY(childAbsY); + + currentY += child.getMarginTop() + child.getHeight() + child.getMarginBottom(); + + child.draw(screen, gui); + } + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Widget.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Widget.java index 71e47a0b..38e5d4c8 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Widget.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/Widget.java @@ -5,5 +5,69 @@ import com.bartlomiejpluta.base.api.game.screen.Screen; public interface Widget { Widget getParent(); + float getAbsoluteX(); + + float getAbsoluteY(); + + void setAbsoluteX(float x); + + void setAbsoluteY(float y); + + float getWidth(); + + float getHeight(); + + void setWidth(float width); + + void setHeight(float height); + + void setMargin(float top, float right, float bottom, float left); + + void setMargin(float top, float rightLeft, float bottom); + + void setMargin(float topBottom, float rightLeft); + + void setMargin(float all); + + void setMarginTop(float margin); + + void setMarginRight(float margin); + + void setMarginBottom(float margin); + + void setMarginLeft(float margin); + + float getMarginTop(); + + float getMarginRight(); + + float getMarginBottom(); + + float getMarginLeft(); + + void setPadding(float top, float right, float bottom, float left); + + void setPadding(float top, float rightLeft, float bottom); + + void setPadding(float topBottom, float rightLeft); + + void setPadding(float all); + + void setPaddingTop(float padding); + + void setPaddingRight(float padding); + + void setPaddingBottom(float padding); + + void setPaddingLeft(float padding); + + float getPaddingTop(); + + float getPaddingRight(); + + float getPaddingBottom(); + + float getPaddingLeft(); + void draw(Screen screen, GUI gui); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java index a75d4fb6..3cceb669 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java @@ -45,6 +45,11 @@ public class NanoVGGUI implements GUI { nvgEndFrame(context); } + @Override + public void beginPath() { + nvgBeginPath(context); + } + @Override public void drawRectangle(float x, float y, float w, float h) { nvgRect(context, x, y, w, h);