From c0c541832e687ad8fbfe727b67e414a5e0b94265 Mon Sep 17 00:00:00 2001 From: myk Date: Thu, 7 Feb 2013 10:50:38 +0000 Subject: [PATCH] add pack filter in spell shop --- .../java/forge/card/CardRulesPredicates.java | 6 ++++++ .../forge/gui/deckeditor/SEditorUtil.java | 21 ++++++++++++------- .../forge/gui/deckeditor/SFilterUtil.java | 2 +- .../deckeditor/controllers/CCardCatalog.java | 19 ++++++++++------- .../controllers/CEditorQuestCardShop.java | 4 ++++ .../deckeditor/tables/EditorTableView.java | 14 +------------ .../gui/deckeditor/views/VCardCatalog.java | 21 ++++++++++++------- .../gui/deckeditor/views/VCurrentDeck.java | 5 +++-- src/main/java/forge/gui/toolbox/FSkin.java | 2 +- src/main/java/forge/item/ItemPoolView.java | 12 +++++++++++ 10 files changed, 66 insertions(+), 40 deletions(-) diff --git a/src/main/java/forge/card/CardRulesPredicates.java b/src/main/java/forge/card/CardRulesPredicates.java index e76d506f7b9..5f0aceff836 100644 --- a/src/main/java/forge/card/CardRulesPredicates.java +++ b/src/main/java/forge/card/CardRulesPredicates.java @@ -338,6 +338,9 @@ public final class CardRulesPredicates { @Override public boolean apply(final CardRules subject) { + if (null == subject) { + return true; + } switch (this.op) { case CountColors: return subject.getColor().countColors() == this.color; @@ -413,6 +416,9 @@ public final class CardRulesPredicates { @Override public boolean apply(final CardRules card) { + if (null == card) { + return true; + } return this.shouldBeEqual == card.getType().typeContains(this.operand); } diff --git a/src/main/java/forge/gui/deckeditor/SEditorUtil.java b/src/main/java/forge/gui/deckeditor/SEditorUtil.java index 776a4b0328e..9f3e4a05589 100644 --- a/src/main/java/forge/gui/deckeditor/SEditorUtil.java +++ b/src/main/java/forge/gui/deckeditor/SEditorUtil.java @@ -32,9 +32,7 @@ import forge.util.TextUtil; public final class SEditorUtil { /** An enum to encapsulate metadata for the stats/filter objects. */ public static enum StatTypes { - TOTAL (FSkin.ZoneImages.ICO_HAND, null), - // PRODUCTS (FSkin.EditorImages.IMG_PRODUCTS, null), - + TOTAL (FSkin.ZoneImages.ICO_HAND, null), WHITE (FSkin.ManaImages.IMG_WHITE, CardRulesPredicates.Presets.IS_WHITE), BLUE (FSkin.ManaImages.IMG_BLUE, CardRulesPredicates.Presets.IS_BLUE), BLACK (FSkin.ManaImages.IMG_BLACK, CardRulesPredicates.Presets.IS_BLACK), @@ -43,6 +41,7 @@ public final class SEditorUtil { COLORLESS (FSkin.ManaImages.IMG_COLORLESS, CardRulesPredicates.Presets.IS_COLORLESS), MULTICOLOR (FSkin.EditorImages.IMG_MULTI, CardRulesPredicates.Presets.IS_MULTICOLOR), + PACK (FSkin.EditorImages.IMG_PACK, null), LAND (FSkin.EditorImages.IMG_LAND, CardRulesPredicates.Presets.IS_LAND), ARTIFACT (FSkin.EditorImages.IMG_ARTIFACT, CardRulesPredicates.Presets.IS_ARTIFACT), CREATURE (FSkin.EditorImages.IMG_CREATURE, CardRulesPredicates.Presets.IS_CREATURE), @@ -60,6 +59,9 @@ public final class SEditorUtil { } public String toLabelString() { + if (this == PACK) { + return "Card packs and prebuilt decks"; + } return TextUtil.enumToLabel(this) + " cards"; } } @@ -79,21 +81,24 @@ public final class SEditorUtil { * setStats. * * @param   the generic type - * @param deck   ItemPoolView + * @param items   ItemPoolView * @param view   {@link forge.gui.deckeditor.views.ITableContainer} */ - public static void setStats(final ItemPoolView deck, final ITableContainer view) { + public static void setStats(final ItemPoolView items, final ITableContainer view) { for (StatTypes s : StatTypes.values()) { switch (s) { case TOTAL: - view.getStatLabel(StatTypes.TOTAL).setText(String.valueOf(deck.countAll())); + view.getStatLabel(s).setText(String.valueOf(items.countAll())); + break; + case PACK: + view.getStatLabel(s).setText(String.valueOf(items.countNonCards())); break; default: view.getStatLabel(s).setText(String.valueOf( - Aggregates.sum(Iterables.filter(deck, Predicates.compose(s.predicate, deck.getFnToCard())), deck.getFnToCount()))); + Aggregates.sum(Iterables.filter(items, Predicates.compose(s.predicate, items.getFnToCard())), items.getFnToCount()))); } } - } // getStats() + } /** * Resets components that may have been changed diff --git a/src/main/java/forge/gui/deckeditor/SFilterUtil.java b/src/main/java/forge/gui/deckeditor/SFilterUtil.java index 3434a0f1749..347802341b8 100644 --- a/src/main/java/forge/gui/deckeditor/SFilterUtil.java +++ b/src/main/java/forge/gui/deckeditor/SFilterUtil.java @@ -50,7 +50,7 @@ public class SFilterUtil { if (statLabels.get(s).getSelected()) { types.add(s.predicate); } break; - case TOTAL: + case TOTAL: case PACK: // ignore break; diff --git a/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java b/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java index 64dfdf70308..a39ec236689 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CCardCatalog.java @@ -319,20 +319,23 @@ public enum CCardCatalog implements ICDoc { VCardCatalog.SINGLETON_INSTANCE.getLblType().getSelected(), VCardCatalog.SINGLETON_INSTANCE.getLblText().getSelected())); - Predicate cardFilter = Predicates.and(cardPredicates); + Predicate cardFilter = Predicates.and(cardPredicates); - // Until this is filterable, always show packs and decks in the card shop. - List> itemPredicates = new ArrayList>(); - itemPredicates.add(cardFilter); - itemPredicates.add(ItemPredicate.Presets.IS_PACK); - itemPredicates.add(ItemPredicate.Presets.IS_DECK); - Predicate filter = Predicates.or(itemPredicates); + // show packs and decks in the card shop according to the toggle setting + // this is special-cased apart from the buildColorAndTypeFilter() above + if (VCardCatalog.SINGLETON_INSTANCE.getStatLabel(SEditorUtil.StatTypes.PACK).getSelected()) { + List> itemPredicates = new ArrayList>(); + itemPredicates.add(cardFilter); + itemPredicates.add(ItemPredicate.Presets.IS_PACK); + itemPredicates.add(ItemPredicate.Presets.IS_DECK); + cardFilter = Predicates.or(itemPredicates); + } // Apply to table // TODO: is there really no way to make this type safe? ACEditorBase editor = CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController(); if (null != editor) { - ((ACEditorBase)editor).getTableCatalog().setFilter(filter); + ((ACEditorBase)editor).getTableCatalog().setFilter(cardFilter); } } diff --git a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java index 9ca87d7e6e2..507b1969823 100644 --- a/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java +++ b/src/main/java/forge/gui/deckeditor/controllers/CEditorQuestCardShop.java @@ -462,6 +462,8 @@ public final class CEditorQuestCardShop extends ACEditorBaseSelling cards at " + formatter.format(multiPercent) + "% of their value.
" + maxSellingPrice + ""); + + VCardCatalog.SINGLETON_INSTANCE.getStatLabel(SEditorUtil.StatTypes.PACK).setVisible(true); } /* (non-Javadoc) @@ -492,6 +494,8 @@ public final class CEditorQuestCardShop extends ACEditorBase { * @param view0   the {@link javax.gui.deckeditor.views.ITableCOntainer} * @param cols0   List> of additional columns for this */ - @SuppressWarnings("unchecked") public void setup(final ITableContainer view0, final List> cols0) { final DefaultTableColumnModel colmodel = new DefaultTableColumnModel(); @@ -211,17 +209,7 @@ public final class EditorTableView { this.model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(final TableModelEvent ev) { - final List deck = EditorTableView.this.model.getCards().toFlatList(); - final ItemPool filteredDeck = new ItemPool((Class) CardPrinted.class); - - // Filter out non-card items (booster packs, etc.) - for (T item : deck) { - if (item instanceof CardPrinted) { - filteredDeck.add(item, 1); - } - } - - SEditorUtil.setStats(filteredDeck, view0); + SEditorUtil.setStats(EditorTableView.this.model.getCards(), view0); } }); } diff --git a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java index f3d6e9dc2f2..63554463229 100644 --- a/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java +++ b/src/main/java/forge/gui/deckeditor/views/VCardCatalog.java @@ -54,6 +54,7 @@ public enum VCardCatalog implements IVDoc, ITableContainer { private final FLabel lblTitle = new FLabel.Builder().fontSize(14).build(); // Total and color count labels/filter toggles + private final Dimension labelSize = new Dimension(60, 24); private final JPanel pnlStats = new JPanel(new WrapLayout(FlowLayout.LEFT)); private final Map statLabels = new HashMap(); @@ -125,12 +126,19 @@ public enum VCardCatalog implements IVDoc, ITableContainer { for (SEditorUtil.StatTypes s : SEditorUtil.StatTypes.values()) { FLabel label = buildToggleLabel(s, SEditorUtil.StatTypes.TOTAL != s); statLabels.put(s, label); + JComponent component = label; if (SEditorUtil.StatTypes.TOTAL == s) { label.setToolTipText("Total cards (click to toggle all filters)"); - } else if (9 == statLabels.size()) { - pnlStats.add(buildToggleLabel(null, false)); + } else if (SEditorUtil.StatTypes.PACK == s) { + // wrap in a constant-size panel so we can change its visibility without affecting layout + component = new JPanel(new MigLayout("insets 0, gap 0")); + component.setPreferredSize(labelSize); + component.setMinimumSize(labelSize); + component.setOpaque(false); + label.setVisible(false); + component.add(label); } - pnlStats.add(label); + pnlStats.add(component); } pnlAddButtons.setOpaque(false); @@ -235,13 +243,12 @@ public enum VCardCatalog implements IVDoc, ITableContainer { //========== Other methods private FLabel buildToggleLabel(SEditorUtil.StatTypes s, boolean selectable) { FLabel label = new FLabel.Builder() - .icon(null == s ? null : s.img).iconScaleAuto(false) + .icon(s.img).iconScaleAuto(false) .fontSize(11) - .tooltip(null == s ? null : s.toLabelString() + "(click to toggle the filter for this card type)") - .hoverable(null != s).selectable(selectable).selected(selectable) + .tooltip(s.toLabelString() + " (click to toggle the filter)") + .hoverable().selectable(selectable).selected(selectable) .build(); - Dimension labelSize = new Dimension(60, 24); label.setPreferredSize(labelSize); label.setMinimumSize(labelSize); diff --git a/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java b/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java index 82acff27330..e5902f75613 100644 --- a/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java +++ b/src/main/java/forge/gui/deckeditor/views/VCurrentDeck.java @@ -153,10 +153,11 @@ public enum VCurrentDeck implements IVDoc, ITableContainer { for (SEditorUtil.StatTypes s : SEditorUtil.StatTypes.values()) { FLabel label = buildLabel(s); statLabels.put(s, label); - if (9 == statLabels.size()) { + if (SEditorUtil.StatTypes.PACK == s) { pnlStats.add(buildLabel(null)); + } else { + pnlStats.add(label); } - pnlStats.add(label); } pnlRemoveButtons.setOpaque(false); diff --git a/src/main/java/forge/gui/toolbox/FSkin.java b/src/main/java/forge/gui/toolbox/FSkin.java index d653996aa9e..12d707febad 100644 --- a/src/main/java/forge/gui/toolbox/FSkin.java +++ b/src/main/java/forge/gui/toolbox/FSkin.java @@ -324,7 +324,7 @@ public enum FSkin { IMG_LAND (new int[] {120, 720, 40, 40}), /** */ IMG_MULTI (new int[] {80, 720, 40, 40}), /** */ IMG_PLANESWALKER (new int[] {200, 720, 40, 40}), /** */ - IMG_PRODUCTS (new int[] {80, 760, 40, 40}), /** */ + IMG_PACK (new int[] {80, 760, 40, 40}), /** */ IMG_SORCERY (new int[] {160, 720, 40, 40}); private int[] coords; diff --git a/src/main/java/forge/item/ItemPoolView.java b/src/main/java/forge/item/ItemPoolView.java index 2c9cbe6a5ab..a95ad027680 100644 --- a/src/main/java/forge/item/ItemPoolView.java +++ b/src/main/java/forge/item/ItemPoolView.java @@ -171,6 +171,18 @@ public class ItemPoolView implements Iterable e : cards.entrySet()) { + if (!(e.getKey() instanceof CardPrinted)) { + result += e.getValue(); + } + } + } + return result; + } + /** * * countDistinct.