Refactor Window Manager and fix invalid top window pointer

This commit is contained in:
2021-03-13 13:51:46 +01:00
parent d149187bc8
commit d063679c3a
2 changed files with 151 additions and 169 deletions

View File

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

View File

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