From ecc420d2a57b1b1f853b3b0138abed289b9300c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 17 Mar 2021 23:45:47 +0100 Subject: [PATCH] Make *OptionChoice components scrollable --- .../api/game/gui/component/HOptionChoice.java | 16 ++++++++++++++-- .../api/game/gui/component/VOptionChoice.java | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HOptionChoice.java index 930c4f6c..41d55144 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HOptionChoice.java @@ -8,7 +8,7 @@ import com.bartlomiejpluta.base.api.game.input.KeyEvent; import java.util.EnumSet; -public class HOptionChoice extends HLayout { +public class HOptionChoice extends HScrollableLayout { private static final EnumSet ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private int selected = 0; @@ -43,17 +43,29 @@ public class HOptionChoice extends HLayout { blurAll(); selected = (++selected) % children.size(); children.get(selected).focus(); + scrollToSelected(); event.consume(); - } else if (event.getKey() == Key.KEY_LEFT && ACTIONS.contains(event.getAction())) { blurAll(); var size = children.size(); selected = (((--selected) % size) + size) % size; children.get(selected).focus(); + scrollToSelected(); event.consume(); } } + private void scrollToSelected() { + var childrenWidth = 0.0f; + + for (int i = 0; i < selected; ++i) { + var child = this.children.get(i); + childrenWidth += child.getMarginLeft() + child.getWidth() + child.getMarginRight(); + } + + scrollTo(childrenWidth / getWidth()); + } + private void blurAll() { for (var child : children) { child.blur(); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VOptionChoice.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VOptionChoice.java index 852cf21f..1ff5860c 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VOptionChoice.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VOptionChoice.java @@ -8,7 +8,7 @@ import com.bartlomiejpluta.base.api.game.input.KeyEvent; import java.util.EnumSet; -public class VOptionChoice extends VLayout { +public class VOptionChoice extends VScrollableLayout { private static final EnumSet ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT); private int selected = 0; @@ -43,16 +43,29 @@ public class VOptionChoice extends VLayout { blurAll(); selected = (++selected) % children.size(); children.get(selected).focus(); + scrollToSelected(); event.consume(); } else if (event.getKey() == Key.KEY_UP && ACTIONS.contains(event.getAction())) { blurAll(); var size = children.size(); selected = (((--selected) % size) + size) % size; children.get(selected).focus(); + scrollToSelected(); event.consume(); } } + private void scrollToSelected() { + var childrenHeight = 0.0f; + + for (int i = 0; i < selected; ++i) { + var child = children.get(i); + childrenHeight += child.getMarginTop() + child.getHeight() + child.getMarginBottom(); + } + + scrollTo(childrenHeight / getHeight()); + } + private void blurAll() { for (var child : children) { child.blur();