mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
Refactor so CardZoom can support multiple cards
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 <T> void show(final IPaperCard pc0) {
|
||||
card = CardView.getCardForUi(pc0);
|
||||
cardZoom.show();
|
||||
public static <T> void show(final Object card) {
|
||||
List<Object> cards0 = new ArrayList<Object>();
|
||||
show(cards0, 0);
|
||||
}
|
||||
public static <T> void show(final CardView card0) {
|
||||
card = card0;
|
||||
public static <T> void show(final FCollectionView<?> items0, int currentIndex0) {
|
||||
show((List<?>)items0, currentIndex0);
|
||||
}
|
||||
public static <T> 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;
|
||||
}
|
||||
|
||||
@@ -60,13 +60,13 @@ public class CardManager extends ItemManager<PaperCard> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tap(Entry<PaperCard, Integer> value, float x, float y, int count) {
|
||||
return CardRenderer.cardListItemTap(value.getKey(), x, y, count, compactModeHandler.isCompactMode());
|
||||
public boolean tap(Integer index, Entry<PaperCard, Integer> value, float x, float y, int count) {
|
||||
return CardRenderer.cardListItemTap(model.getOrderedList(), index, x, y, count, compactModeHandler.isCompactMode());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean longPress(Entry<PaperCard, Integer> value, float x, float y) {
|
||||
CardZoom.show(value.getKey());
|
||||
public boolean longPress(Integer index, Entry<PaperCard, Integer> value, float x, float y) {
|
||||
CardZoom.show(getFilteredItems().toFlatList(), index);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -92,7 +92,7 @@ public final class DeckManager extends ItemManager<DeckProxy> implements IHasGam
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tap(Entry<DeckProxy, Integer> value, float x, float y, int count) {
|
||||
public boolean tap(Integer index, Entry<DeckProxy, Integer> 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<DeckProxy> implements IHasGam
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean longPress(Entry<DeckProxy, Integer> value, float x, float y) {
|
||||
public boolean longPress(Integer index, Entry<DeckProxy, Integer> value, float x, float y) {
|
||||
FDeckViewer.show(value.getKey().getDeck());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ import java.util.Map.Entry;
|
||||
|
||||
public abstract class ItemManager<T extends InventoryItem> extends FContainer implements IItemManager<T> {
|
||||
private ItemPool<T> pool;
|
||||
private final ItemManagerModel<T> model;
|
||||
protected final ItemManagerModel<T> model;
|
||||
private Predicate<? super T> filterPredicate = null;
|
||||
private final List<ItemFilter<? extends T>> filters = new ArrayList<ItemFilter<? extends T>>();
|
||||
private boolean hideFilters = false;
|
||||
@@ -254,8 +254,8 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
|
||||
|
||||
public abstract class ItemRenderer {
|
||||
public abstract float getItemHeight();
|
||||
public abstract boolean tap(Entry<T, Integer> value, float x, float y, int count);
|
||||
public abstract boolean longPress(Entry<T, Integer> value, float x, float y);
|
||||
public abstract boolean tap(Integer index, Entry<T, Integer> value, float x, float y, int count);
|
||||
public abstract boolean longPress(Integer index, Entry<T, Integer> value, float x, float y);
|
||||
public abstract void drawValue(Graphics g, Entry<T, Integer> value, FSkinFont font, FSkinColor foreColor, FSkinColor backColor, boolean pressed, float x, float y, float w, float h);
|
||||
}
|
||||
public abstract ItemRenderer getListItemRenderer(final CompactModeHandler compactModeHandler);
|
||||
|
||||
@@ -86,17 +86,17 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean tap(Entry<InventoryItem, Integer> value, float x, float y, int count) {
|
||||
public boolean tap(Integer index, Entry<InventoryItem, Integer> 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<InventoryItem, Integer> value, float x, float y) {
|
||||
public boolean longPress(Integer index, Entry<InventoryItem, Integer> value, float x, float y) {
|
||||
if (value.getKey() instanceof PaperCard) {
|
||||
CardZoom.show((PaperCard)value.getKey());
|
||||
CardZoom.show(model.getOrderedList(), index);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -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<T extends InventoryItem> extends ItemView<T> {
|
||||
@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;
|
||||
|
||||
@@ -218,7 +218,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
|
||||
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<T extends InventoryItem> extends ItemView<T> {
|
||||
|
||||
@Override
|
||||
public boolean showMenu(Integer index, Entry<T, Integer> value, FDisplayObject owner, float x, float y) {
|
||||
return renderer.longPress(value, x, y);
|
||||
return renderer.longPress(index, value, x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -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<CardView> 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<CardView> cards = displayArea.orderedCards;
|
||||
CardZoom.show(cards, cards.indexOf(getCard()));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -95,7 +95,7 @@ public class FChoiceList<T> extends FList<T> {
|
||||
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<T> extends FList<T> {
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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<T> extends FList<T> {
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ public class FList<T> extends FScrollPane implements Iterable<T> {
|
||||
public static final FSkinColor LINE_COLOR = FORE_COLOR.alphaColor(0.5f);
|
||||
public static final float LINE_THICKNESS = Utils.scale(1);
|
||||
|
||||
private final List<T> items = new ArrayList<T>();
|
||||
protected final List<T> items = new ArrayList<T>();
|
||||
private FSkinFont font;
|
||||
private ListItemRenderer<T> renderer;
|
||||
private int pressedIndex = -1;
|
||||
|
||||
Reference in New Issue
Block a user