diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/gui/GUI.java b/api/src/main/java/com/bartlomiejpluta/base/api/gui/GUI.java index 3d25ebc9..fe7c6fe8 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/gui/GUI.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/gui/GUI.java @@ -1,9 +1,10 @@ package com.bartlomiejpluta.base.api.gui; import com.bartlomiejpluta.base.internal.gc.Disposable; +import com.bartlomiejpluta.base.internal.logic.Updatable; import com.bartlomiejpluta.base.internal.render.Renderable; -public interface GUI extends Renderable, Disposable { +public interface GUI extends Renderable, Updatable, Disposable { int ALIGN_LEFT = 1 << 0; int ALIGN_CENTER = 1 << 1; int ALIGN_RIGHT = 1 << 2; diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/gui/UpdateMode.java b/api/src/main/java/com/bartlomiejpluta/base/api/gui/UpdateMode.java new file mode 100644 index 00000000..d1a0f07e --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/api/gui/UpdateMode.java @@ -0,0 +1,6 @@ +package com.bartlomiejpluta.base.api.gui; + +public enum UpdateMode { + UPDATE_ALL, + UPDATE_TOP +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/gui/Widget.java b/api/src/main/java/com/bartlomiejpluta/base/api/gui/Widget.java index 0277f3dc..4b2039fd 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/gui/Widget.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/gui/Widget.java @@ -2,8 +2,9 @@ package com.bartlomiejpluta.base.api.gui; import com.bartlomiejpluta.base.api.event.Reactive; import com.bartlomiejpluta.base.api.screen.Screen; +import com.bartlomiejpluta.base.internal.logic.Updatable; -public interface Widget extends Reactive { +public interface Widget extends Updatable, Reactive { Widget getParent(); void setParent(Widget parent); 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 3ab54eb2..020596bd 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 @@ -5,6 +5,8 @@ import com.bartlomiejpluta.base.api.input.Input; import com.bartlomiejpluta.base.api.input.KeyEvent; import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.lib.gui.BaseWidget; +import lombok.NonNull; +import lombok.Setter; import java.util.Deque; import java.util.LinkedList; @@ -15,18 +17,25 @@ public final class WindowManager extends BaseWidget { private final Input input; private final Deque windows = new LinkedList<>(); + @NonNull + @Setter private DisplayMode displayMode; + @NonNull + @Setter + private UpdateMode updateMode; + public WindowManager(Context context) { - this(context, DisplayMode.DISPLAY_STACK); + this(context, DisplayMode.DISPLAY_STACK, UpdateMode.UPDATE_ALL); } - public WindowManager(Context context, DisplayMode displayMode) { + public WindowManager(Context context, DisplayMode displayMode, UpdateMode updateMode) { this.input = context.getInput(); super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE); super.setSize(1f, 1f); this.displayMode = displayMode; + this.updateMode = updateMode; } @Override @@ -54,10 +63,6 @@ public final class WindowManager extends BaseWidget { 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"); @@ -78,7 +83,6 @@ public final class WindowManager extends BaseWidget { } public void closeAll() { - // Use iterator to support removal from loop inside for (var iterator = windows.iterator(); iterator.hasNext(); ) { close(); @@ -103,6 +107,24 @@ public final class WindowManager extends BaseWidget { return windows.size(); } + @Override + public void update(float dt) { + switch (updateMode) { + case UPDATE_ALL -> { + for (var window : windows) { + window.update(dt); + } + } + + case UPDATE_TOP -> { + var topWindow = windows.peekLast(); + if (topWindow != null) { + topWindow.update(dt); + } + } + } + } + @Override public void draw(Screen screen, GUI gui) { switch (displayMode) { 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 2b184e8f..87573b5a 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 @@ -104,4 +104,11 @@ public abstract class BaseContainer extends BaseComponent { eventHandler.handleEvent(event); } + + @Override + public void update(float dt) { + for (var child : children) { + child.update(dt); + } + } } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWidget.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWidget.java index b912206c..8e8321f8 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWidget.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseWidget.java @@ -287,6 +287,11 @@ public abstract class BaseWidget implements Widget { eventHandler.handleEvent(event); } + @Override + public void update(float dt) { + // do nothing + } + protected void addEventListener(EventType type, Consumer listener) { eventHandler.addListener(type, listener); } 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 fe6918f9..7833b757 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 @@ -65,6 +65,13 @@ public abstract class BaseWindow extends BaseWidget implements Window { } } + @Override + public void update(float dt) { + if (content != null) { + content.update(dt); + } + } + @Override public void onOpen(WindowManager manager) { this.manager = manager; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java index 06d34b64..05846760 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/context/model/DefaultContext.java @@ -288,6 +288,10 @@ public class DefaultContext implements Context { } } + for (var gui : guis) { + gui.update(dt); + } + for (var iterator = sounds.iterator(); iterator.hasNext(); ) { var sound = iterator.next(); if (sound.isStopped()) { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java index 05afbc82..685336ba 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/gui/render/NanoVGGUI.java @@ -56,6 +56,11 @@ public class NanoVGGUI implements GUI { screenWidget = new ScreenWidget(screen); } + @Override + public void update(float dt) { + screenWidget.update(dt); + } + @Override public void render(Screen screen, Camera camera, ShaderManager shaderManager) { if (!visible) { 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 e06eb4fd..a1622971 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 @@ -237,6 +237,13 @@ public class ScreenWidget implements Widget { throw new UnsupportedOperationException(); } + @Override + public void update(float dt) { + if (root != null) { + root.update(dt); + } + } + @Override public void draw(Screen screen, GUI gui) { if (root != null) {