From 5f30f26d6a47ca1c6a5a485fa4eee26e705fc2be Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 29 Mar 2014 23:29:00 +0000 Subject: [PATCH] Fix so new cards added to a zone are scrolled into view automatically --- .../screens/match/views/VCardDisplayArea.java | 13 +++++-- .../src/forge/screens/match/views/VField.java | 2 +- .../src/forge/toolbox/FContainer.java | 23 +++++++++++++ .../src/forge/toolbox/FScrollPane.java | 34 ++++++++----------- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/forge-m-base/src/forge/screens/match/views/VCardDisplayArea.java b/forge-m-base/src/forge/screens/match/views/VCardDisplayArea.java index 6f1d1fcc99a..98e3acdfc8c 100644 --- a/forge-m-base/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-m-base/src/forge/screens/match/views/VCardDisplayArea.java @@ -25,13 +25,22 @@ public abstract class VCardDisplayArea extends VDisplayArea { protected void refreshCardPanels(List model) { clear(); + + CardAreaPanel newCardPanel = null; for (Card card : model) { - addCard(card); + CardAreaPanel panel = addCard(card); + if (newCardPanel == null && !orderedCards.contains(card)) { + newCardPanel = panel; + } } revalidate(); + + if (newCardPanel != null) { //if new cards added, ensure first new card is scrolled into view + scrollIntoView(newCardPanel); + } } - public CardAreaPanel addCard(final Card card) { + protected CardAreaPanel addCard(final Card card) { CardAreaPanel cardPanel = add(new CardAreaPanel(card)); cardPanels.add(cardPanel); return cardPanel; diff --git a/forge-m-base/src/forge/screens/match/views/VField.java b/forge-m-base/src/forge/screens/match/views/VField.java index 6c96adf0967..aa031d9dd73 100644 --- a/forge-m-base/src/forge/screens/match/views/VField.java +++ b/forge-m-base/src/forge/screens/match/views/VField.java @@ -32,7 +32,7 @@ public class VField extends VZoneDisplay { } @Override - public CardAreaPanel addCard(final Card card) { + protected CardAreaPanel addCard(final Card card) { CardAreaPanel cardPanel = super.addCard(card); //cardPanel.setVisible(false); //hide placeholder until card arrives //TODO: Uncomment when animation set up return cardPanel; diff --git a/forge-m-base/src/forge/toolbox/FContainer.java b/forge-m-base/src/forge/toolbox/FContainer.java index 9bffd4a4cb1..0f0a3066411 100644 --- a/forge-m-base/src/forge/toolbox/FContainer.java +++ b/forge-m-base/src/forge/toolbox/FContainer.java @@ -2,6 +2,8 @@ package forge.toolbox; import java.util.ArrayList; +import com.badlogic.gdx.math.Vector2; + import forge.Forge.Graphics; public abstract class FContainer extends FDisplayObject { @@ -74,4 +76,25 @@ public abstract class FContainer extends FDisplayObject { listeners.add(this); } } + + public Vector2 getChildRelativePosition(FDisplayObject child) { + return getChildRelativePosition(child, 0, 0); + } + + private Vector2 getChildRelativePosition(FDisplayObject child, float offsetX, float offsetY) { + for (FDisplayObject c : children) { //check direct children first + if (child == c) { + return new Vector2(c.getLeft() + offsetX, c.getTop() + offsetY); + } + } + for (FDisplayObject c : children) { //check each child's children next if possible + if (c instanceof FContainer) { + Vector2 pos = ((FContainer)c).getChildRelativePosition(child, c.getLeft() + offsetX, c.getTop() + offsetY); + if (pos != null) { + return pos; + } + } + } + return null; + } } diff --git a/forge-m-base/src/forge/toolbox/FScrollPane.java b/forge-m-base/src/forge/toolbox/FScrollPane.java index 581e5d7b43a..c5523bddaeb 100644 --- a/forge-m-base/src/forge/toolbox/FScrollPane.java +++ b/forge-m-base/src/forge/toolbox/FScrollPane.java @@ -53,36 +53,32 @@ public abstract class FScrollPane extends FContainer { } public void scrollIntoView(FDisplayObject child) { - Vector2 screenPos = getScreenPosition(); - float screenLeft = screenPos.x; - float screenRight = screenLeft + getWidth(); - float screenTop = screenPos.y; - float screenBottom = screenTop + getHeight(); + Vector2 childPos = getChildRelativePosition(child); + if (childPos == null) { return; } //do nothing if not a valid child - Vector2 childScreenPos = child.getScreenPosition(); - float childScreenLeft = childScreenPos.x; - float childScreenRight = childScreenLeft + child.getWidth(); - float childScreenTop = childScreenPos.y; - float childScreenBottom = childScreenTop + child.getHeight(); + float childLeft = childPos.x; + float childRight = childLeft + child.getWidth(); + float childTop = childPos.y; + float childBottom = childTop + child.getHeight(); float dx = 0; - if (childScreenLeft < screenLeft) { - dx = screenLeft - childScreenLeft; + if (childLeft < 0) { + dx = childLeft; } - else if (childScreenRight > screenRight) { - dx = screenRight - childScreenRight; + else if (childRight > getWidth()) { + dx = childRight - getWidth(); } float dy = 0; - if (childScreenTop < screenTop) { - dy = screenTop - childScreenTop; + if (childTop < 0) { + dy = childTop; } - else if (childScreenBottom > screenBottom) { - dy = screenBottom - childScreenBottom; + else if (childBottom > getHeight()) { + dy = childBottom - getHeight(); } if (dx == 0 && dy == 0) { return; } - setScrollPositions(scrollLeft - dx, scrollTop - dy); + setScrollPositions(scrollLeft + dx, scrollTop + dy); } private void setScrollPositions(float scrollLeft0, float scrollTop0) {