mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 11:18:01 +00:00
Create DeckManager
This commit is contained in:
9
.gitattributes
vendored
9
.gitattributes
vendored
@@ -68,6 +68,7 @@ forge-core/src/main/java/forge/deck/io/OldDeckFileFormatException.java -text
|
|||||||
forge-core/src/main/java/forge/deck/io/package-info.java -text
|
forge-core/src/main/java/forge/deck/io/package-info.java -text
|
||||||
forge-core/src/main/java/forge/deck/package-info.java -text
|
forge-core/src/main/java/forge/deck/package-info.java -text
|
||||||
forge-core/src/main/java/forge/item/BoosterPack.java -text
|
forge-core/src/main/java/forge/item/BoosterPack.java -text
|
||||||
|
forge-core/src/main/java/forge/item/DeckBox.java -text
|
||||||
forge-core/src/main/java/forge/item/FatPack.java -text
|
forge-core/src/main/java/forge/item/FatPack.java -text
|
||||||
forge-core/src/main/java/forge/item/IPaperCard.java -text
|
forge-core/src/main/java/forge/item/IPaperCard.java -text
|
||||||
forge-core/src/main/java/forge/item/InventoryItem.java -text
|
forge-core/src/main/java/forge/item/InventoryItem.java -text
|
||||||
@@ -15473,6 +15474,7 @@ forge-gui/src/main/java/forge/gui/toolbox/imaging/FImagePanel.java -text
|
|||||||
forge-gui/src/main/java/forge/gui/toolbox/imaging/FImageUtil.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/imaging/FImageUtil.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/imaging/ImageUtil.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/imaging/ImageUtil.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/CardManager.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/CardManager.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/DeckManager.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerContainer.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManagerModel.java -text
|
||||||
@@ -15490,6 +15492,13 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSearchFilter.j
|
|||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardSetFilter.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardToughnessFilter.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/CardTypeFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckColorFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckFormatFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckQuestWorldFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSearchFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckSetFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/DeckStatTypeFilter.java -text
|
||||||
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/FormatFilter.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ItemFilter.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ListLabelFilter.java -text
|
||||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java -text
|
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/StatTypeFilter.java -text
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public final class CardDb implements ICardDatabase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addCard(PaperCard paperCard) {
|
private void addCard(PaperCard paperCard) {
|
||||||
allCardsByName.put(paperCard.name, paperCard);
|
allCardsByName.put(paperCard.getName(), paperCard);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reIndex() {
|
private void reIndex() {
|
||||||
|
|||||||
@@ -134,5 +134,4 @@ public class DeckGroup extends DeckBase {
|
|||||||
return arg1.getName();
|
return arg1.getName();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
73
forge-core/src/main/java/forge/item/DeckBox.java
Normal file
73
forge-core/src/main/java/forge/item/DeckBox.java
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Forge: Play Magic: the Gathering.
|
||||||
|
* Copyright (C) 2011 Nate
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package forge.item;
|
||||||
|
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
import forge.deck.CardPool;
|
||||||
|
import forge.deck.Deck;
|
||||||
|
import forge.deck.DeckSection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A deck box containing a deck
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckBox implements InventoryItem {
|
||||||
|
private final Deck deck;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return this.deck.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getItemType() {
|
||||||
|
return "Deck";
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeckBox(final Deck deck0) {
|
||||||
|
this.deck = deck0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//create predicate that applys a card predicate to all cards in deck
|
||||||
|
public static final Predicate<DeckBox> createPredicate(final Predicate<PaperCard> cardPredicate) {
|
||||||
|
return new Predicate<DeckBox>() {
|
||||||
|
@Override
|
||||||
|
public boolean apply(DeckBox input) {
|
||||||
|
for (Entry<DeckSection, CardPool> deckEntry : input.deck) {
|
||||||
|
switch (deckEntry.getKey()) {
|
||||||
|
case Main:
|
||||||
|
case Sideboard:
|
||||||
|
case Commander:
|
||||||
|
for (Entry<PaperCard, Integer> poolEntry : deckEntry.getValue()) {
|
||||||
|
if (!cardPredicate.apply(poolEntry.getKey())) {
|
||||||
|
return false; //all cards in deck must pass card predicate to pass deck predicate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break; //ignore other sections
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,10 +35,10 @@ public final class PaperCard implements Comparable<IPaperCard>, InventoryItemFro
|
|||||||
private final transient CardRules rules;
|
private final transient CardRules rules;
|
||||||
|
|
||||||
// These fields are kinda PK for PrintedCard
|
// These fields are kinda PK for PrintedCard
|
||||||
public final String name;
|
private final String name;
|
||||||
public final String edition;
|
private final String edition;
|
||||||
public final int artIndex;
|
private final int artIndex;
|
||||||
public final boolean foil;
|
private final boolean foil;
|
||||||
|
|
||||||
// Calculated fields are below:
|
// Calculated fields are below:
|
||||||
private final transient CardRarity rarity; // rarity is given in ctor when set is assigned
|
private final transient CardRarity rarity; // rarity is given in ctor when set is assigned
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
|
||||||
|
import forge.Singletons;
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.GuiUtils;
|
||||||
|
import forge.gui.home.quest.DialogChooseSets;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.DeckColorFilter;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.DeckFormatFilter;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.DeckQuestWorldFilter;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.DeckSearchFilter;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.DeckSetFilter;
|
||||||
|
import forge.gui.toolbox.itemmanager.filters.ItemFilter;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
import forge.quest.QuestWorld;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ItemManager for cards
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public final class DeckManager extends ItemManager<DeckBox> {
|
||||||
|
public DeckManager(boolean wantUnique0) {
|
||||||
|
super(DeckBox.class, wantUnique0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addDefaultFilters() {
|
||||||
|
addDefaultFilters(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ItemFilter<DeckBox> createSearchFilter() {
|
||||||
|
return createSearchFilter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void buildAddFilterMenu(JMenu menu) {
|
||||||
|
buildAddFilterMenu(menu, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Static overrides shared with SpellShopManager*/
|
||||||
|
|
||||||
|
public static void addDefaultFilters(final ItemManager<? super DeckBox> itemManager) {
|
||||||
|
itemManager.addFilter(new DeckColorFilter(itemManager));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemFilter<DeckBox> createSearchFilter(final ItemManager<? super DeckBox> itemManager) {
|
||||||
|
return new DeckSearchFilter(itemManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void buildAddFilterMenu(JMenu menu, final ItemManager<? super DeckBox> itemManager) {
|
||||||
|
GuiUtils.addSeparator(menu); //separate from current search item
|
||||||
|
|
||||||
|
JMenu fmt = GuiUtils.createMenu("Format");
|
||||||
|
for (final GameFormat f : Singletons.getModel().getFormats()) {
|
||||||
|
GuiUtils.addMenuItem(fmt, f.getName(), null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
itemManager.addFilter(new DeckFormatFilter(itemManager, f));
|
||||||
|
}
|
||||||
|
}, DeckFormatFilter.canAddFormat(f, itemManager.getFilter(DeckFormatFilter.class)));
|
||||||
|
}
|
||||||
|
menu.add(fmt);
|
||||||
|
|
||||||
|
GuiUtils.addMenuItem(menu, "Sets...", null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
DeckSetFilter existingFilter = itemManager.getFilter(DeckSetFilter.class);
|
||||||
|
if (existingFilter != null) {
|
||||||
|
existingFilter.edit();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
final DialogChooseSets dialog = new DialogChooseSets(null, null, true);
|
||||||
|
dialog.setOkCallback(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
List<String> sets = dialog.getSelectedSets();
|
||||||
|
if (!sets.isEmpty()) {
|
||||||
|
itemManager.addFilter(new DeckSetFilter(itemManager, sets, dialog.getWantReprints()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
JMenu world = GuiUtils.createMenu("Quest world");
|
||||||
|
for (final QuestWorld w : Singletons.getModel().getWorlds()) {
|
||||||
|
GuiUtils.addMenuItem(world, w.getName(), null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
itemManager.addFilter(new DeckQuestWorldFilter(itemManager, w));
|
||||||
|
}
|
||||||
|
}, DeckQuestWorldFilter.canAddQuestWorld(w, itemManager.getFilter(DeckQuestWorldFilter.class)));
|
||||||
|
}
|
||||||
|
menu.add(world);
|
||||||
|
|
||||||
|
GuiUtils.addSeparator(menu);
|
||||||
|
|
||||||
|
GuiUtils.addMenuItem(menu, "Colors", null, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
itemManager.addFilter(new DeckColorFilter(itemManager));
|
||||||
|
}
|
||||||
|
}, itemManager.getFilter(DeckColorFilter.class) == null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,11 +2,19 @@ package forge.gui.toolbox.itemmanager;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
|
|
||||||
import forge.card.CardRules;
|
import forge.card.CardRules;
|
||||||
import forge.card.CardRulesPredicates;
|
import forge.card.CardRulesPredicates;
|
||||||
|
import forge.card.MagicColor;
|
||||||
|
import forge.card.CardRulesPredicates.Presets;
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.toolbox.FLabel;
|
||||||
|
import forge.gui.toolbox.itemmanager.SItemManagerUtil.StatTypes;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.util.PredicateString.StringOp;
|
import forge.util.PredicateString.StringOp;
|
||||||
@@ -70,6 +78,74 @@ public class SFilterUtil {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static Predicate<PaperCard> buildColorFilter(Map<SItemManagerUtil.StatTypes, FLabel> buttonMap) {
|
||||||
|
byte colors = 0;
|
||||||
|
|
||||||
|
if (buttonMap.get(StatTypes.WHITE).getSelected()) {
|
||||||
|
colors |= MagicColor.WHITE;
|
||||||
|
}
|
||||||
|
if (buttonMap.get(StatTypes.BLUE).getSelected()) {
|
||||||
|
colors |= MagicColor.BLUE;
|
||||||
|
}
|
||||||
|
if (buttonMap.get(StatTypes.BLACK).getSelected()) {
|
||||||
|
colors |= MagicColor.BLACK;
|
||||||
|
}
|
||||||
|
if (buttonMap.get(StatTypes.RED).getSelected()) {
|
||||||
|
colors |= MagicColor.RED;
|
||||||
|
}
|
||||||
|
if (buttonMap.get(StatTypes.GREEN).getSelected()) {
|
||||||
|
colors |= MagicColor.GREEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).getSelected();
|
||||||
|
boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).getSelected();
|
||||||
|
|
||||||
|
Predicate<CardRules> preFinal = null;
|
||||||
|
if (wantMulticolor) {
|
||||||
|
if (colors == 0) { //handle showing all multi-color cards if all 5 colors are filtered
|
||||||
|
preFinal = Presets.IS_MULTICOLOR;
|
||||||
|
if (wantColorless) {
|
||||||
|
preFinal = Predicates.or(preFinal, Presets.IS_COLORLESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (colors != MagicColor.ALL_COLORS) {
|
||||||
|
preFinal = CardRulesPredicates.canCastWithAvailable(colors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
preFinal = Predicates.not(Presets.IS_MULTICOLOR);
|
||||||
|
if (colors != MagicColor.ALL_COLORS) {
|
||||||
|
preFinal = Predicates.and(CardRulesPredicates.canCastWithAvailable(colors), preFinal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!wantColorless) {
|
||||||
|
if (colors != 0 && colors != MagicColor.ALL_COLORS) {
|
||||||
|
//if colorless filtered out ensure phyrexian cards don't appear
|
||||||
|
//unless at least one of their colors is selected
|
||||||
|
preFinal = Predicates.and(preFinal, CardRulesPredicates.isColor(colors));
|
||||||
|
}
|
||||||
|
preFinal = SFilterUtil.optimizedAnd(preFinal, Predicates.not(Presets.IS_COLORLESS));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preFinal == null) {
|
||||||
|
return new Predicate<PaperCard>() { //use custom return true delegate to validate the item is a card
|
||||||
|
@Override
|
||||||
|
public boolean apply(PaperCard card) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Predicate<PaperCard> buildFormatFilter(Set<GameFormat> formats, boolean allowReprints) {
|
||||||
|
List<Predicate<PaperCard>> predicates = new ArrayList<Predicate<PaperCard>>();
|
||||||
|
for (GameFormat f : formats) {
|
||||||
|
predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted());
|
||||||
|
}
|
||||||
|
return Predicates.or(predicates);
|
||||||
|
}
|
||||||
|
|
||||||
public static <T> Predicate<T> optimizedAnd(Predicate<T> p1, Predicate<T> p2) {
|
public static <T> Predicate<T> optimizedAnd(Predicate<T> p1, Predicate<T> p2) {
|
||||||
return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2));
|
return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,6 @@ package forge.gui.toolbox.itemmanager.filters;
|
|||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
|
|
||||||
import forge.card.CardRules;
|
|
||||||
import forge.card.CardRulesPredicates;
|
|
||||||
import forge.card.MagicColor;
|
|
||||||
import forge.card.CardRulesPredicates.Presets;
|
|
||||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
import forge.gui.toolbox.itemmanager.SFilterUtil;
|
import forge.gui.toolbox.itemmanager.SFilterUtil;
|
||||||
import forge.gui.toolbox.itemmanager.SpellShopManager;
|
import forge.gui.toolbox.itemmanager.SpellShopManager;
|
||||||
@@ -34,73 +28,11 @@ public class CardColorFilter extends StatTypeFilter<PaperCard> {
|
|||||||
if (itemManager instanceof SpellShopManager) {
|
if (itemManager instanceof SpellShopManager) {
|
||||||
addToggleButton(widget, StatTypes.PACK_OR_DECK);
|
addToggleButton(widget, StatTypes.PACK_OR_DECK);
|
||||||
}
|
}
|
||||||
addToggleButton(widget, StatTypes.WHITE);
|
addColorButtons(widget);
|
||||||
addToggleButton(widget, StatTypes.BLUE);
|
|
||||||
addToggleButton(widget, StatTypes.BLACK);
|
|
||||||
addToggleButton(widget, StatTypes.RED);
|
|
||||||
addToggleButton(widget, StatTypes.GREEN);
|
|
||||||
addToggleButton(widget, StatTypes.COLORLESS);
|
|
||||||
addToggleButton(widget, StatTypes.MULTICOLOR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final Predicate<PaperCard> buildPredicate() {
|
protected final Predicate<PaperCard> buildPredicate() {
|
||||||
byte colors = 0;
|
return SFilterUtil.buildColorFilter(buttonMap);
|
||||||
|
|
||||||
if (buttonMap.get(StatTypes.WHITE).getSelected()) {
|
|
||||||
colors |= MagicColor.WHITE;
|
|
||||||
}
|
|
||||||
if (buttonMap.get(StatTypes.BLUE).getSelected()) {
|
|
||||||
colors |= MagicColor.BLUE;
|
|
||||||
}
|
|
||||||
if (buttonMap.get(StatTypes.BLACK).getSelected()) {
|
|
||||||
colors |= MagicColor.BLACK;
|
|
||||||
}
|
|
||||||
if (buttonMap.get(StatTypes.RED).getSelected()) {
|
|
||||||
colors |= MagicColor.RED;
|
|
||||||
}
|
|
||||||
if (buttonMap.get(StatTypes.GREEN).getSelected()) {
|
|
||||||
colors |= MagicColor.GREEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).getSelected();
|
|
||||||
boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).getSelected();
|
|
||||||
|
|
||||||
Predicate<CardRules> preFinal = null;
|
|
||||||
if (wantMulticolor) {
|
|
||||||
if (colors == 0) { //handle showing all multi-color cards if all 5 colors are filtered
|
|
||||||
preFinal = Presets.IS_MULTICOLOR;
|
|
||||||
if (wantColorless) {
|
|
||||||
preFinal = Predicates.or(preFinal, Presets.IS_COLORLESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (colors != MagicColor.ALL_COLORS) {
|
|
||||||
preFinal = CardRulesPredicates.canCastWithAvailable(colors);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
preFinal = Predicates.not(Presets.IS_MULTICOLOR);
|
|
||||||
if (colors != MagicColor.ALL_COLORS) {
|
|
||||||
preFinal = Predicates.and(CardRulesPredicates.canCastWithAvailable(colors), preFinal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!wantColorless) {
|
|
||||||
if (colors != 0 && colors != MagicColor.ALL_COLORS) {
|
|
||||||
//if colorless filtered out ensure phyrexian cards don't appear
|
|
||||||
//unless at least one of their colors is selected
|
|
||||||
preFinal = Predicates.and(preFinal, CardRulesPredicates.isColor(colors));
|
|
||||||
}
|
|
||||||
preFinal = SFilterUtil.optimizedAnd(preFinal, Predicates.not(Presets.IS_COLORLESS));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (preFinal == null) {
|
|
||||||
return new Predicate<PaperCard>() { //use custom return true delegate to validate the item is a card
|
|
||||||
@Override
|
|
||||||
public boolean apply(PaperCard card) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return Predicates.compose(preFinal, PaperCard.FN_GET_RULES);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,110 +1,21 @@
|
|||||||
package forge.gui.toolbox.itemmanager.filters;
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.card.CardEdition;
|
|
||||||
import forge.game.GameFormat;
|
import forge.game.GameFormat;
|
||||||
import forge.gui.toolbox.itemmanager.ItemManager;
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.gui.toolbox.itemmanager.SFilterUtil;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class CardFormatFilter extends ListLabelFilter<PaperCard> {
|
public class CardFormatFilter extends FormatFilter<PaperCard> {
|
||||||
protected boolean allowReprints = true;
|
|
||||||
protected final Set<GameFormat> formats = new HashSet<GameFormat>();
|
|
||||||
|
|
||||||
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0) {
|
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0) {
|
||||||
super(itemManager0);
|
super(itemManager0);
|
||||||
}
|
}
|
||||||
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0, GameFormat format0) {
|
public CardFormatFilter(ItemManager<? super PaperCard> itemManager0, GameFormat format0) {
|
||||||
super(itemManager0);
|
super(itemManager0, format0);
|
||||||
this.formats.add(format0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTooltip() {
|
|
||||||
Set<String> sets = new HashSet<String>();
|
|
||||||
Set<String> bannedCards = new HashSet<String>();
|
|
||||||
|
|
||||||
for (GameFormat format : this.formats) {
|
|
||||||
List<String> formatSets = format.getAllowedSetCodes();
|
|
||||||
if (formatSets != null) {
|
|
||||||
sets.addAll(formatSets);
|
|
||||||
}
|
|
||||||
List<String> formatBannedCards = format.getBannedCardNames();
|
|
||||||
if (formatBannedCards != null) {
|
|
||||||
bannedCards.addAll(formatBannedCards);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//use HTML tooltips so we can insert line breaks
|
|
||||||
int lastLen = 0;
|
|
||||||
int lineLen = 0;
|
|
||||||
StringBuilder tooltip = new StringBuilder("<html>Sets:");
|
|
||||||
if (sets.isEmpty()) {
|
|
||||||
tooltip.append(" All");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
CardEdition.Collection editions = Singletons.getMagicDb().getEditions();
|
|
||||||
|
|
||||||
for (String code : sets) {
|
|
||||||
// don't let a single line get too long
|
|
||||||
if (50 < lineLen) {
|
|
||||||
tooltip.append("<br>");
|
|
||||||
lastLen += lineLen;
|
|
||||||
lineLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CardEdition edition = editions.get(code);
|
|
||||||
tooltip.append(" ").append(edition.getName()).append(" (").append(code).append("),");
|
|
||||||
lineLen = tooltip.length() - lastLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// chop off last comma
|
|
||||||
tooltip.delete(tooltip.length() - 1, tooltip.length());
|
|
||||||
|
|
||||||
if (this.allowReprints) {
|
|
||||||
tooltip.append("<br><br>Allowing identical cards from other sets");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bannedCards.isEmpty()) {
|
|
||||||
tooltip.append("<br><br>Banned:");
|
|
||||||
lastLen += lineLen;
|
|
||||||
lineLen = 0;
|
|
||||||
|
|
||||||
for (String cardName : bannedCards) {
|
|
||||||
// don't let a single line get too long
|
|
||||||
if (50 < lineLen) {
|
|
||||||
tooltip.append("<br>");
|
|
||||||
lastLen += lineLen;
|
|
||||||
lineLen = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tooltip.append(" ").append(cardName).append(";");
|
|
||||||
lineLen = tooltip.length() - lastLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// chop off last semicolon
|
|
||||||
tooltip.delete(tooltip.length() - 1, tooltip.length());
|
|
||||||
}
|
|
||||||
tooltip.append("</html>");
|
|
||||||
return tooltip.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reset() {
|
|
||||||
this.formats.clear();
|
|
||||||
this.updateLabel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,49 +25,8 @@ public class CardFormatFilter extends ListLabelFilter<PaperCard> {
|
|||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canAddFormat(GameFormat format, ItemFilter<PaperCard> existingFilter) {
|
|
||||||
return existingFilter == null || !((CardFormatFilter)existingFilter).formats.contains(format);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Merge the given filter with this filter if possible
|
|
||||||
* @param filter
|
|
||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("rawtypes")
|
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
CardFormatFilter cardFormatFilter = (CardFormatFilter)filter;
|
|
||||||
this.formats.addAll(cardFormatFilter.formats);
|
|
||||||
this.allowReprints = cardFormatFilter.allowReprints;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getCaption() {
|
|
||||||
return "Format";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getCount() {
|
|
||||||
return this.formats.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Iterable<String> getList() {
|
|
||||||
Set<String> strings = new HashSet<String>();
|
|
||||||
for (GameFormat f : this.formats) {
|
|
||||||
strings.add(f.getName());
|
|
||||||
}
|
|
||||||
return strings;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final Predicate<PaperCard> buildPredicate() {
|
protected final Predicate<PaperCard> buildPredicate() {
|
||||||
List<Predicate<PaperCard>> predicates = new ArrayList<Predicate<PaperCard>>();
|
return SFilterUtil.buildFormatFilter(this.formats, this.allowReprints);
|
||||||
for (GameFormat f : this.formats) {
|
|
||||||
predicates.add(allowReprints ? f.getFilterRules() : f.getFilterPrinted());
|
|
||||||
}
|
|
||||||
return Predicates.or(predicates);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,8 +54,7 @@ public class CardQuestWorldFilter extends CardFormatFilter {
|
|||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
CardQuestWorldFilter cardQuestWorldFilter = (CardQuestWorldFilter)filter;
|
CardQuestWorldFilter cardQuestWorldFilter = (CardQuestWorldFilter)filter;
|
||||||
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
|
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
|
||||||
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||||
|
|||||||
@@ -50,17 +50,6 @@ public class CardSearchFilter extends TextSearchFilter<PaperCard> {
|
|||||||
this.btnText.setSelected(true);
|
this.btnText.setSelected(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Merge the given filter with this filter if possible
|
|
||||||
* @param filter
|
|
||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("rawtypes")
|
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final void buildWidget(JPanel widget) {
|
protected final void buildWidget(JPanel widget) {
|
||||||
super.buildWidget(widget);
|
super.buildWidget(widget);
|
||||||
|
|||||||
@@ -40,8 +40,7 @@ public class CardSetFilter extends CardFormatFilter {
|
|||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
CardSetFilter cardSetFilter = (CardSetFilter)filter;
|
CardSetFilter cardSetFilter = (CardSetFilter)filter;
|
||||||
this.sets.addAll(cardSetFilter.sets);
|
this.sets.addAll(cardSetFilter.sets);
|
||||||
this.allowReprints = cardSetFilter.allowReprints;
|
this.allowReprints = cardSetFilter.allowReprints;
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
|
||||||
|
import forge.gui.toolbox.FLabel;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.gui.toolbox.itemmanager.SFilterUtil;
|
||||||
|
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
import forge.item.PaperCard;
|
||||||
|
import forge.util.ItemPoolView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckColorFilter extends StatTypeFilter<DeckBox> {
|
||||||
|
public DeckColorFilter(ItemManager<? super DeckBox> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemFilter<DeckBox> createCopy() {
|
||||||
|
return new DeckColorFilter(itemManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void buildWidget(JPanel widget) {
|
||||||
|
addColorButtons(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final Predicate<DeckBox> buildPredicate() {
|
||||||
|
return DeckBox.createPredicate(SFilterUtil.buildColorFilter(buttonMap));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterFiltersApplied() {
|
||||||
|
final ItemPoolView<? super DeckBox> items = itemManager.getFilteredItems();
|
||||||
|
|
||||||
|
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
|
||||||
|
if (btn.getKey().predicate != null) {
|
||||||
|
int count = items.countAll(DeckBox.createPredicate(Predicates.compose(btn.getKey().predicate,
|
||||||
|
PaperCard.FN_GET_RULES)), DeckBox.class);
|
||||||
|
btn.getValue().setText(String.valueOf(count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getWidget().revalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.gui.toolbox.itemmanager.SFilterUtil;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckFormatFilter extends FormatFilter<DeckBox> {
|
||||||
|
public DeckFormatFilter(ItemManager<? super DeckBox> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
public DeckFormatFilter(ItemManager<? super DeckBox> itemManager0, GameFormat format0) {
|
||||||
|
super(itemManager0, format0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemFilter<DeckBox> createCopy() {
|
||||||
|
DeckFormatFilter copy = new DeckFormatFilter(itemManager);
|
||||||
|
copy.formats.addAll(this.formats);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final Predicate<DeckBox> buildPredicate() {
|
||||||
|
return DeckBox.createPredicate(SFilterUtil.buildFormatFilter(this.formats, this.allowReprints));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import forge.Singletons;
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
import forge.quest.QuestWorld;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckQuestWorldFilter extends DeckFormatFilter {
|
||||||
|
private final Set<QuestWorld> questWorlds = new HashSet<QuestWorld>();
|
||||||
|
|
||||||
|
public DeckQuestWorldFilter(ItemManager<? super DeckBox> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
public DeckQuestWorldFilter(ItemManager<? super DeckBox> itemManager0, QuestWorld questWorld0) {
|
||||||
|
super(itemManager0);
|
||||||
|
this.questWorlds.add(questWorld0);
|
||||||
|
this.formats.add(getQuestWorldFormat(questWorld0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemFilter<DeckBox> createCopy() {
|
||||||
|
DeckQuestWorldFilter copy = new DeckQuestWorldFilter(itemManager);
|
||||||
|
copy.questWorlds.addAll(this.questWorlds);
|
||||||
|
for (QuestWorld w : this.questWorlds) {
|
||||||
|
copy.formats.add(getQuestWorldFormat(w));
|
||||||
|
}
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
this.questWorlds.clear();
|
||||||
|
super.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean canAddQuestWorld(QuestWorld questWorld, ItemFilter<DeckBox> existingFilter) {
|
||||||
|
if (questWorld.getFormat() == null && Singletons.getModel().getQuest().getMainFormat() == null) {
|
||||||
|
return false; //must have format
|
||||||
|
}
|
||||||
|
return existingFilter == null || !((DeckQuestWorldFilter)existingFilter).questWorlds.contains(questWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the given filter with this filter if possible
|
||||||
|
* @param filter
|
||||||
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
|
DeckQuestWorldFilter cardQuestWorldFilter = (DeckQuestWorldFilter)filter;
|
||||||
|
this.questWorlds.addAll(cardQuestWorldFilter.questWorlds);
|
||||||
|
for (QuestWorld w : cardQuestWorldFilter.questWorlds) {
|
||||||
|
this.formats.add(getQuestWorldFormat(w));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getCaption() {
|
||||||
|
return "Quest World";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getCount() {
|
||||||
|
return this.questWorlds.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterable<String> getList() {
|
||||||
|
Set<String> strings = new HashSet<String>();
|
||||||
|
for (QuestWorld w : this.questWorlds) {
|
||||||
|
strings.add(w.getName());
|
||||||
|
}
|
||||||
|
return strings;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GameFormat getQuestWorldFormat(QuestWorld w) {
|
||||||
|
GameFormat format = w.getFormat();
|
||||||
|
if (format == null) {
|
||||||
|
//assumes that no world other than the main world will have a null format
|
||||||
|
format = Singletons.getModel().getQuest().getMainFormat();
|
||||||
|
}
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckSearchFilter extends TextSearchFilter<DeckBox> {
|
||||||
|
public DeckSearchFilter(ItemManager<? super DeckBox> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemFilter<DeckBox> createCopy() {
|
||||||
|
DeckSearchFilter copy = new DeckSearchFilter(itemManager);
|
||||||
|
copy.getWidget(); //initialize widget
|
||||||
|
copy.txtSearch.setText(this.txtSearch.getText());
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.home.quest.DialogChooseSets;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DeckSetFilter extends DeckFormatFilter {
|
||||||
|
private final Set<String> sets = new HashSet<String>();
|
||||||
|
|
||||||
|
public DeckSetFilter(ItemManager<? super DeckBox> itemManager0, Collection<String> sets0, boolean allowReprints0) {
|
||||||
|
super(itemManager0);
|
||||||
|
this.sets.addAll(sets0);
|
||||||
|
this.formats.add(new GameFormat(null, this.sets, null));
|
||||||
|
this.allowReprints = allowReprints0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemFilter<DeckBox> createCopy() {
|
||||||
|
return new DeckSetFilter(itemManager, this.sets, this.allowReprints);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
this.sets.clear();
|
||||||
|
super.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the given filter with this filter if possible
|
||||||
|
* @param filter
|
||||||
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
|
DeckSetFilter cardSetFilter = (DeckSetFilter)filter;
|
||||||
|
this.sets.addAll(cardSetFilter.sets);
|
||||||
|
this.allowReprints = cardSetFilter.allowReprints;
|
||||||
|
this.formats.clear();
|
||||||
|
this.formats.add(new GameFormat(null, this.sets, null));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getCaption() {
|
||||||
|
return "Set";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getCount() {
|
||||||
|
return this.sets.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterable<String> getList() {
|
||||||
|
return this.sets;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
|
||||||
|
import forge.gui.toolbox.FLabel;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
|
||||||
|
import forge.item.DeckBox;
|
||||||
|
import forge.item.InventoryItem;
|
||||||
|
import forge.item.PaperCard;
|
||||||
|
import forge.util.ItemPoolView;
|
||||||
|
|
||||||
|
public abstract class DeckStatTypeFilter extends StatTypeFilter<DeckBox> {
|
||||||
|
public DeckStatTypeFilter(ItemManager<? super DeckBox> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected <U extends InventoryItem> boolean showUnsupportedItem(U item) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterFiltersApplied() {
|
||||||
|
final ItemPoolView<? super DeckBox> items = itemManager.getFilteredItems();
|
||||||
|
|
||||||
|
for (Map.Entry<SItemManagerUtil.StatTypes, FLabel> btn : buttonMap.entrySet()) {
|
||||||
|
if (btn.getKey().predicate != null) {
|
||||||
|
int count = items.countAll(DeckBox.createPredicate(Predicates.compose(btn.getKey().predicate, PaperCard.FN_GET_RULES)), DeckBox.class);
|
||||||
|
btn.getValue().setText(String.valueOf(count));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getWidget().revalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package forge.gui.toolbox.itemmanager.filters;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import forge.Singletons;
|
||||||
|
import forge.card.CardEdition;
|
||||||
|
import forge.game.GameFormat;
|
||||||
|
import forge.gui.toolbox.itemmanager.ItemManager;
|
||||||
|
import forge.item.InventoryItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Write javadoc for this type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class FormatFilter<T extends InventoryItem> extends ListLabelFilter<T> {
|
||||||
|
protected boolean allowReprints = true;
|
||||||
|
protected final Set<GameFormat> formats = new HashSet<GameFormat>();
|
||||||
|
|
||||||
|
public FormatFilter(ItemManager<? super T> itemManager0) {
|
||||||
|
super(itemManager0);
|
||||||
|
}
|
||||||
|
public FormatFilter(ItemManager<? super T> itemManager0, GameFormat format0) {
|
||||||
|
super(itemManager0);
|
||||||
|
this.formats.add(format0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getTooltip() {
|
||||||
|
Set<String> sets = new HashSet<String>();
|
||||||
|
Set<String> bannedCards = new HashSet<String>();
|
||||||
|
|
||||||
|
for (GameFormat format : this.formats) {
|
||||||
|
List<String> formatSets = format.getAllowedSetCodes();
|
||||||
|
if (formatSets != null) {
|
||||||
|
sets.addAll(formatSets);
|
||||||
|
}
|
||||||
|
List<String> formatBannedCards = format.getBannedCardNames();
|
||||||
|
if (formatBannedCards != null) {
|
||||||
|
bannedCards.addAll(formatBannedCards);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//use HTML tooltips so we can insert line breaks
|
||||||
|
int lastLen = 0;
|
||||||
|
int lineLen = 0;
|
||||||
|
StringBuilder tooltip = new StringBuilder("<html>Sets:");
|
||||||
|
if (sets.isEmpty()) {
|
||||||
|
tooltip.append(" All");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CardEdition.Collection editions = Singletons.getMagicDb().getEditions();
|
||||||
|
|
||||||
|
for (String code : sets) {
|
||||||
|
// don't let a single line get too long
|
||||||
|
if (50 < lineLen) {
|
||||||
|
tooltip.append("<br>");
|
||||||
|
lastLen += lineLen;
|
||||||
|
lineLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CardEdition edition = editions.get(code);
|
||||||
|
tooltip.append(" ").append(edition.getName()).append(" (").append(code).append("),");
|
||||||
|
lineLen = tooltip.length() - lastLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
// chop off last comma
|
||||||
|
tooltip.delete(tooltip.length() - 1, tooltip.length());
|
||||||
|
|
||||||
|
if (this.allowReprints) {
|
||||||
|
tooltip.append("<br><br>Allowing identical cards from other sets");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bannedCards.isEmpty()) {
|
||||||
|
tooltip.append("<br><br>Banned:");
|
||||||
|
lastLen += lineLen;
|
||||||
|
lineLen = 0;
|
||||||
|
|
||||||
|
for (String cardName : bannedCards) {
|
||||||
|
// don't let a single line get too long
|
||||||
|
if (50 < lineLen) {
|
||||||
|
tooltip.append("<br>");
|
||||||
|
lastLen += lineLen;
|
||||||
|
lineLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tooltip.append(" ").append(cardName).append(";");
|
||||||
|
lineLen = tooltip.length() - lastLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
// chop off last semicolon
|
||||||
|
tooltip.delete(tooltip.length() - 1, tooltip.length());
|
||||||
|
}
|
||||||
|
tooltip.append("</html>");
|
||||||
|
return tooltip.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
this.formats.clear();
|
||||||
|
this.updateLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends InventoryItem> boolean canAddFormat(GameFormat format, FormatFilter<T> existingFilter) {
|
||||||
|
return existingFilter == null || !existingFilter.formats.contains(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the given filter with this filter if possible
|
||||||
|
* @param filter
|
||||||
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
|
FormatFilter<T> formatFilter = (FormatFilter<T>)filter;
|
||||||
|
this.formats.addAll(formatFilter.formats);
|
||||||
|
this.allowReprints = formatFilter.allowReprints;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getCaption() {
|
||||||
|
return "Format";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getCount() {
|
||||||
|
return this.formats.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterable<String> getList() {
|
||||||
|
Set<String> strings = new HashSet<String>();
|
||||||
|
for (GameFormat f : this.formats) {
|
||||||
|
strings.add(f.getName());
|
||||||
|
}
|
||||||
|
return strings;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -153,8 +153,7 @@ public abstract class ItemFilter<T extends InventoryItem> {
|
|||||||
* @param filter
|
* @param filter
|
||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("rawtypes")
|
public abstract boolean merge(ItemFilter<?> filter);
|
||||||
public abstract boolean merge(ItemFilter filter);
|
|
||||||
|
|
||||||
protected abstract void buildWidget(JPanel widget);
|
protected abstract void buildWidget(JPanel widget);
|
||||||
protected abstract void doWidgetLayout(LayoutHelper helper);
|
protected abstract void doWidgetLayout(LayoutHelper helper);
|
||||||
|
|||||||
@@ -25,6 +25,16 @@ public abstract class StatTypeFilter<T extends InventoryItem> extends ToggleButt
|
|||||||
buttonMap = new HashMap<SItemManagerUtil.StatTypes, FLabel>();
|
buttonMap = new HashMap<SItemManagerUtil.StatTypes, FLabel>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void addColorButtons(JPanel widget) {
|
||||||
|
addToggleButton(widget, StatTypes.WHITE);
|
||||||
|
addToggleButton(widget, StatTypes.BLUE);
|
||||||
|
addToggleButton(widget, StatTypes.BLACK);
|
||||||
|
addToggleButton(widget, StatTypes.RED);
|
||||||
|
addToggleButton(widget, StatTypes.GREEN);
|
||||||
|
addToggleButton(widget, StatTypes.COLORLESS);
|
||||||
|
addToggleButton(widget, StatTypes.MULTICOLOR);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
protected void addToggleButton(JPanel widget, final StatTypes st) {
|
protected void addToggleButton(JPanel widget, final StatTypes st) {
|
||||||
StringBuilder tooltip = new StringBuilder();
|
StringBuilder tooltip = new StringBuilder();
|
||||||
|
|||||||
@@ -57,8 +57,7 @@ public class TextSearchFilter<T extends InventoryItem> extends ItemFilter<T> {
|
|||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,8 +103,7 @@ public abstract class ToggleButtonsFilter<T extends InventoryItem> extends ItemF
|
|||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,8 +128,7 @@ public abstract class ValueRangeFilter<T extends InventoryItem> extends ItemFilt
|
|||||||
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
* @return true if filter merged in or to suppress adding a new filter, false to allow adding new filter
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("rawtypes")
|
public boolean merge(ItemFilter<?> filter) {
|
||||||
public boolean merge(ItemFilter filter) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ public class LimitedDeckBuilder extends DeckGeneratorBase{
|
|||||||
private void findBasicLandSets() {
|
private void findBasicLandSets() {
|
||||||
Set<String> sets = new HashSet<String>();
|
Set<String> sets = new HashSet<String>();
|
||||||
for (PaperCard cp : aiPlayables) {
|
for (PaperCard cp : aiPlayables) {
|
||||||
CardEdition ee = Singletons.getMagicDb().getEditions().get(cp.edition);
|
CardEdition ee = Singletons.getMagicDb().getEditions().get(cp.getEdition());
|
||||||
if( !sets.contains(cp.getEdition()) && CardEdition.Predicates.hasBasicLands.apply(ee))
|
if( !sets.contains(cp.getEdition()) && CardEdition.Predicates.hasBasicLands.apply(ee))
|
||||||
sets.add(cp.getEdition());
|
sets.add(cp.getEdition());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user