mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Fully implement card and deck set/format filter
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
});*/
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -944,96 +944,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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user