Create *GridOptionChoice components
This commit is contained in:
@@ -8,7 +8,7 @@ import lombok.NonNull;
|
|||||||
public class HGridLayout extends BaseContainer {
|
public class HGridLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
private int rows = 2;
|
protected int rows = 2;
|
||||||
private float[] heights = new float[rows];
|
private float[] heights = new float[rows];
|
||||||
|
|
||||||
public HGridLayout(Context context, GUI gui) {
|
public HGridLayout(Context context, GUI gui) {
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
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;
|
||||||
|
import com.bartlomiejpluta.base.api.input.Key;
|
||||||
|
import com.bartlomiejpluta.base.api.input.KeyAction;
|
||||||
|
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
||||||
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
|
||||||
|
public class HGridOptionChoice extends HGridLayout {
|
||||||
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
|
private int selectedRow = 0;
|
||||||
|
private int selectedColumn = 0;
|
||||||
|
private float scrollX = 0;
|
||||||
|
private float scrollY = 0;
|
||||||
|
private float scrollSpeedX = 1f;
|
||||||
|
private float scrollSpeedY = 1f;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
|
public HGridOptionChoice(Context context, GUI gui) {
|
||||||
|
super(context, gui);
|
||||||
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeed(@NonNull Float scrollSpeed) {
|
||||||
|
var coerced = MathUtil.clamp(scrollSpeed, 0f, 1f);
|
||||||
|
this.scrollSpeedX = coerced;
|
||||||
|
this.scrollSpeedY = coerced;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeedX(@NonNull Float scrollSpeedX) {
|
||||||
|
this.scrollSpeedX = MathUtil.clamp(scrollSpeedX, 0f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeedY(@NonNull Float scrollSpeedY) {
|
||||||
|
this.scrollSpeedY = MathUtil.clamp(scrollSpeedY, 0f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void focus() {
|
||||||
|
super.focus();
|
||||||
|
|
||||||
|
if (!children.isEmpty()) {
|
||||||
|
selectedComponent = children.get(rows * selectedColumn + selectedRow);
|
||||||
|
selectedComponent.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E extends Event> void handleEvent(E event) {
|
||||||
|
var index = rows * selectedColumn + selectedRow;
|
||||||
|
if (index < children.size()) {
|
||||||
|
selectedComponent = children.get(index);
|
||||||
|
selectedComponent.handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!event.isConsumed()) {
|
||||||
|
eventHandler.handleEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void blurAll() {
|
||||||
|
for (var child : children) {
|
||||||
|
child.blur();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void switchOption(KeyEvent event) {
|
||||||
|
if (children.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(float dt) {
|
||||||
|
super.update(dt);
|
||||||
|
|
||||||
|
if (selectedComponent != null) {
|
||||||
|
if (selectedComponent.getX() + selectedComponent.getWidth() > getWidth() + getX()) {
|
||||||
|
scrollX += (selectedComponent.getWidth() + selectedComponent.getX() - (getWidth() + getX())) * scrollSpeedX;
|
||||||
|
} else if (selectedComponent.getX() < getX()) {
|
||||||
|
scrollX += (selectedComponent.getX() - getX()) * scrollSpeedX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedComponent != null) {
|
||||||
|
if (selectedComponent.getY() + selectedComponent.getHeight() > getHeight() + getY()) {
|
||||||
|
scrollY += (selectedComponent.getHeight() + selectedComponent.getY() - (getHeight() + getY())) * scrollSpeedY;
|
||||||
|
} else if (selectedComponent.getY() < getY()) {
|
||||||
|
scrollY += (selectedComponent.getY() - getY()) * scrollSpeedY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Screen screen, GUI gui) {
|
||||||
|
gui.clip(x, y, getWidth(), getHeight());
|
||||||
|
|
||||||
|
offsetX = -scrollX;
|
||||||
|
offsetY = -scrollY;
|
||||||
|
|
||||||
|
super.draw(screen, gui);
|
||||||
|
|
||||||
|
gui.resetClip();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
|
|||||||
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.util.math.MathUtil;
|
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
@@ -17,9 +18,11 @@ 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);
|
||||||
private int selected = 0;
|
private int selected = 0;
|
||||||
private float scroll = 0;
|
private float scroll = 0;
|
||||||
private Component component = null;
|
|
||||||
private float scrollSpeed = 1f;
|
private float scrollSpeed = 1f;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public HOptionChoice(Context context, GUI gui) {
|
public HOptionChoice(Context context, GUI gui) {
|
||||||
super(context, gui);
|
super(context, gui);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
@@ -34,16 +37,16 @@ public class HOptionChoice extends HLayout {
|
|||||||
super.focus();
|
super.focus();
|
||||||
|
|
||||||
if (!children.isEmpty()) {
|
if (!children.isEmpty()) {
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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()) {
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.handleEvent(event);
|
selectedComponent.handleEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!event.isConsumed()) {
|
if (!event.isConsumed()) {
|
||||||
@@ -59,15 +62,15 @@ 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();
|
blurAll();
|
||||||
selected = (++selected) % children.size();
|
selected = (++selected) % children.size();
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
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();
|
blurAll();
|
||||||
var size = children.size();
|
var size = children.size();
|
||||||
selected = (((--selected) % size) + size) % size;
|
selected = (((--selected) % size) + size) % size;
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
event.consume();
|
event.consume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,11 +84,11 @@ public class HOptionChoice extends HLayout {
|
|||||||
@Override
|
@Override
|
||||||
public void update(float dt) {
|
public void update(float dt) {
|
||||||
super.update(dt);
|
super.update(dt);
|
||||||
if (component != null) {
|
if (selectedComponent != null) {
|
||||||
if (component.getX() + component.getWidth() > getWidth() + getX()) {
|
if (selectedComponent.getX() + selectedComponent.getWidth() > getWidth() + getX()) {
|
||||||
scroll += (component.getWidth() + component.getX() - (getWidth() + getX())) * scrollSpeed;
|
scroll += (selectedComponent.getWidth() + selectedComponent.getX() - (getWidth() + getX())) * scrollSpeed;
|
||||||
} else if (component.getX() < getX()) {
|
} else if (selectedComponent.getX() < getX()) {
|
||||||
scroll += (component.getX() - getX()) * scrollSpeed;
|
scroll += (selectedComponent.getX() - getX()) * scrollSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,13 @@ 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.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
public class VGridLayout extends BaseContainer {
|
public class VGridLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
private int columns = 2;
|
protected int columns = 2;
|
||||||
private float[] widths = new float[columns];
|
private float[] widths = new float[columns];
|
||||||
|
|
||||||
public VGridLayout(Context context, GUI gui) {
|
public VGridLayout(Context context, GUI gui) {
|
||||||
|
|||||||
@@ -0,0 +1,174 @@
|
|||||||
|
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;
|
||||||
|
import com.bartlomiejpluta.base.api.input.Key;
|
||||||
|
import com.bartlomiejpluta.base.api.input.KeyAction;
|
||||||
|
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
||||||
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
|
||||||
|
public class VGridOptionChoice extends VGridLayout {
|
||||||
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
|
private int selectedRow = 0;
|
||||||
|
private int selectedColumn = 0;
|
||||||
|
private float scrollX = 0;
|
||||||
|
private float scrollY = 0;
|
||||||
|
private float scrollSpeedX = 1f;
|
||||||
|
private float scrollSpeedY = 1f;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
|
public VGridOptionChoice(Context context, GUI gui) {
|
||||||
|
super(context, gui);
|
||||||
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeed(@NonNull Float scrollSpeed) {
|
||||||
|
var coerced = MathUtil.clamp(scrollSpeed, 0f, 1f);
|
||||||
|
this.scrollSpeedX = coerced;
|
||||||
|
this.scrollSpeedY = coerced;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeedX(@NonNull Float scrollSpeedX) {
|
||||||
|
this.scrollSpeedX = MathUtil.clamp(scrollSpeedX, 0f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScrollSpeedY(@NonNull Float scrollSpeedY) {
|
||||||
|
this.scrollSpeedY = MathUtil.clamp(scrollSpeedY, 0f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void focus() {
|
||||||
|
super.focus();
|
||||||
|
|
||||||
|
if (!children.isEmpty()) {
|
||||||
|
selectedComponent = children.get(columns * selectedRow + selectedColumn);
|
||||||
|
selectedComponent.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E extends Event> void handleEvent(E event) {
|
||||||
|
var index = columns * selectedRow + selectedColumn;
|
||||||
|
if (index < children.size()) {
|
||||||
|
selectedComponent = children.get(index);
|
||||||
|
selectedComponent.handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!event.isConsumed()) {
|
||||||
|
eventHandler.handleEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void blurAll() {
|
||||||
|
for (var child : children) {
|
||||||
|
child.blur();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void switchOption(KeyEvent event) {
|
||||||
|
if (children.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getKey() == Key.KEY_DOWN && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_RIGHT && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
} else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) {
|
||||||
|
blurAll();
|
||||||
|
|
||||||
|
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();
|
||||||
|
event.consume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(float dt) {
|
||||||
|
super.update(dt);
|
||||||
|
|
||||||
|
if (selectedComponent != null) {
|
||||||
|
if (selectedComponent.getY() + selectedComponent.getHeight() > getHeight() + getY()) {
|
||||||
|
scrollY += (selectedComponent.getHeight() + selectedComponent.getY() - (getHeight() + getY())) * scrollSpeedY;
|
||||||
|
} else if (selectedComponent.getY() < getY()) {
|
||||||
|
scrollY += (selectedComponent.getY() - getY()) * scrollSpeedY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedComponent != null) {
|
||||||
|
if (selectedComponent.getX() + selectedComponent.getWidth() > getWidth() + getX()) {
|
||||||
|
scrollX += (selectedComponent.getWidth() + selectedComponent.getX() - (getWidth() + getX())) * scrollSpeedX;
|
||||||
|
} else if (selectedComponent.getX() < getX()) {
|
||||||
|
scrollX += (selectedComponent.getX() - getX()) * scrollSpeedX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Screen screen, GUI gui) {
|
||||||
|
gui.clip(x, y, getWidth(), getHeight());
|
||||||
|
|
||||||
|
offsetY = -scrollY;
|
||||||
|
offsetX = -scrollX;
|
||||||
|
|
||||||
|
super.draw(screen, gui);
|
||||||
|
|
||||||
|
gui.resetClip();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
|
|||||||
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.util.math.MathUtil;
|
import com.bartlomiejpluta.base.util.math.MathUtil;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
@@ -17,9 +18,11 @@ 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);
|
||||||
private int selected = 0;
|
private int selected = 0;
|
||||||
private float scroll = 0;
|
private float scroll = 0;
|
||||||
private Component component = null;
|
|
||||||
private float scrollSpeed = 1f;
|
private float scrollSpeed = 1f;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public VOptionChoice(Context context, GUI gui) {
|
public VOptionChoice(Context context, GUI gui) {
|
||||||
super(context, gui);
|
super(context, gui);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
@@ -34,16 +37,16 @@ public class VOptionChoice extends VLayout {
|
|||||||
super.focus();
|
super.focus();
|
||||||
|
|
||||||
if (!children.isEmpty()) {
|
if (!children.isEmpty()) {
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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()) {
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.handleEvent(event);
|
selectedComponent.handleEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!event.isConsumed()) {
|
if (!event.isConsumed()) {
|
||||||
@@ -59,15 +62,15 @@ 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();
|
blurAll();
|
||||||
selected = (++selected) % children.size();
|
selected = (++selected) % children.size();
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
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();
|
blurAll();
|
||||||
var size = children.size();
|
var size = children.size();
|
||||||
selected = (((--selected) % size) + size) % size;
|
selected = (((--selected) % size) + size) % size;
|
||||||
component = children.get(selected);
|
selectedComponent = children.get(selected);
|
||||||
component.focus();
|
selectedComponent.focus();
|
||||||
event.consume();
|
event.consume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -81,11 +84,11 @@ public class VOptionChoice extends VLayout {
|
|||||||
@Override
|
@Override
|
||||||
public void update(float dt) {
|
public void update(float dt) {
|
||||||
super.update(dt);
|
super.update(dt);
|
||||||
if (component != null) {
|
if (selectedComponent != null) {
|
||||||
if (component.getY() + component.getHeight() > getHeight() + getY()) {
|
if (selectedComponent.getY() + selectedComponent.getHeight() > getHeight() + getY()) {
|
||||||
scroll += (component.getHeight() + component.getY() - (getHeight() + getY())) * scrollSpeed;
|
scroll += (selectedComponent.getHeight() + selectedComponent.getY() - (getHeight() + getY())) * scrollSpeed;
|
||||||
} else if (component.getY() < getY()) {
|
} else if (selectedComponent.getY() < getY()) {
|
||||||
scroll += (component.getY() - getY()) * scrollSpeed;
|
scroll += (selectedComponent.getY() - getY()) * scrollSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user