Make GUI and Widget updatables

This commit is contained in:
2021-04-09 10:14:28 +02:00
parent d3293e3004
commit cf20f390b5
10 changed files with 74 additions and 9 deletions

View File

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

View File

@@ -0,0 +1,6 @@
package com.bartlomiejpluta.base.api.gui;
public enum UpdateMode {
UPDATE_ALL,
UPDATE_TOP
}

View File

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

View File

@@ -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<Window> 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) {

View File

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

View File

@@ -287,6 +287,11 @@ public abstract class BaseWidget implements Widget {
eventHandler.handleEvent(event);
}
@Override
public void update(float dt) {
// do nothing
}
protected <E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener) {
eventHandler.addListener(type, listener);
}

View File

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

View File

@@ -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()) {

View File

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

View File

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