Improve event handling in few lib components

This commit is contained in:
2022-08-31 00:34:11 +02:00
parent ecb2c09636
commit e640170d62
7 changed files with 250 additions and 176 deletions

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.lib.gui; package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context; 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.Component;
import com.bartlomiejpluta.base.api.gui.GUI; import com.bartlomiejpluta.base.api.gui.GUI;
@@ -46,6 +47,15 @@ public abstract class BaseComponent extends BaseWidget implements Component {
focused = true; focused = true;
} }
@Override
public <E extends Event> void handleEvent(E event) {
if(!focused) {
return;
}
super.handleEvent(event);
}
@Override @Override
public void blur() { public void blur() {
focused = false; focused = false;

View File

@@ -98,6 +98,12 @@ public abstract class BaseContainer extends BaseComponent {
} }
} }
protected void blurChildren() {
for (var child : children) {
child.blur();
}
}
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
// Populate event downstream // Populate event downstream

View File

@@ -82,6 +82,10 @@ public abstract class BaseWindow extends BaseWidget implements Window {
if (content != null) { if (content != null) {
content.handleEvent(event); content.handleEvent(event);
} }
if(!event.isConsumed()) {
super.handleEvent(event);
}
} }
@Override @Override
@@ -94,10 +98,12 @@ public abstract class BaseWindow extends BaseWidget implements Window {
@Override @Override
public void onOpen(WindowManager manager, Object[] args) { public void onOpen(WindowManager manager, Object[] args) {
this.manager = manager; this.manager = manager;
content.focus();
} }
@Override @Override
public void onClose(WindowManager manager) { public void onClose(WindowManager manager) {
this.manager = null; this.manager = null;
content.blur();
} }
} }

View File

@@ -73,6 +73,10 @@ public class HGridOptionChoice extends HGridLayout {
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if(!focused) {
return;
}
var index = rows * selectedColumn + selectedRow; var index = rows * selectedColumn + selectedRow;
if (index < children.size()) { if (index < children.size()) {
selectedComponent = children.get(index); selectedComponent = children.get(index);
@@ -90,84 +94,96 @@ public class HGridOptionChoice extends HGridLayout {
} }
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
blur(); selectNextV();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) {
blur(); selectPreviousV();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) {
blur(); selectNextH();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) {
blur(); selectPreviousH();
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);
}
event.consume(); 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 @Override
public void update(float dt) { public void update(float dt) {
super.update(dt); super.update(dt);

View File

@@ -59,6 +59,10 @@ public class HOptionChoice extends HLayout {
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if(!focused) {
return;
}
if (selected < children.size()) { if (selected < children.size()) {
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.handleEvent(event); selectedComponent.handleEvent(event);
@@ -75,31 +79,37 @@ public class HOptionChoice extends HLayout {
} }
if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) {
blur(); selectNext();
selected = (++selected) % children.size();
selectedComponent = children.get(selected);
selectedComponent.focus();
if (onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) {
blur(); selectPrevious();
var size = children.size();
selected = (((--selected) % size) + size) % size;
selectedComponent = children.get(selected);
selectedComponent.focus();
if (onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); 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 @Override
public void update(float dt) { public void update(float dt) {
super.update(dt); super.update(dt);

View File

@@ -73,6 +73,10 @@ public class VGridOptionChoice extends VGridLayout {
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if(!focused) {
return;
}
var index = columns * selectedRow + selectedColumn; var index = columns * selectedRow + selectedColumn;
if (index < children.size()) { if (index < children.size()) {
selectedComponent = children.get(index); selectedComponent = children.get(index);
@@ -90,84 +94,96 @@ public class VGridOptionChoice extends VGridLayout {
} }
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
blur(); selectNextV();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) {
blur(); selectPreviousV();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) {
blur(); selectNextH();
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);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) {
blur(); selectPreviousH();
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);
}
event.consume(); 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 @Override
public void update(float dt) { public void update(float dt) {
super.update(dt); super.update(dt);

View File

@@ -59,6 +59,10 @@ public class VOptionChoice extends VLayout {
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if(!focused) {
return;
}
if (selected < children.size()) { if (selected < children.size()) {
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.handleEvent(event); selectedComponent.handleEvent(event);
@@ -75,31 +79,37 @@ public class VOptionChoice extends VLayout {
} }
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
blur(); selectNext();
selected = (++selected) % children.size();
selectedComponent = children.get(selected);
selectedComponent.focus();
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); event.consume();
} else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) {
blur(); selectPrevious();
var size = children.size();
selected = (((--selected) % size) + size) % size;
selectedComponent = children.get(selected);
selectedComponent.focus();
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); 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 @Override
public void update(float dt) { public void update(float dt) {
super.update(dt); super.update(dt);