Expose some helper methods in *OptionChoice components

This commit is contained in:
2022-08-25 19:52:28 +02:00
parent 54b0c9b4b9
commit 0e0ca1e5a3
5 changed files with 139 additions and 39 deletions

View File

@@ -83,6 +83,12 @@ public abstract class BaseContainer extends BaseComponent {
return childrenHeight; return childrenHeight;
} }
@Override
public void focus() {
blur();
super.focus();
}
@Override @Override
public void blur() { public void blur() {
super.blur(); super.blur();

View File

@@ -11,9 +11,11 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.util.math.MathUtil; import com.bartlomiejpluta.base.util.math.MathUtil;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
public class HGridOptionChoice extends HGridLayout { public class HGridOptionChoice extends HGridLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -27,6 +29,9 @@ public class HGridOptionChoice extends HGridLayout {
@Getter @Getter
private Component selectedComponent = null; private Component selectedComponent = null;
@Setter
private Consumer<Component> onSelect;
public HGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) { public HGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs); super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption); addEventListener(KeyEvent.TYPE, this::switchOption);
@@ -56,6 +61,16 @@ public class HGridOptionChoice extends HGridLayout {
} }
} }
public void select(int row, int column) {
selectedRow = row;
selectedColumn = column;
selectedComponent = children.get(rows * selectedColumn + selectedRow);
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
}
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
var index = rows * selectedColumn + selectedRow; var index = rows * selectedColumn + selectedRow;
@@ -69,19 +84,13 @@ public class HGridOptionChoice extends HGridLayout {
} }
} }
private void blurAll() {
for (var child : children) {
child.blur();
}
}
private void switchOption(KeyEvent event) { private void switchOption(KeyEvent event) {
if (children.isEmpty()) { if (children.isEmpty()) {
return; return;
} }
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -93,9 +102,14 @@ public class HGridOptionChoice extends HGridLayout {
selectedRow = (++selectedRow) % size; selectedRow = (++selectedRow) % size;
selectedComponent = children.get(rows * selectedColumn + selectedRow); selectedComponent = children.get(rows * selectedColumn + selectedRow);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -107,9 +121,14 @@ public class HGridOptionChoice extends HGridLayout {
selectedRow = ((--selectedRow) + size) % size; selectedRow = ((--selectedRow) + size) % size;
selectedComponent = children.get(rows * selectedColumn + selectedRow); selectedComponent = children.get(rows * selectedColumn + selectedRow);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -121,9 +140,14 @@ public class HGridOptionChoice extends HGridLayout {
selectedColumn = (++selectedColumn) % size; selectedColumn = (++selectedColumn) % size;
selectedComponent = children.get(rows * selectedColumn + selectedRow); selectedComponent = children.get(rows * selectedColumn + selectedRow);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -135,6 +159,11 @@ public class HGridOptionChoice extends HGridLayout {
selectedColumn = ((--selectedColumn) + size) % size; selectedColumn = ((--selectedColumn) + size) % size;
selectedComponent = children.get(rows * selectedColumn + selectedRow); selectedComponent = children.get(rows * selectedColumn + selectedRow);
selectedComponent.focus(); selectedComponent.focus();
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); event.consume();
} }
} }

View File

@@ -11,9 +11,11 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.util.math.MathUtil; import com.bartlomiejpluta.base.util.math.MathUtil;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
public class HOptionChoice extends HLayout { public class HOptionChoice extends HLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -24,6 +26,9 @@ public class HOptionChoice extends HLayout {
@Getter @Getter
private Component selectedComponent = null; private Component selectedComponent = null;
@Setter
private Consumer<Component> onSelect;
public HOptionChoice(Context context, GUI gui, Map<String, Component> refs) { public HOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs); super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption); addEventListener(KeyEvent.TYPE, this::switchOption);
@@ -43,6 +48,15 @@ public class HOptionChoice extends HLayout {
} }
} }
public void select(int index) {
selected = index;
selectedComponent = children.get(selected);
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
}
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if (selected < children.size()) { if (selected < children.size()) {
@@ -61,24 +75,28 @@ 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())) {
blurAll(); blur();
selected = (++selected) % children.size(); selected = (++selected) % children.size();
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.focus(); 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())) {
blurAll(); blur();
var size = children.size(); var size = children.size();
selected = (((--selected) % size) + size) % size; selected = (((--selected) % size) + size) % size;
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.focus(); selectedComponent.focus();
event.consume();
} if (onSelect != null) {
onSelect.accept(selectedComponent);
} }
private void blurAll() { event.consume();
for (var child : children) {
child.blur();
} }
} }

View File

@@ -11,9 +11,11 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.util.math.MathUtil; import com.bartlomiejpluta.base.util.math.MathUtil;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
public class VGridOptionChoice extends VGridLayout { public class VGridOptionChoice extends VGridLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -27,6 +29,9 @@ public class VGridOptionChoice extends VGridLayout {
@Getter @Getter
private Component selectedComponent = null; private Component selectedComponent = null;
@Setter
private Consumer<Component> onSelect;
public VGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) { public VGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs); super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption); addEventListener(KeyEvent.TYPE, this::switchOption);
@@ -56,6 +61,16 @@ public class VGridOptionChoice extends VGridLayout {
} }
} }
public void select(int row, int column) {
selectedRow = row;
selectedColumn = column;
selectedComponent = children.get(columns * selectedRow + selectedColumn);
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
}
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
var index = columns * selectedRow + selectedColumn; var index = columns * selectedRow + selectedColumn;
@@ -69,19 +84,13 @@ public class VGridOptionChoice extends VGridLayout {
} }
} }
private void blurAll() {
for (var child : children) {
child.blur();
}
}
private void switchOption(KeyEvent event) { private void switchOption(KeyEvent event) {
if (children.isEmpty()) { if (children.isEmpty()) {
return; return;
} }
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) { if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -93,9 +102,14 @@ public class VGridOptionChoice extends VGridLayout {
selectedRow = (++selectedRow) % size; selectedRow = (++selectedRow) % size;
selectedComponent = children.get(columns * selectedRow + selectedColumn); selectedComponent = children.get(columns * selectedRow + selectedColumn);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -107,9 +121,14 @@ public class VGridOptionChoice extends VGridLayout {
selectedRow = ((--selectedRow) + size) % size; selectedRow = ((--selectedRow) + size) % size;
selectedComponent = children.get(columns * selectedRow + selectedColumn); selectedComponent = children.get(columns * selectedRow + selectedColumn);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -121,9 +140,14 @@ public class VGridOptionChoice extends VGridLayout {
selectedColumn = (++selectedColumn) % size; selectedColumn = (++selectedColumn) % size;
selectedComponent = children.get(columns * selectedRow + selectedColumn); selectedComponent = children.get(columns * selectedRow + selectedColumn);
selectedComponent.focus(); 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())) {
blurAll(); blur();
int size = 0; int size = 0;
for (int i = 0; i < children.size(); ++i) { for (int i = 0; i < children.size(); ++i) {
@@ -135,6 +159,11 @@ public class VGridOptionChoice extends VGridLayout {
selectedColumn = ((--selectedColumn) + size) % size; selectedColumn = ((--selectedColumn) + size) % size;
selectedComponent = children.get(columns * selectedRow + selectedColumn); selectedComponent = children.get(columns * selectedRow + selectedColumn);
selectedComponent.focus(); selectedComponent.focus();
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
event.consume(); event.consume();
} }
} }

View File

@@ -11,9 +11,11 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.util.math.MathUtil; import com.bartlomiejpluta.base.util.math.MathUtil;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.Setter;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
public class VOptionChoice extends VLayout { public class VOptionChoice extends VLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -24,6 +26,9 @@ public class VOptionChoice extends VLayout {
@Getter @Getter
private Component selectedComponent = null; private Component selectedComponent = null;
@Setter
private Consumer<Component> onSelect;
public VOptionChoice(Context context, GUI gui, Map<String, Component> refs) { public VOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs); super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption); addEventListener(KeyEvent.TYPE, this::switchOption);
@@ -43,6 +48,15 @@ public class VOptionChoice extends VLayout {
} }
} }
public void select(int index) {
selected = index;
selectedComponent = children.get(selected);
if(onSelect != null) {
onSelect.accept(selectedComponent);
}
}
@Override @Override
public <E extends Event> void handleEvent(E event) { public <E extends Event> void handleEvent(E event) {
if (selected < children.size()) { if (selected < children.size()) {
@@ -61,24 +75,28 @@ 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())) {
blurAll(); blur();
selected = (++selected) % children.size(); selected = (++selected) % children.size();
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.focus(); 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())) {
blurAll(); blur();
var size = children.size(); var size = children.size();
selected = (((--selected) % size) + size) % size; selected = (((--selected) % size) + size) % size;
selectedComponent = children.get(selected); selectedComponent = children.get(selected);
selectedComponent.focus(); selectedComponent.focus();
event.consume();
} if(onSelect != null) {
onSelect.accept(selectedComponent);
} }
private void blurAll() { event.consume();
for (var child : children) {
child.blur();
} }
} }