From df50a0a38d1cd322f72b3dd539a5fbd35f81cbf4 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 30 Nov 2013 00:27:47 +0000 Subject: [PATCH] Support showing only colorless or multicolor cards --- .../gui/toolbox/itemmanager/SFilterUtil.java | 65 ++++++++++++------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java index 0595c2411ea..d86d7c54d3a 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/SFilterUtil.java @@ -35,54 +35,76 @@ public class SFilterUtil { final List> colors = new ArrayList>(); final List> notColors = new ArrayList>(); final List> types = new ArrayList>(); - + boolean wantMulticolor = false; - Predicate preExceptMulti = null; for (SItemManagerUtil.StatTypes s : SItemManagerUtil.StatTypes.values()) { switch (s) { - case WHITE: case BLUE: case BLACK: case RED: case GREEN: case COLORLESS: + case WHITE: case BLUE: case BLACK: case RED: case GREEN: if (statLabels.get(s).getSelected()) { colors.add(s.predicate); } else { notColors.add(Predicates.not(s.predicate)); } break; + case COLORLESS: + if (statLabels.get(s).getSelected()) { colors.add(s.predicate); } + break; case MULTICOLOR: wantMulticolor = statLabels.get(s).getSelected(); - preExceptMulti = wantMulticolor ? null : Predicates.not(s.predicate); break; case LAND: case ARTIFACT: case CREATURE: case ENCHANTMENT: case PLANESWALKER: case INSTANT: case SORCERY: if (statLabels.get(s).getSelected()) { types.add(s.predicate); } break; - case TOTAL: case PACK: // ignore break; - default: throw new RuntimeException("unhandled enum value: " + s); } } - - if (wantMulticolor && !colors.isEmpty() && !notColors.isEmpty()) { - preExceptMulti = Predicates.and(notColors); //ensure multicolor cards with filtered colors don't show up + + Predicate preFinal; + Predicate preColors = colors.size() == 6 ? null : Predicates.or(colors); + + //ensure multicolor cards with filtered out colors don't show up + //unless card is hybrid playable using colors that aren't filtered out + if (wantMulticolor) { + if (colors.isEmpty()) { + preFinal = CardRulesPredicates.Presets.IS_MULTICOLOR; + } + else if (!notColors.isEmpty()) { + if (notColors.size() == 5) { + //if all 5 colors filtered, show only cards that either multicolor or colorless + preFinal = Predicates.or(CardRulesPredicates.Presets.IS_MULTICOLOR, preColors); + } + else { + preFinal = optimizedAnd( + Predicates.or( + Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR), + Predicates.and(notColors) + ), + preColors); + } + } + else { + preFinal = preColors; + } + } + else { + preFinal = optimizedAnd(Predicates.not(CardRulesPredicates.Presets.IS_MULTICOLOR), preColors); } - Predicate preColors = colors.size() == 6 ? null : Predicates.or(colors); - Predicate preFinal = colors.isEmpty() && wantMulticolor ? - CardRulesPredicates.Presets.IS_MULTICOLOR : optimizedAnd(preExceptMulti, preColors); - - if (null == preFinal && 7 == types.size()) { + if (preFinal == null && types.size() == 7) { return Predicates.alwaysTrue(); } Predicate typesFinal = Predicates.compose(Predicates.or(types), PaperCard.FN_GET_RULES); - if (null == preFinal) { + if (preFinal == null) { return typesFinal; } - + Predicate colorFinal = Predicates.compose(preFinal, PaperCard.FN_GET_RULES); - if (7 == types.size()) { + if (types.size() == 7) { return colorFinal; } - + return Predicates.and(colorFinal, typesFinal); } @@ -93,7 +115,7 @@ public class SFilterUtil { if (text.trim().isEmpty()) { return Predicates.alwaysTrue(); } - + String[] splitText = text.replaceAll(",", "").replaceAll(" ", " ").split(" "); List> terms = new ArrayList>(); @@ -107,7 +129,7 @@ public class SFilterUtil { terms.add(Predicates.or(subands)); } Predicate textFilter = invert ? Predicates.not(Predicates.or(terms)) : Predicates.and(terms); - + return Predicates.compose(textFilter, PaperCard.FN_GET_RULES); } @@ -121,8 +143,7 @@ public class SFilterUtil { return optimizedAnd(pMin, pMax); } - private static Predicate optimizedAnd(Predicate p1, Predicate p2) - { + private static Predicate optimizedAnd(Predicate p1, Predicate p2) { return p1 == null ? p2 : (p2 == null ? p1 : Predicates.and(p1, p2)); }