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; package com.bartlomiejpluta.base.api.gui;
import com.bartlomiejpluta.base.internal.gc.Disposable; import com.bartlomiejpluta.base.internal.gc.Disposable;
import com.bartlomiejpluta.base.internal.logic.Updatable;
import com.bartlomiejpluta.base.internal.render.Renderable; 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_LEFT = 1 << 0;
int ALIGN_CENTER = 1 << 1; int ALIGN_CENTER = 1 << 1;
int ALIGN_RIGHT = 1 << 2; 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.event.Reactive;
import com.bartlomiejpluta.base.api.screen.Screen; 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(); Widget getParent();
void setParent(Widget parent); 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.input.KeyEvent;
import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.lib.gui.BaseWidget; import com.bartlomiejpluta.base.lib.gui.BaseWidget;
import lombok.NonNull;
import lombok.Setter;
import java.util.Deque; import java.util.Deque;
import java.util.LinkedList; import java.util.LinkedList;
@@ -15,18 +17,25 @@ public final class WindowManager extends BaseWidget {
private final Input input; private final Input input;
private final Deque<Window> windows = new LinkedList<>(); private final Deque<Window> windows = new LinkedList<>();
@NonNull
@Setter
private DisplayMode displayMode; private DisplayMode displayMode;
@NonNull
@Setter
private UpdateMode updateMode;
public WindowManager(Context context) { 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(); this.input = context.getInput();
super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE); super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE);
super.setSize(1f, 1f); super.setSize(1f, 1f);
this.displayMode = displayMode; this.displayMode = displayMode;
this.updateMode = updateMode;
} }
@Override @Override
@@ -54,10 +63,6 @@ public final class WindowManager extends BaseWidget {
throw new UnsupportedOperationException("Window Manager is hardcoded to be of MATCH_PARENT 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) { public void open(Window window) {
requireNonNull(window, "Window cannot be null"); requireNonNull(window, "Window cannot be null");
@@ -78,7 +83,6 @@ public final class WindowManager extends BaseWidget {
} }
public void closeAll() { public void closeAll() {
// Use iterator to support removal from loop inside // Use iterator to support removal from loop inside
for (var iterator = windows.iterator(); iterator.hasNext(); ) { for (var iterator = windows.iterator(); iterator.hasNext(); ) {
close(); close();
@@ -103,6 +107,24 @@ public final class WindowManager extends BaseWidget {
return windows.size(); 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 @Override
public void draw(Screen screen, GUI gui) { public void draw(Screen screen, GUI gui) {
switch (displayMode) { switch (displayMode) {

View File

@@ -104,4 +104,11 @@ public abstract class BaseContainer extends BaseComponent {
eventHandler.handleEvent(event); 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); eventHandler.handleEvent(event);
} }
@Override
public void update(float dt) {
// do nothing
}
protected <E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener) { protected <E extends Event> void addEventListener(EventType<E> type, Consumer<E> listener) {
eventHandler.addListener(type, 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 @Override
public void onOpen(WindowManager manager) { public void onOpen(WindowManager manager) {
this.manager = 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(); ) { for (var iterator = sounds.iterator(); iterator.hasNext(); ) {
var sound = iterator.next(); var sound = iterator.next();
if (sound.isStopped()) { if (sound.isStopped()) {

View File

@@ -56,6 +56,11 @@ public class NanoVGGUI implements GUI {
screenWidget = new ScreenWidget(screen); screenWidget = new ScreenWidget(screen);
} }
@Override
public void update(float dt) {
screenWidget.update(dt);
}
@Override @Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) { public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
if (!visible) { if (!visible) {

View File

@@ -237,6 +237,13 @@ public class ScreenWidget implements Widget {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@Override
public void update(float dt) {
if (root != null) {
root.update(dt);
}
}
@Override @Override
public void draw(Screen screen, GUI gui) { public void draw(Screen screen, GUI gui) {
if (root != null) { if (root != null) {