Deck Editor displays mana as symbols (currently only for constructed mode)

This commit is contained in:
Maxmtg
2011-09-05 17:09:07 +00:00
parent 9170a06da0
commit 515a0aa302
8 changed files with 133 additions and 31 deletions

View File

@@ -1,6 +1,7 @@
package forge.card;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -12,9 +13,9 @@ import java.util.List;
*/
public final class CardManaCost implements Comparable<CardManaCost> {
private final List<CardManaCostShard> shards = new ArrayList<CardManaCostShard>();
private final List<CardManaCostShard> shards;
private final int genericCost;
private final boolean isEmpty; // lands cost
private final boolean hasNoCost; // lands cost
private final String stringValue; // precalculated for toString;
private Float compareWeight = null;
@@ -23,9 +24,10 @@ public final class CardManaCost implements Comparable<CardManaCost> {
// pass mana cost parser here
private CardManaCost() {
isEmpty = true;
hasNoCost = true;
genericCost = 0;
stringValue = "";
shards = Collections.unmodifiableList(new ArrayList<CardManaCostShard>());
}
// public ctor, should give it a mana parser
@@ -33,13 +35,16 @@ public final class CardManaCost implements Comparable<CardManaCost> {
if (!parser.hasNext()) {
throw new RuntimeException("Empty manacost passed to parser (this should have been handled before)");
}
isEmpty = false;
List<CardManaCostShard> shardsTemp = new ArrayList<CardManaCostShard>();
hasNoCost = false;
while (parser.hasNext()) {
CardManaCostShard shard = parser.next();
if (shard != null) { shards.add(shard); } // null is OK - that was generic mana
if (shard != null) { shardsTemp.add(shard); } // null is OK - that was generic mana
}
genericCost = parser.getTotalColorlessCost(); // collect generic mana here
shards = Collections.unmodifiableList(shardsTemp);
stringValue = getSimpleString();
}
private String getSimpleString() {
@@ -68,13 +73,18 @@ public final class CardManaCost implements Comparable<CardManaCost> {
return result;
}
public List<CardManaCostShard> getShards() { return shards; }
public int getGenericCost() { return genericCost; }
public boolean isEmpty() { return hasNoCost; }
public boolean isPureGeneric() { return shards.isEmpty() && !isEmpty(); }
@Override
public int compareTo(final CardManaCost o) { return getCompareWeight().compareTo(o.getCompareWeight()); }
private Float getCompareWeight() {
if (compareWeight == null) {
float weight = genericCost;
for (CardManaCostShard s : shards) { weight += s.cmpc; }
if (isEmpty) {
if (hasNoCost) {
weight = -1; // for those who doesn't even have a 0 sign on card
}
compareWeight = Float.valueOf(weight);

View File

@@ -6,11 +6,18 @@ public class CardManaCostShard {
public final int cmc;
public final float cmpc;
private final String stringValue;
protected CardManaCostShard(int value, String sValue) {
public final String imageKey;
protected CardManaCostShard(final int value, final String sValue) {
this(value, sValue, sValue);
}
protected CardManaCostShard(final int value, final String sValue, final String imgKey) {
shard = value;
cmc = getCMC();
cmpc = getCmpCost();
stringValue = sValue;
imageKey = imgKey;
}
public interface Atom {
@@ -44,28 +51,28 @@ public class CardManaCostShard {
public static final CardManaCostShard RED = new CardManaCostShard(Atom.RED, "R");
public static final CardManaCostShard GREEN = new CardManaCostShard(Atom.GREEN, "G");
public static final CardManaCostShard PW = new CardManaCostShard(Atom.WHITE | Atom.OR_2_LIFE, "W/P");
public static final CardManaCostShard PU = new CardManaCostShard(Atom.BLUE | Atom.OR_2_LIFE, "U/P");
public static final CardManaCostShard PB = new CardManaCostShard(Atom.BLACK | Atom.OR_2_LIFE, "B/P");
public static final CardManaCostShard PR = new CardManaCostShard(Atom.RED | Atom.OR_2_LIFE, "R/P");
public static final CardManaCostShard PG = new CardManaCostShard(Atom.GREEN | Atom.OR_2_LIFE, "G/P");
public static final CardManaCostShard PW = new CardManaCostShard(Atom.WHITE | Atom.OR_2_LIFE, "W/P", "PW");
public static final CardManaCostShard PU = new CardManaCostShard(Atom.BLUE | Atom.OR_2_LIFE, "U/P", "PU");
public static final CardManaCostShard PB = new CardManaCostShard(Atom.BLACK | Atom.OR_2_LIFE, "B/P", "PB");
public static final CardManaCostShard PR = new CardManaCostShard(Atom.RED | Atom.OR_2_LIFE, "R/P", "PR");
public static final CardManaCostShard PG = new CardManaCostShard(Atom.GREEN | Atom.OR_2_LIFE, "G/P", "PG");
public static final CardManaCostShard WU = new CardManaCostShard(Atom.WHITE | Atom.BLUE, "W/U");
public static final CardManaCostShard WB = new CardManaCostShard(Atom.WHITE | Atom.BLACK, "W/B");
public static final CardManaCostShard WR = new CardManaCostShard(Atom.WHITE | Atom.RED, "W/R");
public static final CardManaCostShard WG = new CardManaCostShard(Atom.WHITE | Atom.GREEN, "W/G");
public static final CardManaCostShard UB = new CardManaCostShard(Atom.BLUE | Atom.BLACK, "U/B");
public static final CardManaCostShard UR = new CardManaCostShard(Atom.BLUE | Atom.RED, "U/R");
public static final CardManaCostShard UG = new CardManaCostShard(Atom.BLUE | Atom.GREEN, "U/G");
public static final CardManaCostShard BR = new CardManaCostShard(Atom.BLACK | Atom.RED, "B/R");
public static final CardManaCostShard BG = new CardManaCostShard(Atom.BLACK | Atom.GREEN, "B/G");
public static final CardManaCostShard RG = new CardManaCostShard(Atom.RED | Atom.GREEN, "R/G");
public static final CardManaCostShard WU = new CardManaCostShard(Atom.WHITE | Atom.BLUE, "W/U", "WB");
public static final CardManaCostShard WB = new CardManaCostShard(Atom.WHITE | Atom.BLACK, "W/B", "WU");
public static final CardManaCostShard WR = new CardManaCostShard(Atom.WHITE | Atom.RED, "W/R", "RW");
public static final CardManaCostShard WG = new CardManaCostShard(Atom.WHITE | Atom.GREEN, "W/G", "GW");
public static final CardManaCostShard UB = new CardManaCostShard(Atom.BLUE | Atom.BLACK, "U/B", "UB");
public static final CardManaCostShard UR = new CardManaCostShard(Atom.BLUE | Atom.RED, "U/R", "UR");
public static final CardManaCostShard UG = new CardManaCostShard(Atom.BLUE | Atom.GREEN, "U/G", "GU");
public static final CardManaCostShard BR = new CardManaCostShard(Atom.BLACK | Atom.RED, "B/R", "BR");
public static final CardManaCostShard BG = new CardManaCostShard(Atom.BLACK | Atom.GREEN, "B/G", "BG");
public static final CardManaCostShard RG = new CardManaCostShard(Atom.RED | Atom.GREEN, "R/G", "RG");
public static final CardManaCostShard W2 = new CardManaCostShard(Atom.WHITE | Atom.OR_2_COLORLESS, "2/W");
public static final CardManaCostShard U2 = new CardManaCostShard(Atom.BLUE | Atom.OR_2_COLORLESS, "2/U");
public static final CardManaCostShard B2 = new CardManaCostShard(Atom.BLACK | Atom.OR_2_COLORLESS, "2/B");
public static final CardManaCostShard R2 = new CardManaCostShard(Atom.RED | Atom.OR_2_COLORLESS, "2/R");
public static final CardManaCostShard G2 = new CardManaCostShard(Atom.GREEN | Atom.OR_2_COLORLESS, "2/G");
public static final CardManaCostShard W2 = new CardManaCostShard(Atom.WHITE | Atom.OR_2_COLORLESS, "2/W", "2W");
public static final CardManaCostShard U2 = new CardManaCostShard(Atom.BLUE | Atom.OR_2_COLORLESS, "2/U", "2U");
public static final CardManaCostShard B2 = new CardManaCostShard(Atom.BLACK | Atom.OR_2_COLORLESS, "2/B", "2B");
public static final CardManaCostShard R2 = new CardManaCostShard(Atom.RED | Atom.OR_2_COLORLESS, "2/R", "2R");
public static final CardManaCostShard G2 = new CardManaCostShard(Atom.GREEN | Atom.OR_2_COLORLESS, "2/G", "2G");
private static final CardManaCostShard[] allPossible = new CardManaCostShard[] {
X, WHITE, BLUE, BLACK, RED, GREEN,

View File

@@ -115,15 +115,16 @@ public final class DeckEditor extends DeckEditorBase implements NewConstants {
private void setup() {
List<TableColumnInfo<CardPrinted>> columns = new ArrayList<TableColumnInfo<CardPrinted>>();
columns.add(new TableColumnInfo<CardPrinted>("Qty", 30, PresetColumns.fnQtyCompare, PresetColumns.fnQtyGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 180, PresetColumns.fnNameCompare, PresetColumns.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 70, PresetColumns.fnCostCompare, PresetColumns.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Name", 175, PresetColumns.fnNameCompare, PresetColumns.fnNameGet));
columns.add(new TableColumnInfo<CardPrinted>("Cost", 75, PresetColumns.fnCostCompare, PresetColumns.fnCostGet));
columns.add(new TableColumnInfo<CardPrinted>("Color", 50, PresetColumns.fnColorCompare, PresetColumns.fnColorGet));
columns.add(new TableColumnInfo<CardPrinted>("Type", 100, PresetColumns.fnTypeCompare, PresetColumns.fnTypeGet));
columns.add(new TableColumnInfo<CardPrinted>("Stats", 40, PresetColumns.fnStatsCompare, PresetColumns.fnStatsGet));
columns.add(new TableColumnInfo<CardPrinted>("R", 35, PresetColumns.fnRarityCompare, PresetColumns.fnRarityGet));
columns.add(new TableColumnInfo<CardPrinted>("Set", 40, PresetColumns.fnSetCompare, PresetColumns.fnSetGet));
columns.add(new TableColumnInfo<CardPrinted>("AI", 30, PresetColumns.fnAiStatusCompare, PresetColumns.fnAiStatusGet));
columns.get(2).setCellRenderer(new ManaCostRenderer());
top.setup(columns, cardView);
bottom.setup(columns, cardView);

View File

@@ -0,0 +1,62 @@
package forge.gui.deckeditor;
import java.awt.Component;
import java.awt.Graphics;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import arcane.ui.util.ManaSymbols;
import forge.card.CardManaCostShard;
import forge.card.CardManaCost;
/**
* Displays mana cost as symbols.
*/
public class ManaCostRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1770527102334163549L;
private CardManaCost value;
@Override
public Component getTableCellRendererComponent(final JTable table, final Object value,
final boolean isSelected, final boolean hasFocus, final int row, final int column)
{
this.value = (CardManaCost) value;
setToolTipText(this.value.toString());
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
}
@Override
public void paint(final Graphics g) {
super.paint(g);
final int elemtWidth = 13;
final int elemtGap = 0;
final int padding = 1;
float xpos = padding;
int genericManaCost = value.getGenericCost();
boolean hasGeneric = genericManaCost > 0 || value.isPureGeneric();
List<CardManaCostShard> shards = value.getShards();
int cellWidth = getWidth();
int cntGlyphs = hasGeneric ? shards.size() + 1 : shards.size();
float offsetIfNoSpace = cntGlyphs > 1 ? (cellWidth - padding - elemtWidth) / (cntGlyphs - 1f) : elemtWidth + elemtGap;
float offset = Math.min(elemtWidth + elemtGap, offsetIfNoSpace);
if (hasGeneric) {
String sGeneric = Integer.toString(genericManaCost);
ManaSymbols.drawSymbol(sGeneric, g, (int) xpos, 1);
xpos += offset;
}
for (CardManaCostShard s : shards) {
ManaSymbols.drawSymbol(s.imageKey, g, (int) xpos, 1);
xpos += offset;
}
}
}

View File

@@ -34,7 +34,7 @@ public abstract class PresetColumns {
public Comparable apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getManaCost(); } };
public static final Lambda1<Object, Entry<CardPrinted, Integer>> fnCostGet =
new Lambda1<Object, Entry<CardPrinted, Integer>>() { @Override
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getManaCost().toString(); } };
public Object apply(final Entry<CardPrinted, Integer> from) { return from.getKey().getCard().getManaCost(); } };
@SuppressWarnings("rawtypes")
public static final Lambda1<Comparable, Entry<CardPrinted, Integer>> fnColorCompare =

View File

@@ -2,6 +2,8 @@ package forge.gui.deckeditor;
import java.util.Map.Entry;
import javax.swing.table.TableCellRenderer;
import net.slightlymagic.braids.util.lambda.Lambda1;
/**
@@ -23,6 +25,8 @@ import net.slightlymagic.braids.util.lambda.Lambda1;
public final Lambda1<Comparable, Entry<T, Integer>> fnSort; // this will be used for sorting
public final Lambda1<Object, Entry<T, Integer>> fnDisplay; // this is used to display
private TableCellRenderer cellRenderer = null;
public final String getName() { return name; }
public TableColumnInfo(final String colName,
@@ -49,5 +53,14 @@ import net.slightlymagic.braids.util.lambda.Lambda1;
this.minWidth = wMin;
this.nominalWidth = width;
}
public void setCellRenderer(final TableCellRenderer renderer) {
cellRenderer = renderer;
}
public final TableCellRenderer getCellRenderer() {
return cellRenderer;
}
}

View File

@@ -11,6 +11,7 @@ import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableCellRenderer;
import net.slightlymagic.maxmtg.Predicate;
@@ -64,6 +65,13 @@ public final class TableWithCards {
table.setModel(model);
model.resizeCols(table);
for (int idx = columns.size() - 1; idx >= 0; idx--) {
TableCellRenderer renderer = columns.get(idx).getCellRenderer();
if (null != renderer) {
table.getColumnModel().getColumn(idx).setCellRenderer(renderer);
}
}
if (isTrackingStats) {
// get stats from deck
model.addTableModelListener(new TableModelListener() {