From 4e07ac963cf02f55cddee44d1e2e1b106bd33722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 2 Nov 2023 11:21:09 +0100 Subject: [PATCH] Add support for completable future to carry the Window result --- .../bartlomiejpluta/base/api/gui/Window.java | 2 +- .../base/api/gui/WindowManager.java | 50 +++++++++++-------- .../base/lib/gui/BaseContainer.java | 4 ++ .../base/lib/gui/BaseWindow.java | 14 +++++- 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/gui/Window.java b/api/src/main/java/com/bartlomiejpluta/base/api/gui/Window.java index 442768dd..5d0bb9df 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/gui/Window.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/gui/Window.java @@ -13,7 +13,7 @@ public interface Window extends Widget { T reference(String ref, Class type); - CompletableFuture getFuture(); + CompletableFuture getFuture(); default void onOpen(WindowManager manager, Object[] args) { // do nothing diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/gui/WindowManager.java b/api/src/main/java/com/bartlomiejpluta/base/api/gui/WindowManager.java index 8a6dedac..5e9bb0a4 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/gui/WindowManager.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/gui/WindowManager.java @@ -82,7 +82,7 @@ public final class WindowManager extends BaseWidget { } } - public CompletableFuture open(@NonNull Window window, Object... args) { + public CompletableFuture open(@NonNull Window window, Object... args) { if (windows.isEmpty()) { input.addKeyEventHandler(this::forwardKeyEventToTopWindow); } @@ -94,6 +94,10 @@ public final class WindowManager extends BaseWidget { return window.getFuture(); } + public CompletableFuture openForResult(Class resultClass, @NonNull Window window, Object... args) { + return open(window, args).thenApply(resultClass::cast); + } + private void forwardKeyEventToTopWindow(KeyEvent event) { var topWindow = windows.peekLast(); if (topWindow != null) { @@ -108,7 +112,7 @@ public final class WindowManager extends BaseWidget { } } - public void close() { + public void resolve(Object result) { if (windows.isEmpty()) { return; } @@ -121,7 +125,11 @@ public final class WindowManager extends BaseWidget { input.removeKeyEventHandler(this::forwardKeyEventToTopWindow); } - window.getFuture().complete(window); + window.getFuture().complete(result == null ? window : result); + } + + public void close() { + resolve(null); } public int size() { @@ -175,48 +183,48 @@ public final class WindowManager extends BaseWidget { private void drawWindow(Screen screen, Window window, GUI gui) { switch (window.getWindowPosition()) { case TOP -> window.setPosition( - (screen.getWidth() - window.getWidth()) / 2, - window.getMarginTop() + (screen.getWidth() - window.getWidth()) / 2, + window.getMarginTop() ); case TOP_RIGHT -> window.setPosition( - screen.getWidth() - window.getWidth() - window.getMarginRight(), - window.getMarginTop() + screen.getWidth() - window.getWidth() - window.getMarginRight(), + window.getMarginTop() ); case RIGHT -> window.setPosition( - screen.getWidth() - window.getWidth() - window.getMarginRight(), - (screen.getHeight() - window.getHeight()) / 2 + 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() + 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() + (screen.getWidth() - window.getWidth()) / 2, + screen.getHeight() - window.getHeight() - window.getMarginBottom() ); case BOTTOM_LEFT -> window.setPosition( - window.getMarginLeft(), - screen.getHeight() - window.getHeight() - window.getMarginBottom() + window.getMarginLeft(), + screen.getHeight() - window.getHeight() - window.getMarginBottom() ); case LEFT -> window.setPosition( - window.getMarginLeft(), - (screen.getHeight() - window.getHeight()) / 2 + window.getMarginLeft(), + (screen.getHeight() - window.getHeight()) / 2 ); case TOP_LEFT -> window.setPosition( - window.getMarginLeft(), - window.getMarginTop() + window.getMarginLeft(), + window.getMarginTop() ); case CENTER -> window.setPosition( - (screen.getWidth() - window.getWidth()) / 2, - (screen.getHeight() - window.getHeight()) / 2 + (screen.getWidth() - window.getWidth()) / 2, + (screen.getHeight() - window.getHeight()) / 2 ); } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseContainer.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseContainer.java index 9c3c5274..50627ba3 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseContainer.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseContainer.java @@ -37,6 +37,10 @@ public abstract class BaseContainer extends BaseComponent { component.setParent(null); } + public void removeAllChildren() { + this.children.clear(); + } + protected float maxChildrenWidth() { var theWidestChild = 0.0f; diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWindow.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWindow.java index cd54fdee..c620a3d0 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWindow.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWindow.java @@ -23,7 +23,7 @@ public abstract class BaseWindow extends BaseWidget implements Window { protected WindowPosition windowPosition = WindowPosition.CENTER; @Getter - protected CompletableFuture future; + protected CompletableFuture future; protected BaseWindow(Context context, GUI gui, Map refs) { this.context = context; @@ -31,6 +31,18 @@ public abstract class BaseWindow extends BaseWidget implements Window { this.refs = refs; } + protected void close() { + if (manager != null) { + manager.close(); + } + } + + protected void resolve(Object result) { + if (manager != null) { + manager.resolve(result); + } + } + @Override public void setContent(Component component) { if (this.content != null) {