From d063679c3a12c204573cad4d38c66a023f79f514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 13 Mar 2021 13:51:46 +0100 Subject: [PATCH] Refactor Window Manager and fix invalid top window pointer --- .../game/gui/window/DefaultWindowManager.java | 160 ------------------ .../api/game/gui/window/WindowManager.java | 160 +++++++++++++++++- 2 files changed, 151 insertions(+), 169 deletions(-) delete mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DefaultWindowManager.java 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 deleted file mode 100644 index 19908510..00000000 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/window/DefaultWindowManager.java +++ /dev/null @@ -1,160 +0,0 @@ -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.input.KeyEvent; -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.addLast(window); - window.setParent(this); - window.onOpen(this); - } - - @Override - public void closeAll() { - for (var window : windows) { - close(); - } - } - - @Override - public void close() { - if (windows.isEmpty()) { - return; - } - - var window = windows.removeLast(); - window.setParent(null); - window.onClose(this); - } - - @Override - public int size() { - return windows.size(); - } - - @Override - public void draw(Screen screen, GUI gui) { - switch (displayMode) { - case DISPLAY_STACK -> { - for (var window : windows) { - drawWindow(screen, window, gui); - } - } - - case DISPLAY_TOP -> { - var topWindow = windows.peekFirst(); - if (topWindow != null) { - drawWindow(screen, topWindow, gui); - } - } - } - } - - @Override - public void handleKeyEvent(KeyEvent event) { - var topWindow = windows.peekFirst(); - if (topWindow != null) { - topWindow.handleKeyEvent(event); - } - } - - private void drawWindow(Screen screen, Window window, GUI gui) { - switch (window.getWindowPosition()) { - case TOP -> window.setPosition( - (screen.getWidth() - window.getWidth()) / 2, - window.getMarginTop() - ); - - case TOP_RIGHT -> window.setPosition( - screen.getWidth() - window.getWidth() - window.getMarginRight(), - window.getMarginTop() - ); - - case RIGHT -> window.setPosition( - screen.getWidth() - window.getWidth() - window.getMarginRight(), - (screen.getHeight() - window.getHeight()) / 2 - ); - - case BOTTOM_RIGHT -> window.setPosition( - screen.getWidth() - window.getWidth() - window.getMarginRight(), - screen.getHeight() - window.getHeight() - window.getMarginBottom() - ); - - case BOTTOM -> window.setPosition( - (screen.getWidth() - window.getWidth()) / 2, - screen.getHeight() - window.getHeight() - window.getMarginBottom() - ); - - case BOTTOM_LEFT -> window.setPosition( - window.getMarginLeft(), - screen.getHeight() - window.getHeight() - window.getMarginBottom() - ); - - case LEFT -> window.setPosition( - window.getMarginLeft(), - (screen.getHeight() - window.getHeight()) / 2 - ); - - case TOP_LEFT -> window.setPosition( - window.getMarginLeft(), - window.getMarginTop() - ); - - case CENTER -> window.setPosition( - (screen.getWidth() - window.getWidth()) / 2, - (screen.getHeight() - window.getHeight()) / 2 - ); - } - - window.draw(screen, gui); - } -} 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 index b9f178bc..7d93f4ef 100644 --- 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 @@ -1,19 +1,161 @@ package com.bartlomiejpluta.base.api.game.gui.window; -import com.bartlomiejpluta.base.api.game.gui.base.Widget; +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.input.KeyEvent; +import com.bartlomiejpluta.base.api.game.screen.Screen; -public interface WindowManager extends Widget { - void setDisplayMode(DisplayMode mode); +import java.util.Deque; +import java.util.LinkedList; - void open(Window window); +import static java.util.Objects.requireNonNull; - void close(); +public final class WindowManager extends BaseWidget { + private final Deque windows = new LinkedList<>(); - int size(); + private DisplayMode displayMode; - default void closeAll() { - for (int i = 0; i < size(); ++i) { + public WindowManager() { + this(DisplayMode.DISPLAY_STACK); + } + + public WindowManager(DisplayMode displayMode) { + super.setSizeMode(SizeMode.MATCH_PARENT, SizeMode.MATCH_PARENT); + this.displayMode = displayMode; + } + + @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"); + } + + public void setDisplayMode(DisplayMode mode) { + this.displayMode = requireNonNull(mode); + } + + public void open(Window window) { + requireNonNull(window, "Window cannot be null"); + + windows.addLast(window); + window.setParent(this); + window.onOpen(this); + } + + public void closeAll() { + for (var ignored : windows) { close(); } } -} + + public void close() { + if (windows.isEmpty()) { + return; + } + + var window = windows.removeLast(); + window.setParent(null); + window.onClose(this); + } + + public int size() { + return windows.size(); + } + + @Override + public void draw(Screen screen, GUI gui) { + switch (displayMode) { + case DISPLAY_STACK -> { + for (var window : windows) { + drawWindow(screen, window, gui); + } + } + + case DISPLAY_TOP -> { + var topWindow = windows.peekLast(); + if (topWindow != null) { + drawWindow(screen, topWindow, gui); + } + } + } + } + + @Override + public void handleKeyEvent(KeyEvent event) { + var topWindow = windows.peekLast(); + if (topWindow != null) { + topWindow.handleKeyEvent(event); + } + } + + private void drawWindow(Screen screen, Window window, GUI gui) { + switch (window.getWindowPosition()) { + case TOP -> window.setPosition( + (screen.getWidth() - window.getWidth()) / 2, + window.getMarginTop() + ); + + case TOP_RIGHT -> window.setPosition( + screen.getWidth() - window.getWidth() - window.getMarginRight(), + window.getMarginTop() + ); + + case RIGHT -> window.setPosition( + screen.getWidth() - window.getWidth() - window.getMarginRight(), + (screen.getHeight() - window.getHeight()) / 2 + ); + + case BOTTOM_RIGHT -> window.setPosition( + screen.getWidth() - window.getWidth() - window.getMarginRight(), + screen.getHeight() - window.getHeight() - window.getMarginBottom() + ); + + case BOTTOM -> window.setPosition( + (screen.getWidth() - window.getWidth()) / 2, + screen.getHeight() - window.getHeight() - window.getMarginBottom() + ); + + case BOTTOM_LEFT -> window.setPosition( + window.getMarginLeft(), + screen.getHeight() - window.getHeight() - window.getMarginBottom() + ); + + case LEFT -> window.setPosition( + window.getMarginLeft(), + (screen.getHeight() - window.getHeight()) / 2 + ); + + case TOP_LEFT -> window.setPosition( + window.getMarginLeft(), + window.getMarginTop() + ); + + case CENTER -> window.setPosition( + (screen.getWidth() - window.getWidth()) / 2, + (screen.getHeight() - window.getHeight()) / 2 + ); + } + + window.draw(screen, gui); + } +} \ No newline at end of file