From f551ff8f2c8580b9937ed59e283ddff6b3c3fe13 Mon Sep 17 00:00:00 2001 From: Failure Date: Sat, 25 Jan 2025 21:36:00 -0800 Subject: [PATCH] add exclusive color button --- .../mage/client/components/tray/MageTray.java | 2 +- .../mage/client/deckeditor/CardSelector.java | 46 +++++++++++++++++- .../src/main/resources/buttons/lock.png | Bin 0 -> 304 bytes .../mage/cards/repository/CardCriteria.java | 31 ++++++++++++ 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 Mage.Client/src/main/resources/buttons/lock.png diff --git a/Mage.Client/src/main/java/mage/client/components/tray/MageTray.java b/Mage.Client/src/main/java/mage/client/components/tray/MageTray.java index 4bd3166cbe9..56d38168f74 100644 --- a/Mage.Client/src/main/java/mage/client/components/tray/MageTray.java +++ b/Mage.Client/src/main/java/mage/client/components/tray/MageTray.java @@ -19,7 +19,7 @@ public enum MageTray { private Image flashedImage; private TrayIcon trayIcon; - private int state = 0; + private int state = 3; public void install() { if (!SystemTray.isSupported()) { diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index e124ec9b9cd..b2c7bb741b3 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -240,26 +240,44 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene if (limited) { List> predicates = new ArrayList<>(); + List> exclusion = new ArrayList<>(); if (this.tbGreen.isSelected()) { predicates.add(new ColorPredicate(ObjectColor.GREEN)); + } else { + exclusion.add(new ColorPredicate(ObjectColor.GREEN)); } if (this.tbRed.isSelected()) { predicates.add(new ColorPredicate(ObjectColor.RED)); + } else { + exclusion.add(new ColorPredicate(ObjectColor.RED)); } if (this.tbBlack.isSelected()) { predicates.add(new ColorPredicate(ObjectColor.BLACK)); + } else { + exclusion.add(new ColorPredicate(ObjectColor.BLACK)); } if (this.tbBlue.isSelected()) { predicates.add(new ColorPredicate(ObjectColor.BLUE)); + } else { + exclusion.add(new ColorPredicate(ObjectColor.BLUE)); } if (this.tbWhite.isSelected()) { predicates.add(new ColorPredicate(ObjectColor.WHITE)); + } else { + exclusion.add(new ColorPredicate(ObjectColor.WHITE)); } + if (this.tbColorless.isSelected()) { predicates.add(ColorlessPredicate.instance); + } else { + exclusion.add(ColorlessPredicate.instance); + } + if (this.tbLimitColors.isSelected()) { + filter.add(Predicates.and(Predicates.not(Predicates.or(exclusion)), Predicates.or(predicates))); + } else { + filter.add(Predicates.or(predicates)); } - filter.add(Predicates.or(predicates)); predicates.clear(); if (this.tbLand.isSelected()) { @@ -349,6 +367,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene criteria.red(this.tbRed.isSelected()); criteria.white(this.tbWhite.isSelected()); criteria.colorless(this.tbColorless.isSelected()); + criteria.limitColors(this.tbLimitColors.isSelected()); // if you add new type filter then sync it with CardType if (this.tbLand.isSelected()) { @@ -562,6 +581,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene tbBlack = new javax.swing.JToggleButton(); tbWhite = new javax.swing.JToggleButton(); tbColorless = new javax.swing.JToggleButton(); + tbLimitColors = new javax.swing.JToggleButton(); jSeparator1 = new javax.swing.JToolBar.Separator(); cbExpansionSet = new javax.swing.JComboBox<>(); btnExpansionSearch = new javax.swing.JButton(); @@ -706,6 +726,23 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene } }); tbColor.add(tbColorless); + + tbLimitColors.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/lock.png"))); // NOI18N + tbLimitColors.setSelected(false); + tbLimitColors.setToolTipText("Limit results to ONLY these colors"); + tbLimitColors.setActionCommand("LimitColors"); + tbLimitColors.setFocusable(false); + tbLimitColors.setPreferredSize(new java.awt.Dimension(28, 28)); + tbLimitColors.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); + tbLimitColors.setSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/lock.png"))); // NOI18N + tbLimitColors.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); + tbLimitColors.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + tbLimitColorsActionPerformed(evt); + } + }); + tbColor.add(tbLimitColors); + tbColor.add(jSeparator1); reloadSetsCombobox(); @@ -1451,7 +1488,11 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private void tbColorlessActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbColorlessActionPerformed filterCardsColor(evt.getModifiers(), evt.getActionCommand()); }//GEN-LAST:event_tbColorlessActionPerformed - + + private void tbLimitColorsActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbColorlessActionPerformed + filterCards(); + } + private void tbCreaturesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tbCreaturesActionPerformed filterCardsType(evt.getModifiers(), evt.getActionCommand()); }//GEN-LAST:event_tbCreaturesActionPerformed @@ -1667,6 +1708,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private javax.swing.JToggleButton tbBlue; private javax.swing.JToolBar tbColor; private javax.swing.JToggleButton tbColorless; + private javax.swing.JToggleButton tbLimitColors; private javax.swing.JToggleButton tbCommon; private javax.swing.JToggleButton tbCreatures; private javax.swing.JToggleButton tbEnchantments; diff --git a/Mage.Client/src/main/resources/buttons/lock.png b/Mage.Client/src/main/resources/buttons/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5fdd91babd8037eb3368991f52f53179d61665 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl<6e(pbstUx|vage(c z14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>l3avf0MVF~{j|I4U( z-`=g&?%wf{dqs1 zUgzehw_DlF?ykFQE3(~cidkLw#>mDPSCfZRrYIP{^1Wlb;l(ZaXLtO$8X13>CiJXY o7;tL2)|s0*cg;2xNB?zT?~@AZSamP12k0aQPgg&ebxsLQ0JcYE<^TWy literal 0 HcmV?d00001 diff --git a/Mage/src/main/java/mage/cards/repository/CardCriteria.java b/Mage/src/main/java/mage/cards/repository/CardCriteria.java index 286f619846a..4f299d3a7b8 100644 --- a/Mage/src/main/java/mage/cards/repository/CardCriteria.java +++ b/Mage/src/main/java/mage/cards/repository/CardCriteria.java @@ -3,10 +3,13 @@ package mage.cards.repository; import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.stmt.SelectArg; import com.j256.ormlite.stmt.Where; + +import mage.MageObject; import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SubType; import mage.constants.SuperType; +import mage.filter.predicate.Predicate; import java.sql.SQLException; import java.util.ArrayList; @@ -39,6 +42,7 @@ public class CardCriteria { private boolean red; private boolean white; private boolean colorless; + private boolean limitColors; private Integer manaValue; private String sortBy; private Long start; @@ -68,6 +72,12 @@ public class CardCriteria { this.minCardNumber = Integer.MIN_VALUE; this.maxCardNumber = Integer.MAX_VALUE; } + + public CardCriteria limitColors(boolean limitColors) { + this.limitColors = limitColors; + return this; + } + public CardCriteria black(boolean black) { this.black = black; @@ -311,35 +321,56 @@ public class CardCriteria { clausesCount++; } + List exclusion = new ArrayList<>(); + int colorClauses = 0; if (black) { where.eq("black", true); colorClauses++; + } else { + exclusion.add("black"); } if (blue) { where.eq("blue", true); colorClauses++; + } else { + exclusion.add("blue"); } if (green) { where.eq("green", true); colorClauses++; + } else { + exclusion.add("green"); } if (red) { where.eq("red", true); colorClauses++; + } else { + exclusion.add("red"); } if (white) { where.eq("white", true); colorClauses++; + } else { + exclusion.add("white"); } if (colorless) { where.eq("black", false).eq("blue", false).eq("green", false).eq("red", false).eq("white", false); where.and(5); colorClauses++; } + if (colorClauses > 0) { where.or(colorClauses); clausesCount++; + + if (this.limitColors) { + for (String color : exclusion) { + where.not(); + where.eq(color, true); + clausesCount++; + } + } } if (minCardNumber != Integer.MIN_VALUE) {