Create scaffolding for Window API | fix some positioning issues in BaseComponent

This commit is contained in:
2021-03-11 23:21:31 +01:00
parent acf8023fe0
commit bebec73956
12 changed files with 435 additions and 274 deletions

View File

@@ -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;
}
}

View File

@@ -19,8 +19,12 @@ public interface Widget {
float getWidth();
float getActualWidth();
float getHeight();
float getActualHeight();
void setWidth(float width);
void setHeight(float height);

View File

@@ -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 {
}

View File

@@ -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<Component> children = new LinkedList<>();
@Override

View File

@@ -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 {
}

View File

@@ -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);

View File

@@ -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
}
}

View File

@@ -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<Window> 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);
}
}
}
}
}

View File

@@ -0,0 +1,6 @@
package com.bartlomiejpluta.base.api.game.gui.window;
public enum DisplayMode {
DISPLAY_STACK,
DISPLAY_TOP
}

View File

@@ -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);
}

View File

@@ -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();
}

View File

@@ -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;