mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Deck Editor displays mana as symbols (currently only for constructed mode)
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -9803,6 +9803,7 @@ src/main/java/forge/gui/deckeditor/DeckEditorQuestMenu.java svneol=native#text/p
|
||||
src/main/java/forge/gui/deckeditor/DeckEditorShop.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/deckeditor/FilterCheckBoxes.java -text
|
||||
src/main/java/forge/gui/deckeditor/GuiFilterCheckBox.java svneol=native#text/plain
|
||||
src/main/java/forge/gui/deckeditor/ManaCostRenderer.java -text
|
||||
src/main/java/forge/gui/deckeditor/PresetColumns.java -text
|
||||
src/main/java/forge/gui/deckeditor/TableColumnInfo.java -text
|
||||
src/main/java/forge/gui/deckeditor/TableModel.java svneol=native#text/plain
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
62
src/main/java/forge/gui/deckeditor/ManaCostRenderer.java
Normal file
62
src/main/java/forge/gui/deckeditor/ManaCostRenderer.java
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user