Make GUI and Widget updatables
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.bartlomiejpluta.base.api.gui;
|
||||||
|
|
||||||
|
public enum UpdateMode {
|
||||||
|
UPDATE_ALL,
|
||||||
|
UPDATE_TOP
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user