diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/BaseWidget.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/BaseWidget.java new file mode 100644 index 00000000..c06d71a9 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/BaseWidget.java @@ -0,0 +1,274 @@ +package com.bartlomiejpluta.base.api.game.gui.base; + +public abstract class BaseWidget implements Widget { + protected Widget parent; + + protected SizeMode widthMode = SizeMode.NORMAL; + protected SizeMode heightMode = SizeMode.NORMAL; + + protected float x; + protected float y; + + 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; + + protected abstract float getContentWidth(); + + protected abstract float getContentHeight(); + + @Override + public float getWidth() { + return widthMode == SizeMode.MATCH_PARENT + ? (parent != null ? parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight() - marginLeft - marginRight : 0) + : getActualWidth(); + } + + @Override + public float getActualWidth() { + return paddingLeft + (widthMode == SizeMode.NORMAL ? width : getContentWidth()) + paddingRight; + } + + @Override + public float getHeight() { + return heightMode == SizeMode.MATCH_PARENT + ? (parent != null ? parent.getHeight() - parent.getPaddingTop() - parent.getPaddingBottom() - marginTop - marginBottom : 0) + : getActualHeight(); + } + + @Override + public float getActualHeight() { + return paddingTop + (heightMode == SizeMode.NORMAL ? height : getContentHeight()) + paddingBottom; + } + + @Override + public void setWidth(float width) { + this.width = width; + } + + @Override + public void setHeight(float height) { + this.height = height; + } + + @Override + public void setSize(float width, float height) { + this.width = width; + this.height = height; + } + + @Override + public void setSizeMode(SizeMode widthMode, SizeMode heightMode) { + this.widthMode = widthMode; + this.heightMode = heightMode; + } + + @Override + public SizeMode getWidthMode() { + return widthMode; + } + + @Override + public void setWidthMode(SizeMode mode) { + this.widthMode = mode; + } + + @Override + public SizeMode getHeightMode() { + return heightMode; + } + + @Override + public void setHeightMode(SizeMode mode) { + this.heightMode = mode; + } + + @Override + public Widget getParent() { + return parent; + } + + @Override + public void setParent(Widget parent) { + this.parent = parent; + } + + @Override + public float getX() { + return x; + } + + @Override + public float getY() { + return y; + } + + @Override + public void setX(float x) { + this.x = x; + } + + @Override + public void setY(float y) { + this.y = y; + } + + @Override + public void setPosition(float x, float y) { + this.x = x; + this.y = y; + } + + @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/base/Widget.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/Widget.java index ac7725a6..103ac055 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/Widget.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/base/Widget.java @@ -19,8 +19,12 @@ public interface Widget { float getWidth(); + float getActualWidth(); + float getHeight(); + float getActualHeight(); + void setWidth(float width); void setHeight(float height); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseComponent.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseComponent.java new file mode 100644 index 00000000..28e154a7 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseComponent.java @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.api.game.gui.component; + +import com.bartlomiejpluta.base.api.game.gui.base.BaseWidget; + +public abstract class BaseComponent extends BaseWidget implements Component { +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseContainer.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseContainer.java index 4b449f93..9a45ee5d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseContainer.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/BaseContainer.java @@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.api.game.gui.component; import java.util.LinkedList; import java.util.List; -public abstract class BaseContainer extends Component implements Container { +public abstract class BaseContainer extends BaseComponent implements Container { protected final List children = new LinkedList<>(); @Override diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Component.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Component.java index 65081c2b..cd58947d 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Component.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Component.java @@ -1,275 +1,6 @@ package com.bartlomiejpluta.base.api.game.gui.component; -import com.bartlomiejpluta.base.api.game.gui.base.SizeMode; import com.bartlomiejpluta.base.api.game.gui.base.Widget; -public abstract class Component implements Widget { - protected Widget parent; - - protected SizeMode widthMode = SizeMode.NORMAL; - protected SizeMode heightMode = SizeMode.NORMAL; - - protected float x; - protected float y; - - 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; - - protected abstract float getContentWidth(); - - protected abstract float getContentHeight(); - - @Override - public float getWidth() { - return widthMode == SizeMode.MATCH_PARENT - ? (parent != null ? parent.getWidth() : 0) - : getActualWidth(); - } - - protected float getActualWidth() { - return paddingLeft + (widthMode == SizeMode.NORMAL ? width : getContentWidth()) + paddingRight; - } - - @Override - public float getHeight() { - return heightMode == SizeMode.MATCH_PARENT - ? (parent != null ? parent.getHeight() : 0) - : getActualHeight(); - } - - protected float getActualHeight() { - return paddingTop + (heightMode == SizeMode.NORMAL ? height : getContentHeight()) + paddingBottom; - } - - @Override - public void setWidth(float width) { - this.width = width; - } - - @Override - public void setHeight(float height) { - this.height = height; - } - - @Override - public void setSize(float width, float height) { - this.width = width; - this.height = height; - } - - @Override - public void setSizeMode(SizeMode widthMode, SizeMode heightMode) { - this.widthMode = widthMode; - this.heightMode = heightMode; - } - - @Override - public SizeMode getWidthMode() { - return widthMode; - } - - @Override - public void setWidthMode(SizeMode mode) { - this.widthMode = mode; - } - - @Override - public SizeMode getHeightMode() { - return heightMode; - } - - @Override - public void setHeightMode(SizeMode mode) { - this.heightMode = mode; - } - - @Override - public Widget getParent() { - return parent; - } - - @Override - public void setParent(Widget parent) { - this.parent = parent; - } - - @Override - public float getX() { - return x; - } - - @Override - public float getY() { - return y; - } - - @Override - public void setX(float x) { - this.x = x; - } - - @Override - public void setY(float y) { - this.y = y; - } - - @Override - public void setPosition(float x, float y) { - this.x = x; - this.y = y; - } - - @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; - } +public interface Component extends Widget { } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Container.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Container.java index ecb8aeba..2c86d1c4 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Container.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/Container.java @@ -1,8 +1,6 @@ package com.bartlomiejpluta.base.api.game.gui.component; -import com.bartlomiejpluta.base.api.game.gui.base.Widget; - -public interface Container extends Widget { +public interface Container extends Component { void add(Component component); void remove(Component component); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/BaseWindow.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/BaseWindow.java new file mode 100644 index 00000000..3ea9a318 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/BaseWindow.java @@ -0,0 +1,28 @@ +package com.bartlomiejpluta.base.api.game.gui.window; + +import com.bartlomiejpluta.base.api.game.gui.base.BaseWidget; +import com.bartlomiejpluta.base.api.game.gui.component.Component; + +public abstract class BaseWindow extends BaseWidget implements Window { + protected Component content; + + @Override + protected float getContentWidth() { + return content.getMarginLeft() + content.getActualWidth() + content.getMarginRight(); + } + + @Override + protected float getContentHeight() { + return content.getMarginTop() + content.getActualHeight() + content.getMarginBottom(); + } + + @Override + public void onOpen(WindowManager manager) { + // do nothing + } + + @Override + public void onClose(WindowManager manager) { + // do nothing + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DefaultWindowManager.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DefaultWindowManager.java new file mode 100644 index 00000000..4c1b2278 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DefaultWindowManager.java @@ -0,0 +1,84 @@ +package com.bartlomiejpluta.base.api.game.gui.window; + +import com.bartlomiejpluta.base.api.game.gui.base.BaseWidget; +import com.bartlomiejpluta.base.api.game.gui.base.GUI; +import com.bartlomiejpluta.base.api.game.gui.base.SizeMode; +import com.bartlomiejpluta.base.api.game.screen.Screen; + +import java.util.Deque; +import java.util.LinkedList; + +import static java.util.Objects.requireNonNull; + +public class DefaultWindowManager extends BaseWidget implements WindowManager { + private final Deque windows = new LinkedList<>(); + private DisplayMode displayMode = DisplayMode.DISPLAY_STACK; + + public DefaultWindowManager() { + super.setSizeMode(SizeMode.MATCH_PARENT, SizeMode.MATCH_PARENT); + } + + @Override + protected float getContentWidth() { + return 0; + } + + @Override + protected float getContentHeight() { + return 0; + } + + @Override + public void setSizeMode(SizeMode widthMode, SizeMode heightMode) { + throw new UnsupportedOperationException("Window Manager is hardcoded to be of MATCH_PARENT mode"); + } + + @Override + public void setWidthMode(SizeMode mode) { + throw new UnsupportedOperationException("Window Manager is hardcoded to be of MATCH_PARENT mode"); + } + + @Override + public void setHeightMode(SizeMode mode) { + throw new UnsupportedOperationException("Window Manager is hardcoded to be of MATCH_PARENT mode"); + } + + @Override + public void setDisplayMode(DisplayMode mode) { + this.displayMode = requireNonNull(mode); + } + + @Override + public void open(Window window) { + requireNonNull(window, "Window cannot be null"); + + windows.push(window); + window.setParent(this); + window.onOpen(this); + } + + @Override + public void close() { + var window = windows.pop(); + window.setParent(null); + window.onClose(this); + } + + @Override + public void draw(Screen screen, GUI gui) { + switch (displayMode) { + case DISPLAY_STACK -> { + for (var window : windows) { + window.draw(screen, gui); + } + } + + case DISPLAY_TOP -> { + var topWindow = windows.peekFirst(); + if (topWindow != null) { + topWindow.draw(screen, gui); + } + } + } + } +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DisplayMode.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DisplayMode.java new file mode 100644 index 00000000..b657b39f --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DisplayMode.java @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.api.game.gui.window; + +public enum DisplayMode { + DISPLAY_STACK, + DISPLAY_TOP +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/Window.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/Window.java new file mode 100644 index 00000000..eef310ff --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/Window.java @@ -0,0 +1,9 @@ +package com.bartlomiejpluta.base.api.game.gui.window; + +import com.bartlomiejpluta.base.api.game.gui.base.Widget; + +public interface Window extends Widget { + void onOpen(WindowManager manager); + + void onClose(WindowManager manager); +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/WindowManager.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/WindowManager.java new file mode 100644 index 00000000..8b1132aa --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/WindowManager.java @@ -0,0 +1,11 @@ +package com.bartlomiejpluta.base.api.game.gui.window; + +import com.bartlomiejpluta.base.api.game.gui.base.Widget; + +public interface WindowManager extends Widget { + void setDisplayMode(DisplayMode mode); + + void open(Window window); + + void close(); +} diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/widget/ScreenWidget.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/widget/ScreenWidget.java index 6d5e62bf..4e3ee620 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/widget/ScreenWidget.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/widget/ScreenWidget.java @@ -21,11 +21,21 @@ public class ScreenWidget implements Widget { return screen.getWidth(); } + @Override + public float getActualWidth() { + return screen.getWidth(); + } + @Override public float getHeight() { return screen.getHeight(); } + @Override + public float getActualHeight() { + return screen.getWidth(); + } + @Override public Widget getParent() { return null;