Make zoom activation more flexible

This commit is contained in:
drdev
2014-11-30 19:02:41 +00:00
parent 7857f996e1
commit 15a102e895
8 changed files with 82 additions and 90 deletions

View File

@@ -21,6 +21,7 @@ import forge.assets.FSkinImage;
import forge.assets.FTextureRegionImage; import forge.assets.FTextureRegionImage;
import forge.assets.ImageCache; import forge.assets.ImageCache;
import forge.card.CardDetailUtil.DetailColors; import forge.card.CardDetailUtil.DetailColors;
import forge.card.CardZoom.ActivateHandler;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.game.card.CardView; import forge.game.card.CardView;
import forge.game.card.CardView.CardStateView; import forge.game.card.CardView.CardStateView;
@@ -29,7 +30,6 @@ import forge.match.MatchUtil;
import forge.model.FModel; import forge.model.FModel;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FList; import forge.toolbox.FList;
import forge.util.Callback;
import forge.util.Utils; import forge.util.Utils;
public class CardRenderer { public class CardRenderer {
@@ -239,18 +239,18 @@ public class CardRenderer {
g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, HAlignment.LEFT, true); g.drawText(type, typeFont, foreColor, x, y, availableTypeWidth, lineHeight, false, HAlignment.LEFT, true);
} }
public static boolean cardListItemTap(List<?> cards, int selectedIndex, Callback<Integer> onActivate0, float x, float y, int count, boolean compactMode) { public static boolean cardListItemTap(List<?> cards, int selectedIndex, ActivateHandler activateHandler, float x, float y, int count, boolean compactMode) {
if (x <= getCardListItemHeight(compactMode) * CARD_ART_RATIO) { if (x <= getCardListItemHeight(compactMode) * CARD_ART_RATIO) {
CardZoom.show(cards, selectedIndex, onActivate0); CardZoom.show(cards, selectedIndex, activateHandler);
return true; return true;
} }
return false; return false;
} }
public static boolean paperCardListItemTap(List<?> cards, int selectedIndex, Callback<Integer> onActivate0, float x, float y, int count, boolean compactMode) { public static boolean paperCardListItemTap(List<?> cards, int selectedIndex, ActivateHandler activateHandler, float x, float y, int count, boolean compactMode) {
float cardArtHeight = getCardListItemHeight(compactMode); float cardArtHeight = getCardListItemHeight(compactMode);
float cardArtWidth = cardArtHeight * CARD_ART_RATIO; float cardArtWidth = cardArtHeight * CARD_ART_RATIO;
if (x <= cardArtWidth && y <= cardArtHeight) { if (x <= cardArtWidth && y <= cardArtHeight) {
CardZoom.show(cards, selectedIndex, onActivate0); CardZoom.show(cards, selectedIndex, activateHandler);
return true; return true;
} }
return false; return false;

View File

@@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.Graphics; import forge.Graphics;
@@ -17,7 +19,6 @@ import forge.item.InventoryItem;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.toolbox.FCardPanel; import forge.toolbox.FCardPanel;
import forge.toolbox.FOverlay; import forge.toolbox.FOverlay;
import forge.util.Callback;
import forge.util.FCollectionView; import forge.util.FCollectionView;
public class CardZoom extends FOverlay { public class CardZoom extends FOverlay {
@@ -30,19 +31,19 @@ public class CardZoom extends FOverlay {
private static int currentIndex; private static int currentIndex;
private static CardView currentCard, prevCard, nextCard; private static CardView currentCard, prevCard, nextCard;
private static boolean zoomMode = true; private static boolean zoomMode = true;
private static Callback<Integer> onActivate; private static ActivateHandler activateHandler;
public static void show(Object item) { public static void show(Object item) {
List<Object> items0 = new ArrayList<Object>(); List<Object> items0 = new ArrayList<Object>();
items0.add(item); items0.add(item);
show(items0, 0, null); show(items0, 0, null);
} }
public static void show(FCollectionView<?> items0, int currentIndex0, Callback<Integer> onActivate0) { public static void show(FCollectionView<?> items0, int currentIndex0, ActivateHandler activateHandler0) {
show((List<?>)items0, currentIndex0, onActivate0); show((List<?>)items0, currentIndex0, activateHandler0);
} }
public static void show(final List<?> items0, int currentIndex0, Callback<Integer> onActivate0) { public static void show(final List<?> items0, int currentIndex0, ActivateHandler activateHandler0) {
items = items0; items = items0;
onActivate = onActivate0; activateHandler = activateHandler0;
currentIndex = currentIndex0; currentIndex = currentIndex0;
currentCard = getCardView(items.get(currentIndex)); currentCard = getCardView(items.get(currentIndex));
prevCard = currentIndex > 0 ? getCardView(items.get(currentIndex - 1)) : null; prevCard = currentIndex > 0 ? getCardView(items.get(currentIndex - 1)) : null;
@@ -114,9 +115,9 @@ public class CardZoom extends FOverlay {
zoomMode = !zoomMode; zoomMode = !zoomMode;
return true; return true;
} }
if (onActivate != null) { if (activateHandler != null) {
hide(); hide();
onActivate.run(currentIndex); activateHandler.activate(currentIndex);
return true; return true;
} }
return false; return false;
@@ -146,9 +147,12 @@ public class CardZoom extends FOverlay {
} }
float messageHeight = MSG_FONT.getCapHeight() * 2.5f; float messageHeight = MSG_FONT.getCapHeight() * 2.5f;
if (onActivate != null) { if (activateHandler != null) {
g.fillRect(MSG_BACK_COLOR, 0, 0, w, messageHeight); String action = activateHandler.getActivateAction(currentIndex);
g.drawText("Swipe up to activate card", MSG_FONT, MSG_FORE_COLOR, 0, 0, w, messageHeight, false, HAlignment.CENTER, true); if (StringUtils.isNotEmpty(action)) {
g.fillRect(MSG_BACK_COLOR, 0, 0, w, messageHeight);
g.drawText("Swipe up to " + action, MSG_FONT, MSG_FORE_COLOR, 0, 0, w, messageHeight, false, HAlignment.CENTER, true);
}
} }
g.fillRect(MSG_BACK_COLOR, 0, h - messageHeight, w, messageHeight); g.fillRect(MSG_BACK_COLOR, 0, h - messageHeight, w, messageHeight);
g.drawText("Swipe down to switch to " + (zoomMode ? "detail" : "picture") + " view", MSG_FONT, MSG_FORE_COLOR, 0, h - messageHeight, w, messageHeight, false, HAlignment.CENTER, true); g.drawText("Swipe down to switch to " + (zoomMode ? "detail" : "picture") + " view", MSG_FONT, MSG_FORE_COLOR, 0, h - messageHeight, w, messageHeight, false, HAlignment.CENTER, true);
@@ -157,4 +161,9 @@ public class CardZoom extends FOverlay {
@Override @Override
protected void doLayout(float width, float height) { protected void doLayout(float width, float height) {
} }
public static interface ActivateHandler {
String getActivateAction(int index);
void activate(int index);
}
} }

View File

@@ -14,11 +14,9 @@ import forge.itemmanager.filters.CardSearchFilter;
import forge.itemmanager.filters.CardTypeFilter; import forge.itemmanager.filters.CardTypeFilter;
import forge.itemmanager.filters.TextSearchFilter; import forge.itemmanager.filters.TextSearchFilter;
import forge.toolbox.FList.CompactModeHandler; import forge.toolbox.FList.CompactModeHandler;
import forge.util.Callback;
/** /**
* ItemManager for cards * ItemManager for cards
*
*/ */
public class CardManager extends ItemManager<PaperCard> { public class CardManager extends ItemManager<PaperCard> {
public CardManager(boolean wantUnique0) { public CardManager(boolean wantUnique0) {
@@ -62,24 +60,12 @@ public class CardManager extends ItemManager<PaperCard> {
@Override @Override
public boolean tap(Integer index, Entry<PaperCard, Integer> value, float x, float y, int count) { public boolean tap(Integer index, Entry<PaperCard, Integer> value, float x, float y, int count) {
return CardRenderer.cardListItemTap(model.getOrderedList(), index, new Callback<Integer>() { return CardRenderer.cardListItemTap(model.getOrderedList(), index, CardManager.this, x, y, count, compactModeHandler.isCompactMode());
@Override
public void run(Integer result) {
setSelectedIndex(result);
showMenu(true);
}
}, x, y, count, compactModeHandler.isCompactMode());
} }
@Override @Override
public boolean longPress(Integer index, Entry<PaperCard, Integer> value, float x, float y) { public boolean longPress(Integer index, Entry<PaperCard, Integer> value, float x, float y) {
CardZoom.show(model.getOrderedList(), index, new Callback<Integer>() { CardZoom.show(model.getOrderedList(), index, CardManager.this);
@Override
public void run(Integer result) {
setSelectedIndex(result);
showMenu(true);
}
});
return true; return true;
} }
}; };

View File

@@ -30,6 +30,7 @@ import forge.Graphics;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
import forge.card.CardZoom.ActivateHandler;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.itemmanager.filters.ItemFilter; import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.filters.TextSearchFilter; import forge.itemmanager.filters.TextSearchFilter;
@@ -53,7 +54,7 @@ import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
public abstract class ItemManager<T extends InventoryItem> extends FContainer implements IItemManager<T> { public abstract class ItemManager<T extends InventoryItem> extends FContainer implements IItemManager<T>, ActivateHandler {
private ItemPool<T> pool; private ItemPool<T> pool;
protected final ItemManagerModel<T> model; protected final ItemManagerModel<T> model;
private Predicate<? super T> filterPredicate = null; private Predicate<? super T> filterPredicate = null;
@@ -1073,4 +1074,20 @@ public abstract class ItemManager<T extends InventoryItem> extends FContainer im
setBounds(Math.round(x), Math.round(y), Math.round(w), Math.round(h)); setBounds(Math.round(x), Math.round(y), Math.round(w), Math.round(h));
} }
} }
@Override
public String getActivateAction(int index) {
if (contextMenuBuilder != null) {
return "select card";
}
return null;
}
@Override
public void activate(int index) {
if (contextMenuBuilder != null) {
setSelectedIndex(index);
showMenu(true);
}
}
} }

View File

@@ -19,7 +19,6 @@ import forge.itemmanager.filters.TextSearchFilter;
import forge.quest.QuestSpellShop; import forge.quest.QuestSpellShop;
import forge.toolbox.FList; import forge.toolbox.FList;
import forge.toolbox.FList.CompactModeHandler; import forge.toolbox.FList.CompactModeHandler;
import forge.util.Callback;
public final class SpellShopManager extends ItemManager<InventoryItem> { public final class SpellShopManager extends ItemManager<InventoryItem> {
@@ -89,13 +88,7 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
@Override @Override
public boolean tap(Integer index, 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) { if (value.getKey() instanceof PaperCard) {
return CardRenderer.cardListItemTap(model.getOrderedList(), index, new Callback<Integer>() { return CardRenderer.cardListItemTap(model.getOrderedList(), index, SpellShopManager.this, x, y, count, compactModeHandler.isCompactMode());
@Override
public void run(Integer result) {
setSelectedIndex(result);
showMenu(true);
}
}, x, y, count, compactModeHandler.isCompactMode());
} }
return false; return false;
} }
@@ -103,13 +96,7 @@ public final class SpellShopManager extends ItemManager<InventoryItem> {
@Override @Override
public boolean longPress(Integer index, 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) { if (value.getKey() instanceof PaperCard) {
CardZoom.show(model.getOrderedList(), index, new Callback<Integer>() { CardZoom.show(model.getOrderedList(), index, SpellShopManager.this);
@Override
public void run(Integer result) {
setSelectedIndex(result);
showMenu(true);
}
});
return true; return true;
} }
return false; return false;

View File

@@ -30,7 +30,6 @@ import forge.toolbox.FTextField;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FScrollPane; import forge.toolbox.FScrollPane;
import forge.util.Callback;
import forge.util.Utils; import forge.util.Utils;
import java.util.*; import java.util.*;
@@ -873,13 +872,7 @@ public class ImageView<T extends InventoryItem> extends ItemView<T> {
public boolean longPress(float x, float y) { public boolean longPress(float x, float y) {
ItemInfo item = getItemAtPoint(x + getLeft(), y + getTop()); ItemInfo item = getItemAtPoint(x + getLeft(), y + getTop());
if (item != null) { if (item != null) {
CardZoom.show(orderedItems, orderedItems.indexOf(item), new Callback<Integer>() { CardZoom.show(orderedItems, orderedItems.indexOf(item), itemManager);
@Override
public void run(Integer result) {
setSelectedIndex(result);
itemManager.showMenu(true);
}
});
return true; return true;
} }
return false; return false;

View File

@@ -11,13 +11,13 @@ import forge.FThreads;
import forge.Graphics; import forge.Graphics;
import forge.card.CardZoom; import forge.card.CardZoom;
import forge.card.CardRenderer.CardStackPosition; import forge.card.CardRenderer.CardStackPosition;
import forge.card.CardZoom.ActivateHandler;
import forge.game.card.CardView; import forge.game.card.CardView;
import forge.match.MatchUtil; import forge.match.MatchUtil;
import forge.toolbox.FCardPanel; import forge.toolbox.FCardPanel;
import forge.util.Callback;
import forge.util.ThreadUtil; import forge.util.ThreadUtil;
public abstract class VCardDisplayArea extends VDisplayArea { public abstract class VCardDisplayArea extends VDisplayArea implements ActivateHandler {
private static final float CARD_STACK_OFFSET = 0.2f; private static final float CARD_STACK_OFFSET = 0.2f;
protected final List<CardView> orderedCards = new ArrayList<CardView>(); protected final List<CardView> orderedCards = new ArrayList<CardView>();
@@ -174,6 +174,16 @@ public abstract class VCardDisplayArea extends VDisplayArea {
g.startClip(0, -h, getWidth(), 3 * h); g.startClip(0, -h, getWidth(), 3 * h);
} }
@Override
public String getActivateAction(int index) {
return "activate card";
}
@Override
public void activate(int index) {
CardAreaPanel.get(orderedCards.get(index)).selectCard(false);
}
public static class CardAreaPanel extends FCardPanel { public static class CardAreaPanel extends FCardPanel {
private static final Map<Integer, CardAreaPanel> allCardPanels = new HashMap<Integer, CardAreaPanel>(); private static final Map<Integer, CardAreaPanel> allCardPanels = new HashMap<Integer, CardAreaPanel>();
@@ -317,12 +327,7 @@ public abstract class VCardDisplayArea extends VDisplayArea {
private void showZoom() { private void showZoom() {
final List<CardView> cards = displayArea.orderedCards; final List<CardView> cards = displayArea.orderedCards;
CardZoom.show(cards, cards.indexOf(getCard()), new Callback<Integer>() { CardZoom.show(cards, cards.indexOf(getCard()), displayArea);
@Override
public void run(Integer result) {
CardAreaPanel.get(cards.get(result)).selectCard(false);
}
});
} }
public void buildCardPanelList(List<? super FCardPanel> list) { public void buildCardPanelList(List<? super FCardPanel> list) {

View File

@@ -14,6 +14,7 @@ import forge.assets.FSkinColor.Colors;
import forge.card.CardRenderer; import forge.card.CardRenderer;
import forge.card.CardZoom; import forge.card.CardZoom;
import forge.card.CardRenderer.CardStackPosition; import forge.card.CardRenderer.CardStackPosition;
import forge.card.CardZoom.ActivateHandler;
import forge.game.card.CardView; import forge.game.card.CardView;
import forge.game.player.PlayerView; import forge.game.player.PlayerView;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -21,10 +22,9 @@ import forge.item.PaperCard;
import forge.screens.match.MatchController; import forge.screens.match.MatchController;
import forge.screens.match.views.VAvatar; import forge.screens.match.views.VAvatar;
import forge.screens.match.views.VStack; import forge.screens.match.views.VStack;
import forge.util.Callback;
import forge.util.Utils; import forge.util.Utils;
public class FChoiceList<T> extends FList<T> { public class FChoiceList<T> extends FList<T> implements ActivateHandler {
public static final FSkinColor ITEM_COLOR = FSkinColor.get(Colors.CLR_ZEBRA); public static final FSkinColor ITEM_COLOR = FSkinColor.get(Colors.CLR_ZEBRA);
public static final FSkinColor ALT_ITEM_COLOR = ITEM_COLOR.getContrastColor(-20); public static final FSkinColor ALT_ITEM_COLOR = ITEM_COLOR.getContrastColor(-20);
public static final FSkinColor SEL_COLOR = FSkinColor.get(Colors.CLR_ACTIVE); public static final FSkinColor SEL_COLOR = FSkinColor.get(Colors.CLR_ACTIVE);
@@ -321,22 +321,12 @@ public class FChoiceList<T> extends FList<T> {
@Override @Override
public boolean tap(Integer index, T value, float x, float y, int count) { public boolean tap(Integer index, T value, float x, float y, int count) {
return CardRenderer.cardListItemTap(items, index, new Callback<Integer>() { return CardRenderer.cardListItemTap(items, index, FChoiceList.this, x, y, count, compactModeHandler.isCompactMode());
@Override
public void run(Integer result) {
setSelectedIndex(result);
}
}, x, y, count, compactModeHandler.isCompactMode());
} }
@Override @Override
public boolean longPress(Integer index, T value, float x, float y) { public boolean longPress(Integer index, T value, float x, float y) {
CardZoom.show(items, index, new Callback<Integer>() { CardZoom.show(items, index, FChoiceList.this);
@Override
public void run(Integer result) {
setSelectedIndex(result);
}
});
return true; return true;
} }
@@ -359,22 +349,12 @@ public class FChoiceList<T> extends FList<T> {
@Override @Override
public boolean tap(Integer index, T value, float x, float y, int count) { public boolean tap(Integer index, T value, float x, float y, int count) {
return CardRenderer.cardListItemTap(items, index, new Callback<Integer>() { return CardRenderer.cardListItemTap(items, index, FChoiceList.this, x, y, count, compactModeHandler.isCompactMode());
@Override
public void run(Integer result) {
setSelectedIndex(result);
}
}, x, y, count, compactModeHandler.isCompactMode());
} }
@Override @Override
public boolean longPress(Integer index, T value, float x, float y) { public boolean longPress(Integer index, T value, float x, float y) {
CardZoom.show(items, index, new Callback<Integer>() { CardZoom.show(items, index, FChoiceList.this);
@Override
public void run(Integer result) {
setSelectedIndex(result);
}
});
return true; return true;
} }
@@ -453,4 +433,19 @@ public class FChoiceList<T> extends FList<T> {
g.drawText(player.getName() + " (" + player.getLife() + ")", font, foreColor, x, y, w, h, false, HAlignment.LEFT, true); g.drawText(player.getName() + " (" + player.getLife() + ")", font, foreColor, x, y, w, h, false, HAlignment.LEFT, true);
} }
} }
@Override
public String getActivateAction(int index) {
if (maxChoices > 0) {
return "select card";
}
return null;
}
@Override
public void activate(int index) {
if (maxChoices > 0) {
setSelectedIndex(index);
}
}
} }