Fully implement card and deck set/format filter

This commit is contained in:
drdev
2014-07-25 04:11:06 +00:00
parent 88f82d23ae
commit c4b4037577
8 changed files with 184 additions and 189 deletions

2
.gitattributes vendored
View File

@@ -1135,14 +1135,12 @@ forge-gui-mobile/src/forge/itemmanager/filters/CardColorFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardFormatFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardPowerFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardSearchFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardSetFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardToughnessFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/CardTypeFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckColorFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckFolderFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckFormatFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckSearchFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckSetFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/DeckStatTypeFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/FormatFilter.java -text
forge-gui-mobile/src/forge/itemmanager/filters/ItemFilter.java -text

View File

@@ -1,10 +1,10 @@
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SFilterUtil;
public class CardFormatFilter extends FormatFilter<PaperCard> {
@@ -15,12 +15,18 @@ public class CardFormatFilter extends FormatFilter<PaperCard> {
@Override
public ItemFilter<PaperCard> createCopy() {
CardFormatFilter copy = new CardFormatFilter(itemManager);
copy.formats.addAll(this.formats);
copy.format = this.format;
return copy;
}
@Override
protected final Predicate<PaperCard> buildPredicate() {
return SFilterUtil.buildFormatFilter(this.formats, true);
if (format == null) {
return Predicates.alwaysTrue();
}
if (format.getName() == null) {
return format.getFilterPrinted(); //if format is collection of sets, don't show reprints in other sets
}
return format.getFilterRules();
}
}

View File

@@ -1,31 +0,0 @@
package forge.itemmanager.filters;
import forge.game.GameFormat;
import forge.item.PaperCard;
import forge.itemmanager.ItemManager;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class CardSetFilter extends CardFormatFilter {
private final Set<String> sets = new HashSet<String>();
public CardSetFilter(ItemManager<? super PaperCard> itemManager0, Collection<String> sets0) {
super(itemManager0);
this.sets.addAll(sets0);
this.formats.add(new GameFormat(null, this.sets, null));
}
@Override
public ItemFilter<PaperCard> createCopy() {
return new CardSetFilter(itemManager, this.sets);
}
@Override
public void reset() {
this.sets.clear();
super.reset();
}
}

View File

@@ -1,10 +1,10 @@
package forge.itemmanager.filters;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import forge.deck.DeckProxy;
import forge.itemmanager.ItemManager;
import forge.itemmanager.SFilterUtil;
public class DeckFormatFilter extends FormatFilter<DeckProxy> {
@@ -15,12 +15,20 @@ public class DeckFormatFilter extends FormatFilter<DeckProxy> {
@Override
public ItemFilter<DeckProxy> createCopy() {
DeckFormatFilter copy = new DeckFormatFilter(itemManager);
copy.formats.addAll(this.formats);
copy.format = format;
return copy;
}
@Override
protected final Predicate<DeckProxy> buildPredicate() {
return DeckProxy.createPredicate(SFilterUtil.buildFormatFilter(this.formats, true));
if (format == null) {
return Predicates.alwaysTrue();
}
return new Predicate<DeckProxy>() {
@Override
public boolean apply(DeckProxy input) {
return format.isDeckLegal(input.getDeck());
}
};
}
}

View File

@@ -1,45 +0,0 @@
package forge.itemmanager.filters;
import forge.deck.DeckProxy;
import forge.game.GameFormat;
import forge.itemmanager.ItemManager;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class DeckSetFilter extends DeckFormatFilter {
private final Set<String> sets = new HashSet<String>();
public DeckSetFilter(ItemManager<? super DeckProxy> itemManager0, Collection<String> sets0) {
super(itemManager0);
this.sets.addAll(sets0);
this.formats.add(new GameFormat(null, this.sets, null));
}
@Override
public ItemFilter<DeckProxy> createCopy() {
return new DeckSetFilter(itemManager, this.sets);
}
@Override
public void reset() {
this.sets.clear();
super.reset();
}
public void edit() {
/*final DialogChooseSets dialog = new DialogChooseSets(this.sets, null, true);
dialog.setOkCallback(new Runnable() {
@Override
public void run() {
sets.clear();
sets.addAll(dialog.getSelectedSets());
allowReprints = dialog.getWantReprints();
formats.clear();
formats.add(new GameFormat(null, sets, null));
}
});*/
}
}

View File

@@ -1,20 +1,38 @@
package forge.itemmanager.filters;
import forge.Forge;
import forge.Graphics;
import forge.assets.FSkinColor;
import forge.assets.FSkinFont;
import forge.card.CardEdition;
import forge.game.GameFormat;
import forge.item.InventoryItem;
import forge.itemmanager.ItemManager;
import forge.model.FModel;
import forge.screens.FScreen;
import forge.screens.settings.SettingsScreen;
import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBox;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent;
import forge.toolbox.FGroupList;
import forge.toolbox.FList;
import forge.toolbox.FEvent.FEventHandler;
import forge.util.Callback;
import forge.util.TextUtil;
import forge.util.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T> {
protected final Set<GameFormat> formats = new HashSet<GameFormat>();
protected GameFormat format;
private FComboBox<Object> cbxFormats = new FComboBox<Object>();
public FormatFilter(ItemManager<? super T> itemManager0) {
@@ -31,17 +49,21 @@ public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T
cbxFormats.setChangedHandler(new FEventHandler() {
@Override
public void handleEvent(FEvent e) {
if (cbxFormats.getSelectedIndex() == 0) {
formats.clear();
int index = cbxFormats.getSelectedIndex();
if (index == -1) {
//Do nothing when index set to -1
}
else if (index == 0) {
format = null;
applyChange();
}
else if (cbxFormats.getSelectedIndex() < cbxFormats.getItemCount() - 1) {
formats.clear();
formats.add((GameFormat)cbxFormats.getSelectedItem());
applyChange();
else if (index == cbxFormats.getItemCount() - 1) {
cbxFormats.setSelectedIndex(-1);
Forge.openScreen(new MultiSetSelect());
}
else {
//TODO: Open screen to select one or more sets and/or formats
format = (GameFormat)cbxFormats.getSelectedItem();
applyChange();
}
}
});
@@ -49,16 +71,17 @@ public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T
@Override
public void reset() {
this.formats.clear();
format = null;
}
public static <T extends InventoryItem> boolean canAddFormat(GameFormat format, FormatFilter<T> existingFilter) {
return existingFilter == null || !existingFilter.formats.contains(format);
@Override
public FDisplayObject getMainComponent() {
return cbxFormats;
}
@Override
public boolean isEmpty() {
return formats.isEmpty();
return format == null;
}
@Override
@@ -70,4 +93,125 @@ public abstract class FormatFilter<T extends InventoryItem> extends ItemFilter<T
protected void doWidgetLayout(float width, float height) {
cbxFormats.setSize(width, height);
}
private class MultiSetSelect extends FScreen {
private final Set<CardEdition> selectedSets = new HashSet<CardEdition>();
private final FGroupList<CardEdition> lstSets = add(new FGroupList<CardEdition>());
private MultiSetSelect() {
super("Choose Sets");
lstSets.addGroup("Core Sets");
lstSets.addGroup("Expansions");
lstSets.addGroup("Duel Decks");
lstSets.addGroup("From the Vault");
lstSets.addGroup("Premium Deck Series");
lstSets.addGroup("Reprint Sets");
lstSets.addGroup("Starter Sets");
lstSets.addGroup("Custom Sets");
lstSets.addGroup("Other Sets");
List<CardEdition> sets = new ArrayList<CardEdition>();
for (CardEdition set : FModel.getMagicDb().getEditions()) {
sets.add(set);
}
Collections.sort(sets);
Collections.reverse(sets);
for (CardEdition set : sets) {
switch (set.getType()) {
case CORE:
lstSets.addItem(set, 0);
break;
case EXPANSION:
lstSets.addItem(set, 1);
break;
case DUEL_DECKS:
lstSets.addItem(set, 2);
break;
case FROM_THE_VAULT:
lstSets.addItem(set, 3);
break;
case PREMIUM_DECK_SERIES:
lstSets.addItem(set, 4);
break;
case REPRINT:
lstSets.addItem(set, 5);
break;
case STARTER:
lstSets.addItem(set, 6);
break;
case THIRDPARTY:
lstSets.addItem(set, 7);
break;
default:
lstSets.addItem(set, 8);
break;
}
}
lstSets.setListItemRenderer(new SetRenderer());
}
@Override
public void onClose(Callback<Boolean> canCloseCallback) {
if (selectedSets.size() > 0) {
List<String> setCodes = new ArrayList<String>();
List<CardEdition> sortedSets = new ArrayList<CardEdition>(selectedSets);
Collections.sort(sortedSets);
Collections.reverse(sortedSets);
for (CardEdition set : sortedSets) {
setCodes.add(set.getCode());
}
format = new GameFormat(null, setCodes, null);
cbxFormats.setText(TextUtil.join(setCodes, ", "));
applyChange();
}
else { //if nothing selected, switch to All Sets item
cbxFormats.setSelectedIndex(0);
}
super.onClose(canCloseCallback);
}
@Override
protected void doLayout(float startY, float width, float height) {
lstSets.setBounds(0, startY, width, height - startY);
}
private class SetRenderer extends FList.ListItemRenderer<CardEdition> {
@Override
public float getItemHeight() {
return Utils.AVG_FINGER_HEIGHT;
}
@Override
public boolean tap(Integer index, CardEdition value, float x, float y, int count) {
if (selectedSets.contains(value)) {
selectedSets.remove(value);
}
else {
selectedSets.add(value);
}
return true;
}
@Override
public void drawValue(Graphics g, Integer index, CardEdition value, FSkinFont font, FSkinColor foreColor, FSkinColor backColor, boolean pressed, float x, float y, float w, float h) {
float offset = w * SettingsScreen.INSETS_FACTOR - FList.PADDING; //increase padding for settings items
x += offset;
y += offset;
w -= 2 * offset;
h -= 2 * offset;
float textHeight = h;
h *= 0.66f;
g.drawText(value.toString(), font, foreColor, x, y, w - h - FList.PADDING, textHeight, false, HAlignment.LEFT, true);
x += w - h;
y += (textHeight - h) / 2;
FCheckBox.drawCheckBox(g, SettingsScreen.DESC_COLOR, foreColor, selectedSets.contains(value), x, y, h, h);
}
}
}
}

View File

@@ -943,96 +943,6 @@ public class ConstructedScreen extends LaunchScreen {
}
}
}
/** This listener unlocks the relevant buttons for players
* and enables/disables archenemy combobox as appropriate. */
/*private ItemListener iListenerVariants = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent arg0) {
FCheckBox cb = (FCheckBox) arg0.getSource();
GameType variantType = null;
if (cb == vntVanguard) {
variantType = GameType.Vanguard;
}
else if (cb == vntCommander) {
variantType = GameType.Commander;
}
else if (cb == vntPlanechase) {
variantType = GameType.Planechase;
}
else if (cb == vntArchenemy) {
variantType = archenemyType.contains("Classic") ? GameType.Archenemy : GameType.ArchenemyRumble;
comboArchenemy.setEnabled(vntArchenemy.isSelected());
if (arg0.getStateChange() != ItemEvent.SELECTED) {
appliedVariants.remove(GameType.Archenemy);
appliedVariants.remove(GameType.ArchenemyRumble);
}
}
if (null != variantType) {
if (arg0.getStateChange() == ItemEvent.SELECTED) {
appliedVariants.add(variantType);
currentGameMode = variantType;
}
else {
appliedVariants.remove(variantType);
if (currentGameMode == variantType) {
currentGameMode = GameType.Constructed;
}
}
}
for (PlayerPanel pp : playerPanels) {
pp.toggleIsPlayerArchenemy();
pp.updateVariantControlsVisibility();
}
}
};
// Listens to the archenemy combo box
private ActionListener aeComboListener = new ActionListener() {
@SuppressWarnings("unchecked")
@Override
public void actionPerformed(ActionEvent e) {
FComboBox<String> cb = (FComboBox<String>)e.getSource();
archenemyType = (String)cb.getSelectedItem();
GameType mode = archenemyType.contains("Classic") ? GameType.Archenemy : GameType.ArchenemyRumble;
appliedVariants.remove(GameType.Archenemy);
appliedVariants.remove(GameType.ArchenemyRumble);
appliedVariants.add(mode);
currentGameMode = mode;
for (PlayerPanel pp : playerPanels) {
pp.toggleIsPlayerArchenemy();
pp.updateVariantControlsVisibility();
}
}
};
//This listener will look for a vanguard avatar being selected in the lists
//and update the corresponding detail panel.
private ListSelectionListener vgdLSListener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
int index = vgdAvatarLists.indexOf(e.getSource());
Object obj = vgdAvatarLists.get(index).getSelectedValue();
PlayerPanel pp = playerPanels.get(index);
CardDetailPanel cdp = vgdAvatarDetails.get(index);
if (obj instanceof PaperCard) {
pp.setVanguardButtonText(((PaperCard) obj).getName());
cdp.setCard(Card.getCardForUi((PaperCard) obj));
cdp.setVisible(true);
refreshPanels(false, true);
}
else {
pp.setVanguardButtonText((String) obj);
cdp.setVisible(false);
}
}
};*/
/////////////////////////////////////
//========== METHODS FOR VARIANTS

View File

@@ -154,9 +154,11 @@ public class FGroupList<E> extends FScrollPane {
float groupHeight;
for (ListGroup group : groups) {
groupHeight = group.getPreferredHeight();
group.setBounds(0, y, visibleWidth, groupHeight);
y += groupHeight;
if (group.isVisible()) {
groupHeight = group.getPreferredHeight();
group.setBounds(0, y, visibleWidth, groupHeight);
y += groupHeight;
}
}
return new ScrollBounds(visibleWidth, y);
@@ -181,16 +183,19 @@ public class FGroupList<E> extends FScrollPane {
}
}).build());
}
setVisible(false); //hide by default unless it has items
}
public void addItem(ListItem item) {
items.add(item);
add(item);
setVisible(true);
}
public boolean removeItem(ListItem item) {
if (items.remove(item)) {
remove(item);
setVisible(items.size() > 0);
return true;
}
return false;