Fix invalid key event handling in GLFWInput | make GUI does not extend KeyEventHandler interface anymore

This commit is contained in:
2021-04-02 10:59:35 +02:00
parent ccc72d49a7
commit 48ad4208bc
5 changed files with 20 additions and 14 deletions

View File

@@ -1,10 +1,9 @@
package com.bartlomiejpluta.base.api.gui; package com.bartlomiejpluta.base.api.gui;
import com.bartlomiejpluta.base.api.input.KeyEventHandler;
import com.bartlomiejpluta.base.internal.gc.Disposable; import com.bartlomiejpluta.base.internal.gc.Disposable;
import com.bartlomiejpluta.base.internal.render.Renderable; import com.bartlomiejpluta.base.internal.render.Renderable;
public interface GUI extends Renderable, Disposable, KeyEventHandler { public interface GUI extends Renderable, 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

@@ -1,5 +1,7 @@
package com.bartlomiejpluta.base.api.gui; package com.bartlomiejpluta.base.api.gui;
import com.bartlomiejpluta.base.api.context.Context;
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;
@@ -10,15 +12,18 @@ import java.util.LinkedList;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
public final class WindowManager extends BaseWidget { public final class WindowManager extends BaseWidget {
private final Input input;
private final Deque<Window> windows = new LinkedList<>(); private final Deque<Window> windows = new LinkedList<>();
private DisplayMode displayMode; private DisplayMode displayMode;
public WindowManager() { public WindowManager(Context context) {
this(DisplayMode.DISPLAY_STACK); this(context, DisplayMode.DISPLAY_STACK);
} }
public WindowManager(DisplayMode displayMode) { public WindowManager(Context context, DisplayMode displayMode) {
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;
@@ -56,6 +61,10 @@ public final class WindowManager extends BaseWidget {
public void open(Window window) { public void open(Window window) {
requireNonNull(window, "Window cannot be null"); requireNonNull(window, "Window cannot be null");
if (windows.isEmpty()) {
input.addKeyEventHandler(this);
}
windows.addLast(window); windows.addLast(window);
window.setParent(this); window.setParent(this);
window.onOpen(this); window.onOpen(this);
@@ -77,6 +86,10 @@ public final class WindowManager extends BaseWidget {
var window = windows.removeLast(); var window = windows.removeLast();
window.setParent(null); window.setParent(null);
window.onClose(this); window.onClose(this);
if (windows.isEmpty()) {
input.removeKeyEventHandler(this);
}
} }
public int size() { public int size() {

View File

@@ -3,7 +3,6 @@ package com.bartlomiejpluta.base.engine.gui.render;
import com.bartlomiejpluta.base.api.camera.Camera; import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.*; import com.bartlomiejpluta.base.api.gui.*;
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.engine.error.AppException; import com.bartlomiejpluta.base.engine.error.AppException;
import com.bartlomiejpluta.base.engine.gui.manager.FontManager; import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
@@ -418,11 +417,6 @@ public class NanoVGGUI implements GUI {
nvgResetScissor(nvg); nvgResetScissor(nvg);
} }
@Override
public void handleKeyEvent(KeyEvent event) {
screenWidget.handleKeyEvent(event);
}
@Override @Override
public void dispose() { public void dispose() {
log.info("Disposing GUI color buffers"); log.info("Disposing GUI color buffers");

View File

@@ -234,7 +234,7 @@ public class ScreenWidget implements Widget {
@Override @Override
public void handleKeyEvent(KeyEvent event) { public void handleKeyEvent(KeyEvent event) {
root.handleKeyEvent(event); throw new UnsupportedOperationException();
} }
@Override @Override

View File

@@ -23,7 +23,6 @@ public class GLFWInput implements Input {
this.windowHandle = screen.getID(); this.windowHandle = screen.getID();
} }
@SuppressWarnings("ForLoopReplaceableByForEach")
public GLFWInput init() { public GLFWInput init() {
log.info("Registering key callback"); log.info("Registering key callback");
glfwSetKeyCallback(windowHandle, (window, key, scancode, action, mods) -> { glfwSetKeyCallback(windowHandle, (window, key, scancode, action, mods) -> {
@@ -34,7 +33,8 @@ public class GLFWInput implements Input {
} }
// Use iterator to support removal from loop inside // Use iterator to support removal from loop inside
for (var iterator = keyEventHandlers.iterator(); iterator.hasNext(); ) { // We need also to iterate in FILO order (a stack-based model)
for (var iterator = keyEventHandlers.descendingIterator(); iterator.hasNext(); ) {
if (event.isConsumed()) { if (event.isConsumed()) {
return; return;
} }