From d90be792bb1811b32ed604e77185f083b578eb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 17 Mar 2021 22:17:03 +0100 Subject: [PATCH] Improve and rename Scrollables to *ScrollableLayout --- .../base/api/game/gui/component/HLayout.java | 6 ++- ...Scrollable.java => HScrollableLayout.java} | 47 ++++++++----------- .../gui/component/SingleChildContainer.java | 25 ---------- .../base/api/game/gui/component/VLayout.java | 6 ++- ...Scrollable.java => VScrollableLayout.java} | 47 ++++++++----------- 5 files changed, 46 insertions(+), 85 deletions(-) rename api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/{HScrollable.java => HScrollableLayout.java} (71%) delete mode 100644 api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/SingleChildContainer.java rename api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/{VScrollable.java => VScrollableLayout.java} (71%) diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HLayout.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HLayout.java index 1fccfbd3..f67b765a 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HLayout.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HLayout.java @@ -5,6 +5,8 @@ import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.screen.Screen; public class HLayout extends BaseContainer { + protected float offsetX = 0.0f; + protected float offsetY = 0.0f; public HLayout(Context context, GUI gui) { super(context, gui); @@ -22,8 +24,8 @@ public class HLayout extends BaseContainer { @Override public void draw(Screen screen, GUI gui) { - var currentX = x + paddingLeft; - var currentY = y + paddingTop; + var currentX = x + paddingLeft + offsetX; + var currentY = y + paddingTop + offsetY; for (var child : children) { var childAbsX = currentX + child.getMarginLeft(); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollable.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollableLayout.java similarity index 71% rename from api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollable.java rename to api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollableLayout.java index 3e39c4e7..46b729d9 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollable.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/HScrollableLayout.java @@ -11,23 +11,32 @@ import com.bartlomiejpluta.base.api.game.screen.Screen; import static com.bartlomiejpluta.base.api.util.math.MathUtil.clamp; import static java.lang.Math.*; -public class HScrollable extends SingleChildContainer { +public class HScrollableLayout extends HLayout { private float scroll = 0.0f; private float scrollStep = 0.25f; private float scrollSpeed = 0.1f; - private float scrollTarget = 0.0f; - private float scrollPosition = 0.0f; - - public HScrollable(Context context, GUI gui) { + public HScrollableLayout(Context context, GUI gui) { super(context, gui); } - public float getScroll() { + public float getActualScroll() { + return getContentHeight() * -offsetX; + } + + public int getCurrentPage() { + return (int) floor(scroll / scrollStep); + } + + public int getPages() { + return (int) ceil(1 / scrollStep); + } + + public float getTargetScroll() { return scroll; } - public void setScroll(Float scroll) { + public void scrollTo(Float scroll) { this.scroll = clamp(scroll, 0, 1); } @@ -47,11 +56,6 @@ public class HScrollable extends SingleChildContainer { this.scrollSpeed = clamp(scrollSpeed, 0, 1); } - @Override - public void remove(Component component) { - throw new UnsupportedOperationException(); - } - @Override public void setSizeMode(SizeMode widthMode, SizeMode heightMode) { if (widthMode == SizeMode.AUTO || heightMode == SizeMode.AUTO) { @@ -79,16 +83,6 @@ public class HScrollable extends SingleChildContainer { super.setHeightMode(mode); } - @Override - protected float getContentWidth() { - return child.getMarginLeft() + child.getActualWidth() + child.getMarginRight(); - } - - @Override - protected float getContentHeight() { - return child.getMarginTop() + child.getActualHeight() + child.getMarginBottom(); - } - @Override public void handleKeyEvent(KeyEvent event) { super.handleKeyEvent(event); @@ -99,27 +93,24 @@ public class HScrollable extends SingleChildContainer { if (event.getKey() == Key.KEY_RIGHT && (event.getAction() == KeyAction.PRESS || event.getAction() == KeyAction.REPEAT)) { scroll = min(scroll + scrollStep, 1); - scrollTarget = scroll * max(getContentWidth() - getWidth(), 0); event.consume(); } if (event.getKey() == Key.KEY_LEFT && (event.getAction() == KeyAction.PRESS || event.getAction() == KeyAction.REPEAT)) { scroll = max(scroll - scrollStep, 0); - scrollTarget = scroll * max(getContentWidth() - getWidth(), 0); event.consume(); } } @Override public void draw(Screen screen, GUI gui) { - var remainingDistance = scrollTarget - scrollPosition; + var remainingDistance = -scroll * max(getContentWidth() - getWidth(), 0) - offsetX; if (abs(remainingDistance) > scrollSpeed) { - scrollPosition += scrollSpeed * remainingDistance; + offsetX += scrollSpeed * remainingDistance; } gui.clip(x, y, getWidth(), getHeight()); - child.setPosition(x + paddingLeft + child.getMarginLeft() - scrollPosition, y + paddingTop + child.getMarginTop()); - child.draw(screen, gui); + super.draw(screen, gui); gui.resetClip(); } } diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/SingleChildContainer.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/SingleChildContainer.java deleted file mode 100644 index 38cccbb9..00000000 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/SingleChildContainer.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.bartlomiejpluta.base.api.game.gui.component; - -import com.bartlomiejpluta.base.api.game.context.Context; -import com.bartlomiejpluta.base.api.game.gui.base.GUI; - -public abstract class SingleChildContainer extends BaseContainer { - protected Component child; - - protected SingleChildContainer(Context context, GUI gui) { - super(context, gui); - } - - @Override - public void add(Component component) { - children.clear(); - super.add(component); - this.child = component; - } - - @Override - public void remove(Component component) { - super.remove(component); - this.child = null; - } -} diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VLayout.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VLayout.java index f644fbc2..5b111fe9 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VLayout.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VLayout.java @@ -5,6 +5,8 @@ import com.bartlomiejpluta.base.api.game.gui.base.GUI; import com.bartlomiejpluta.base.api.game.screen.Screen; public class VLayout extends BaseContainer { + protected float offsetX = 0.0f; + protected float offsetY = 0.0f; public VLayout(Context context, GUI gui) { super(context, gui); @@ -22,8 +24,8 @@ public class VLayout extends BaseContainer { @Override public void draw(Screen screen, GUI gui) { - var currentX = x + paddingLeft; - var currentY = y + paddingTop; + var currentX = x + paddingLeft + offsetX; + var currentY = y + paddingTop + offsetY; for (var child : children) { var childAbsX = currentX + child.getMarginLeft(); diff --git a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollable.java b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollableLayout.java similarity index 71% rename from api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollable.java rename to api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollableLayout.java index f44d17a0..79fefbb2 100644 --- a/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollable.java +++ b/api/src/main/java/com/bartlomiejpluta/base/api/game/gui/component/VScrollableLayout.java @@ -11,23 +11,32 @@ import com.bartlomiejpluta.base.api.game.screen.Screen; import static com.bartlomiejpluta.base.api.util.math.MathUtil.clamp; import static java.lang.Math.*; -public class VScrollable extends SingleChildContainer { +public class VScrollableLayout extends VLayout { private float scroll = 0.0f; private float scrollStep = 0.25f; private float scrollSpeed = 0.1f; - private float scrollTarget = 0.0f; - private float scrollPosition = 0.0f; - - public VScrollable(Context context, GUI gui) { + public VScrollableLayout(Context context, GUI gui) { super(context, gui); } - public float getScroll() { + public float getActualScroll() { + return getContentHeight() * -offsetY; + } + + public int getCurrentPage() { + return (int) floor(scroll / scrollStep); + } + + public int getPages() { + return (int) ceil(1 / scrollStep); + } + + public float getTargetScroll() { return scroll; } - public void setScroll(Float scroll) { + public void scrollTo(Float scroll) { this.scroll = clamp(scroll, 0, 1); } @@ -47,11 +56,6 @@ public class VScrollable extends SingleChildContainer { this.scrollSpeed = clamp(scrollSpeed, 0, 1); } - @Override - public void remove(Component component) { - throw new UnsupportedOperationException(); - } - @Override public void setSizeMode(SizeMode widthMode, SizeMode heightMode) { if (widthMode == SizeMode.AUTO || heightMode == SizeMode.AUTO) { @@ -79,16 +83,6 @@ public class VScrollable extends SingleChildContainer { super.setHeightMode(mode); } - @Override - protected float getContentWidth() { - return child.getMarginLeft() + child.getActualWidth() + child.getMarginRight(); - } - - @Override - protected float getContentHeight() { - return child.getMarginTop() + child.getActualHeight() + child.getMarginBottom(); - } - @Override public void handleKeyEvent(KeyEvent event) { super.handleKeyEvent(event); @@ -99,27 +93,24 @@ public class VScrollable extends SingleChildContainer { if (event.getKey() == Key.KEY_DOWN && (event.getAction() == KeyAction.PRESS || event.getAction() == KeyAction.REPEAT)) { scroll = min(scroll + scrollStep, 1); - scrollTarget = scroll * max(getContentHeight() - getHeight(), 0); event.consume(); } if (event.getKey() == Key.KEY_UP && (event.getAction() == KeyAction.PRESS || event.getAction() == KeyAction.REPEAT)) { scroll = max(scroll - scrollStep, 0); - scrollTarget = scroll * max(getContentHeight() - getHeight(), 0); event.consume(); } } @Override public void draw(Screen screen, GUI gui) { - var remainingDistance = scrollTarget - scrollPosition; + var remainingDistance = -scroll * max(getContentHeight() - getHeight(), 0) - offsetY; if (abs(remainingDistance) > scrollSpeed) { - scrollPosition += scrollSpeed * remainingDistance; + offsetY += scrollSpeed * remainingDistance; } gui.clip(x, y, getWidth(), getHeight()); - child.setPosition(x + paddingLeft + child.getMarginLeft(), y + paddingTop + child.getMarginTop() - scrollPosition); - child.draw(screen, gui); + super.draw(screen, gui); gui.resetClip(); } }