diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 3be9ffad79a..283d4f8ec62 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -79,6 +79,7 @@ public class CardView extends GameEntityView { this(id0, name0); set(TrackableProperty.Owner, ownerAndController); set(TrackableProperty.Controller, ownerAndController); + set(TrackableProperty.ImageKey, imageKey); } public PlayerView getOwner() { diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 624b0bba28b..fafc8f5e00b 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -363,18 +363,18 @@ public class CardRenderer { g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, HAlignment.LEFT, true); } - public static boolean cardListItemTap(CardView card, float x, float y, int count, boolean compactMode) { + public static boolean cardListItemTap(List cards, int selectedIndex, float x, float y, int count, boolean compactMode) { if (x <= getCardListItemHeight(compactMode) * CARD_ART_RATIO) { - CardZoom.show(card); + CardZoom.show(cards, selectedIndex); return true; } return false; } - public static boolean cardListItemTap(IPaperCard pc, float x, float y, int count, boolean compactMode) { + public static boolean paperCardListItemTap(List cards, int selectedIndex, float x, float y, int count, boolean compactMode) { float cardArtHeight = getCardListItemHeight(compactMode); float cardArtWidth = cardArtHeight * CARD_ART_RATIO; if (x <= cardArtWidth && y <= cardArtHeight) { - CardZoom.show(CardView.getCardForUi(pc)); + CardZoom.show(cards, selectedIndex); return true; } return false; diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index 80b51bdf6a1..4c119009cda 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -1,29 +1,43 @@ package forge.card; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Graphics; +import forge.ImageKeys; import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.game.card.CardView; import forge.item.IPaperCard; +import forge.item.InventoryItem; import forge.toolbox.FList; import forge.toolbox.FOverlay; +import forge.util.FCollectionView; import forge.util.Utils; public class CardZoom extends FOverlay { private static final float TAB_HEIGHT = Utils.AVG_FINGER_HEIGHT; private static final FSkinFont FONT = FSkinFont.get(14); private static final CardZoom cardZoom = new CardZoom(); - private static CardView card; + private static List items; + private static int currentIndex; + private static CardView currentCard, prevCard, nextCard; private static boolean zoomMode = true; - public static void show(final IPaperCard pc0) { - card = CardView.getCardForUi(pc0); - cardZoom.show(); + public static void show(final Object card) { + List cards0 = new ArrayList(); + show(cards0, 0); } - public static void show(final CardView card0) { - card = card0; + public static void show(final FCollectionView items0, int currentIndex0) { + show((List)items0, currentIndex0); + } + public static void show(final List items0, int currentIndex0) { + items = items0; + currentIndex = currentIndex0; + updateVisibleCards(); cardZoom.show(); } @@ -38,6 +52,29 @@ public class CardZoom extends FOverlay { private CardZoom() { } + private static void updateVisibleCards() { + currentCard = getCardView(items.get(currentIndex)); + prevCard = currentIndex > 0 ? getCardView(items.get(currentIndex - 1)) : null; + nextCard = currentIndex < items.size() - 1 ? getCardView(items.get(currentIndex + 1)) : null; + } + + private static CardView getCardView(Object item) { + if (item instanceof Entry) { + item = ((Entry)item).getKey(); + } + if (item instanceof CardView) { + return (CardView)item; + } + if (item instanceof IPaperCard) { + return CardView.getCardForUi((IPaperCard)item); + } + if (item instanceof InventoryItem) { + InventoryItem ii = (InventoryItem)item; + return new CardView(-1, ii.getName(), null, ImageKeys.getImageKey(ii, false)); + } + return new CardView(-1, item.toString()); + } + @Override public boolean tap(float x, float y, int count) { if (y >= getHeight() - TAB_HEIGHT && zoomMode != (x < getWidth() / 2)) { @@ -68,8 +105,8 @@ public class CardZoom extends FOverlay { //draw zoom/details options FSkinColor foreColor; if (zoomMode) { - if (!CardRenderer.drawZoom(g, card, w, y)) { - CardRenderer.drawDetails(g, card, w, y); //draw details if can't draw zoom + if (!CardRenderer.drawZoom(g, currentCard, w, y)) { + CardRenderer.drawDetails(g, currentCard, w, y); //draw details if can't draw zoom } g.fillRect(FList.PRESSED_COLOR, 0, y, x, h); foreColor = FList.FORE_COLOR; @@ -80,7 +117,7 @@ public class CardZoom extends FOverlay { g.drawText("Zoom", FONT, foreColor, 0, y, x, h, false, HAlignment.CENTER, true); if (!zoomMode) { - CardRenderer.drawDetails(g, card, w, y); + CardRenderer.drawDetails(g, currentCard, w, y); g.fillRect(FList.PRESSED_COLOR, x, y, w - x, h); foreColor = FList.FORE_COLOR; } diff --git a/forge-gui-mobile/src/forge/itemmanager/CardManager.java b/forge-gui-mobile/src/forge/itemmanager/CardManager.java index d4e9e713cc3..c347d6c5762 100644 --- a/forge-gui-mobile/src/forge/itemmanager/CardManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/CardManager.java @@ -60,13 +60,13 @@ public class CardManager extends ItemManager { } @Override - public boolean tap(Entry value, float x, float y, int count) { - return CardRenderer.cardListItemTap(value.getKey(), x, y, count, compactModeHandler.isCompactMode()); + public boolean tap(Integer index, Entry value, float x, float y, int count) { + return CardRenderer.cardListItemTap(model.getOrderedList(), index, x, y, count, compactModeHandler.isCompactMode()); } @Override - public boolean longPress(Entry value, float x, float y) { - CardZoom.show(value.getKey()); + public boolean longPress(Integer index, Entry value, float x, float y) { + CardZoom.show(getFilteredItems().toFlatList(), index); return true; } }; diff --git a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java index 0e700447d03..2e7d2d752bd 100644 --- a/forge-gui-mobile/src/forge/itemmanager/DeckManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/DeckManager.java @@ -92,7 +92,7 @@ public final class DeckManager extends ItemManager implements IHasGam } @Override - public boolean tap(Entry value, float x, float y, int count) { + public boolean tap(Integer index, Entry value, float x, float y, int count) { float bottomRight = IMAGE_SIZE + 2 * FList.PADDING; if (x <= bottomRight && y <= bottomRight) { DeckPreferences prefs = DeckPreferences.getPrefs(value.getKey()); @@ -103,7 +103,7 @@ public final class DeckManager extends ItemManager implements IHasGam } @Override - public boolean longPress(Entry value, float x, float y) { + public boolean longPress(Integer index, Entry value, float x, float y) { FDeckViewer.show(value.getKey().getDeck()); return true; } diff --git a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java index 8ea8e84c5e4..24bbb769aeb 100644 --- a/forge-gui-mobile/src/forge/itemmanager/ItemManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/ItemManager.java @@ -55,7 +55,7 @@ import java.util.Map.Entry; public abstract class ItemManager extends FContainer implements IItemManager { private ItemPool pool; - private final ItemManagerModel model; + protected final ItemManagerModel model; private Predicate filterPredicate = null; private final List> filters = new ArrayList>(); private boolean hideFilters = false; @@ -254,8 +254,8 @@ public abstract class ItemManager extends FContainer im public abstract class ItemRenderer { public abstract float getItemHeight(); - public abstract boolean tap(Entry value, float x, float y, int count); - public abstract boolean longPress(Entry value, float x, float y); + public abstract boolean tap(Integer index, Entry value, float x, float y, int count); + public abstract boolean longPress(Integer index, Entry value, float x, float y); public abstract void drawValue(Graphics g, Entry value, FSkinFont font, FSkinColor foreColor, FSkinColor backColor, boolean pressed, float x, float y, float w, float h); } public abstract ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler); diff --git a/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java b/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java index 5944492a40e..5841a590882 100644 --- a/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java +++ b/forge-gui-mobile/src/forge/itemmanager/SpellShopManager.java @@ -86,17 +86,17 @@ public final class SpellShopManager extends ItemManager { } @Override - public boolean tap(Entry value, float x, float y, int count) { + public boolean tap(Integer index, Entry value, float x, float y, int count) { if (value.getKey() instanceof PaperCard) { - return CardRenderer.cardListItemTap((PaperCard)value.getKey(), x, y, count, compactModeHandler.isCompactMode()); + return CardRenderer.cardListItemTap(model.getOrderedList(), index, x, y, count, compactModeHandler.isCompactMode()); } return false; } @Override - public boolean longPress(Entry value, float x, float y) { + public boolean longPress(Integer index, Entry value, float x, float y) { if (value.getKey() instanceof PaperCard) { - CardZoom.show((PaperCard)value.getKey()); + CardZoom.show(model.getOrderedList(), index); return true; } return false; diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 8bc86d85868..494c8311a65 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -12,8 +12,6 @@ import forge.card.CardRenderer; import forge.card.CardRenderer.CardStackPosition; import forge.card.CardZoom; import forge.deck.DeckProxy; -import forge.game.card.CardView; -import forge.item.IPaperCard; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.itemmanager.ColumnDef; @@ -873,8 +871,8 @@ public class ImageView extends ItemView { @Override public boolean longPress(float x, float y) { ItemInfo item = getItemAtPoint(x + getLeft(), y + getTop()); - if (item != null && item.item instanceof IPaperCard) { - CardZoom.show(CardView.getCardForUi((IPaperCard) item.item)); + if (item != null) { + CardZoom.show(orderedItems, orderedItems.indexOf(item)); return true; } return false; diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java index 4dc58936a7d..a79ae4fba7b 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java @@ -218,7 +218,7 @@ public final class ItemListView extends ItemView { else { setSelectedIndex(index); } - if (renderer.tap(value, x, y, count)) { + if (renderer.tap(index, value, x, y, count)) { prevTapIndex = index; return true; //don't activate if renderer handles tap } @@ -234,7 +234,7 @@ public final class ItemListView extends ItemView { @Override public boolean showMenu(Integer index, Entry value, FDisplayObject owner, float x, float y) { - return renderer.longPress(value, x, y); + return renderer.longPress(index, value, x, y); } @Override diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 84584c409eb..4ba31f524be 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -265,7 +265,8 @@ public abstract class VCardDisplayArea extends VDisplayArea { public void run() { if (!selectCard(false)) { //if no cards in stack can be selected, just show zoom/details for card - CardZoom.show(getCard()); + List cards = displayArea.orderedCards; + CardZoom.show(cards, cards.indexOf(getCard())); } } }); @@ -308,7 +309,8 @@ public abstract class VCardDisplayArea extends VDisplayArea { @Override public boolean longPress(float x, float y) { if (renderedCardContains(x, y)) { - CardZoom.show(getCard()); + List cards = displayArea.orderedCards; + CardZoom.show(cards, cards.indexOf(getCard())); return true; } return false; diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index e3fbfdbb6dd..074d2f5a150 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -95,7 +95,7 @@ public class FChoiceList extends FList { selectedIndices.add(index); onSelectionChange(); } - if (renderer.tap(value, x, y, count)) { + if (renderer.tap(index, value, x, y, count)) { prevTapIndex = index; return true; //don't activate if renderer handles tap } @@ -108,7 +108,7 @@ public class FChoiceList extends FList { @Override public boolean showMenu(Integer index, T value, FDisplayObject owner, float x, float y) { - return renderer.longPress(value, x, y); + return renderer.longPress(index, value, x, y); } @Override @@ -272,8 +272,8 @@ public class FChoiceList extends FList { protected abstract class ItemRenderer { public abstract FSkinFont getDefaultFont(); public abstract float getItemHeight(); - public abstract boolean tap(T value, float x, float y, int count); - public abstract boolean longPress(T value, float x, float y); + public abstract boolean tap(Integer index, T value, float x, float y, int count); + public abstract boolean longPress(Integer index, T value, float x, float y); public abstract void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h); } protected class DefaultItemRenderer extends ItemRenderer { @@ -291,12 +291,12 @@ public class FChoiceList extends FList { } @Override - public boolean tap(T value, float x, float y, int count) { + public boolean tap(Integer index, T value, float x, float y, int count) { return false; } @Override - public boolean longPress(T value, float x, float y) { + public boolean longPress(Integer index, T value, float x, float y) { return false; } @@ -318,13 +318,13 @@ public class FChoiceList extends FList { } @Override - public boolean tap(T value, float x, float y, int count) { - return CardRenderer.cardListItemTap((PaperCard)value, x, y, count, compactModeHandler.isCompactMode()); + public boolean tap(Integer index, T value, float x, float y, int count) { + return CardRenderer.cardListItemTap(items, index, x, y, count, compactModeHandler.isCompactMode()); } @Override - public boolean longPress(T value, float x, float y) { - CardZoom.show((PaperCard)value); + public boolean longPress(Integer index, T value, float x, float y) { + CardZoom.show(items, index); return true; } @@ -346,13 +346,13 @@ public class FChoiceList extends FList { } @Override - public boolean tap(T value, float x, float y, int count) { - return CardRenderer.cardListItemTap((CardView)value, x, y, count, compactModeHandler.isCompactMode()); + public boolean tap(Integer index, T value, float x, float y, int count) { + return CardRenderer.cardListItemTap(items, index, x, y, count, compactModeHandler.isCompactMode()); } @Override - public boolean longPress(T value, float x, float y) { - CardZoom.show((CardView)value); + public boolean longPress(Integer index, T value, float x, float y) { + CardZoom.show(items, index); return true; } @@ -376,7 +376,7 @@ public class FChoiceList extends FList { } @Override - public boolean tap(T value, float x, float y, int count) { + public boolean tap(Integer index, T value, float x, float y, int count) { if (x <= VStack.CARD_WIDTH + 2 * FList.PADDING) { CardZoom.show(((SpellAbility)value).getView().getHostCard()); return true; @@ -385,7 +385,7 @@ public class FChoiceList extends FList { } @Override - public boolean longPress(T value, float x, float y) { + public boolean longPress(Integer index, T value, float x, float y) { CardZoom.show(((SpellAbility)value).getView().getHostCard()); return true; } @@ -413,12 +413,12 @@ public class FChoiceList extends FList { } @Override - public boolean tap(T value, float x, float y, int count) { + public boolean tap(Integer index, T value, float x, float y, int count) { return false; } @Override - public boolean longPress(T value, float x, float y) { + public boolean longPress(Integer index, T value, float x, float y) { return false; } diff --git a/forge-gui-mobile/src/forge/toolbox/FList.java b/forge-gui-mobile/src/forge/toolbox/FList.java index 0643ab63308..030309be386 100644 --- a/forge-gui-mobile/src/forge/toolbox/FList.java +++ b/forge-gui-mobile/src/forge/toolbox/FList.java @@ -23,7 +23,7 @@ public class FList extends FScrollPane implements Iterable { public static final FSkinColor LINE_COLOR = FORE_COLOR.alphaColor(0.5f); public static final float LINE_THICKNESS = Utils.scale(1); - private final List items = new ArrayList(); + protected final List items = new ArrayList(); private FSkinFont font; private ListItemRenderer renderer; private int pressedIndex = -1;