From e640170d62c34c7046e6611a3c9ab66657192070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 31 Aug 2022 00:34:11 +0200 Subject: [PATCH] Improve event handling in few lib components --- .../base/lib/gui/BaseComponent.java | 10 ++ .../base/lib/gui/BaseContainer.java | 6 + .../base/lib/gui/BaseWindow.java | 6 + .../base/lib/gui/HGridOptionChoice.java | 152 ++++++++++-------- .../base/lib/gui/HOptionChoice.java | 50 +++--- .../base/lib/gui/VGridOptionChoice.java | 152 ++++++++++-------- .../base/lib/gui/VOptionChoice.java | 50 +++--- 7 files changed, 250 insertions(+), 176 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseComponent.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseComponent.java index 3ce28069..451f676a 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseComponent.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/BaseComponent.java @@ -1,6 +1,7 @@ package com.bartlomiejpluta.base.lib.gui; import com.bartlomiejpluta.base.api.context.Context; +import com.bartlomiejpluta.base.api.event.Event; import com.bartlomiejpluta.base.api.gui.Component; import com.bartlomiejpluta.base.api.gui.GUI; @@ -46,6 +47,15 @@ public abstract class BaseComponent extends BaseWidget implements Component { focused = true; } + @Override + public void handleEvent(E event) { + if(!focused) { + return; + } + + super.handleEvent(event); + } + @Override public void blur() { focused = false; 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 5aac651a..9c3c5274 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 @@ -98,6 +98,12 @@ public abstract class BaseContainer extends BaseComponent { } } + protected void blurChildren() { + for (var child : children) { + child.blur(); + } + } + @Override public void handleEvent(E event) { // Populate event downstream 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 f790863e..1e4f8900 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 @@ -82,6 +82,10 @@ public abstract class BaseWindow extends BaseWidget implements Window { if (content != null) { content.handleEvent(event); } + + if(!event.isConsumed()) { + super.handleEvent(event); + } } @Override @@ -94,10 +98,12 @@ public abstract class BaseWindow extends BaseWidget implements Window { @Override public void onOpen(WindowManager manager, Object[] args) { this.manager = manager; + content.focus(); } @Override public void onClose(WindowManager manager) { this.manager = null; + content.blur(); } } diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HGridOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HGridOptionChoice.java index 658727c1..1683014f 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HGridOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HGridOptionChoice.java @@ -73,6 +73,10 @@ public class HGridOptionChoice extends HGridLayout { @Override public void handleEvent(E event) { + if(!focused) { + return; + } + var index = rows * selectedColumn + selectedRow; if (index < children.size()) { selectedComponent = children.get(index); @@ -90,84 +94,96 @@ public class HGridOptionChoice extends HGridLayout { } if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i / rows == selectedColumn) ++size; - } - - if (size == 0) return; - - selectedRow = (++selectedRow) % size; - selectedComponent = children.get(rows * selectedColumn + selectedRow); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNextV(); event.consume(); } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i / rows == selectedColumn) ++size; - } - - if (size == 0) return; - - selectedRow = ((--selectedRow) + size) % size; - selectedComponent = children.get(rows * selectedColumn + selectedRow); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPreviousV(); event.consume(); } else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i % rows == selectedRow) ++size; - } - - if (size == 0) return; - - selectedColumn = (++selectedColumn) % size; - selectedComponent = children.get(rows * selectedColumn + selectedRow); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNextH(); event.consume(); } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i % rows == selectedRow) ++size; - } - - if (size == 0) return; - - selectedColumn = ((--selectedColumn) + size) % size; - selectedComponent = children.get(rows * selectedColumn + selectedRow); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPreviousH(); event.consume(); } } + public void selectPreviousH() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i % rows == selectedRow) ++size; + } + + if (size == 0) return; + + selectedColumn = ((--selectedColumn) + size) % size; + selectedComponent = children.get(rows * selectedColumn + selectedRow); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNextH() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i % rows == selectedRow) ++size; + } + + if (size == 0) return; + + selectedColumn = (++selectedColumn) % size; + selectedComponent = children.get(rows * selectedColumn + selectedRow); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectPreviousV() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i / rows == selectedColumn) ++size; + } + + if (size == 0) return; + + selectedRow = ((--selectedRow) + size) % size; + selectedComponent = children.get(rows * selectedColumn + selectedRow); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNextV() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i / rows == selectedColumn) ++size; + } + + if (size == 0) return; + + selectedRow = (++selectedRow) % size; + selectedComponent = children.get(rows * selectedColumn + selectedRow); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + @Override public void update(float dt) { super.update(dt); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HOptionChoice.java index 262cd4e2..30da8290 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/HOptionChoice.java @@ -59,6 +59,10 @@ public class HOptionChoice extends HLayout { @Override public void handleEvent(E event) { + if(!focused) { + return; + } + if (selected < children.size()) { selectedComponent = children.get(selected); selectedComponent.handleEvent(event); @@ -75,31 +79,37 @@ public class HOptionChoice extends HLayout { } if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { - blur(); - selected = (++selected) % children.size(); - selectedComponent = children.get(selected); - selectedComponent.focus(); - - if (onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNext(); event.consume(); } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { - blur(); - var size = children.size(); - selected = (((--selected) % size) + size) % size; - selectedComponent = children.get(selected); - selectedComponent.focus(); - - if (onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPrevious(); event.consume(); } } - + + public void selectPrevious() { + blurChildren(); + var size = children.size(); + selected = (((--selected) % size) + size) % size; + selectedComponent = children.get(selected); + selectedComponent.focus(); + + if (onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNext() { + blurChildren(); + selected = (++selected) % children.size(); + selectedComponent = children.get(selected); + selectedComponent.focus(); + + if (onSelect != null) { + onSelect.accept(selectedComponent); + } + } + @Override public void update(float dt) { super.update(dt); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VGridOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VGridOptionChoice.java index 4c1feebb..8472c302 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VGridOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VGridOptionChoice.java @@ -73,6 +73,10 @@ public class VGridOptionChoice extends VGridLayout { @Override public void handleEvent(E event) { + if(!focused) { + return; + } + var index = columns * selectedRow + selectedColumn; if (index < children.size()) { selectedComponent = children.get(index); @@ -90,84 +94,96 @@ public class VGridOptionChoice extends VGridLayout { } if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i % columns == selectedColumn) ++size; - } - - if (size == 0) return; - - selectedRow = (++selectedRow) % size; - selectedComponent = children.get(columns * selectedRow + selectedColumn); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNextV(); event.consume(); } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i % columns == selectedColumn) ++size; - } - - if (size == 0) return; - - selectedRow = ((--selectedRow) + size) % size; - selectedComponent = children.get(columns * selectedRow + selectedColumn); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPreviousV(); event.consume(); } else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i / columns == selectedRow) ++size; - } - - if (size == 0) return; - - selectedColumn = (++selectedColumn) % size; - selectedComponent = children.get(columns * selectedRow + selectedColumn); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNextH(); event.consume(); } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { - blur(); - - int size = 0; - for (int i = 0; i < children.size(); ++i) { - if (i / columns == selectedRow) ++size; - } - - if (size == 0) return; - - selectedColumn = ((--selectedColumn) + size) % size; - selectedComponent = children.get(columns * selectedRow + selectedColumn); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPreviousH(); event.consume(); } } + public void selectPreviousH() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i / columns == selectedRow) ++size; + } + + if (size == 0) return; + + selectedColumn = ((--selectedColumn) + size) % size; + selectedComponent = children.get(columns * selectedRow + selectedColumn); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNextH() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i / columns == selectedRow) ++size; + } + + if (size == 0) return; + + selectedColumn = (++selectedColumn) % size; + selectedComponent = children.get(columns * selectedRow + selectedColumn); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectPreviousV() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i % columns == selectedColumn) ++size; + } + + if (size == 0) return; + + selectedRow = ((--selectedRow) + size) % size; + selectedComponent = children.get(columns * selectedRow + selectedColumn); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNextV() { + blurChildren(); + + int size = 0; + for (int i = 0; i < children.size(); ++i) { + if (i % columns == selectedColumn) ++size; + } + + if (size == 0) return; + + selectedRow = (++selectedRow) % size; + selectedComponent = children.get(columns * selectedRow + selectedColumn); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + @Override public void update(float dt) { super.update(dt); diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VOptionChoice.java index e4270015..21e1ad6c 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/gui/VOptionChoice.java @@ -59,6 +59,10 @@ public class VOptionChoice extends VLayout { @Override public void handleEvent(E event) { + if(!focused) { + return; + } + if (selected < children.size()) { selectedComponent = children.get(selected); selectedComponent.handleEvent(event); @@ -75,31 +79,37 @@ public class VOptionChoice extends VLayout { } if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { - blur(); - selected = (++selected) % children.size(); - selectedComponent = children.get(selected); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectNext(); event.consume(); } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { - blur(); - var size = children.size(); - selected = (((--selected) % size) + size) % size; - selectedComponent = children.get(selected); - selectedComponent.focus(); - - if(onSelect != null) { - onSelect.accept(selectedComponent); - } - + selectPrevious(); event.consume(); } } - + + public void selectPrevious() { + blurChildren(); + var size = children.size(); + selected = (((--selected) % size) + size) % size; + selectedComponent = children.get(selected); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + + public void selectNext() { + blurChildren(); + selected = (++selected) % children.size(); + selectedComponent = children.get(selected); + selectedComponent.focus(); + + if(onSelect != null) { + onSelect.accept(selectedComponent); + } + } + @Override public void update(float dt) { super.update(dt);