mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 20:58:03 +00:00
Fix mana cost rendering in table
Start favorites column
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -28,6 +28,7 @@ forge-core/src/main/java/forge/card/CardCharacteristicName.java -text
|
||||
forge-core/src/main/java/forge/card/CardDb.java -text
|
||||
forge-core/src/main/java/forge/card/CardEdition.java -text
|
||||
forge-core/src/main/java/forge/card/CardFace.java -text
|
||||
forge-core/src/main/java/forge/card/CardPreferences.java -text
|
||||
forge-core/src/main/java/forge/card/CardRarity.java -text
|
||||
forge-core/src/main/java/forge/card/CardRules.java -text
|
||||
forge-core/src/main/java/forge/card/CardRulesPredicates.java -text
|
||||
@@ -15487,6 +15488,7 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemView.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ManaCostRenderer.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SetCodeRenderer.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableColumnInfo.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/TableSorterCascade.java -text
|
||||
forge-gui/src/main/java/forge/gui/toolbox/package-info.java svneol=native#text/plain
|
||||
|
||||
34
forge-core/src/main/java/forge/card/CardPreferences.java
Normal file
34
forge-core/src/main/java/forge/card/CardPreferences.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package forge.card;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Preferences associated with individual cards
|
||||
*
|
||||
*/
|
||||
public class CardPreferences {
|
||||
private static Map<String, CardPreferences> allPrefs = new HashMap<String, CardPreferences>();
|
||||
|
||||
public static CardPreferences getPrefs(String key) {
|
||||
CardPreferences prefs = allPrefs.get(key);
|
||||
if (prefs == null) {
|
||||
prefs = new CardPreferences();
|
||||
allPrefs.put(key, prefs);
|
||||
}
|
||||
return prefs;
|
||||
}
|
||||
|
||||
private int starCount;
|
||||
|
||||
private CardPreferences() {
|
||||
}
|
||||
|
||||
public int getStarCount() {
|
||||
return this.starCount;
|
||||
}
|
||||
|
||||
public void setStarCount(int starCount0) {
|
||||
this.starCount = starCount0;
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
//import forge.Card;
|
||||
import forge.card.CardPreferences;
|
||||
import forge.card.CardRarity;
|
||||
import forge.card.CardRules;
|
||||
import forge.util.PredicateString;
|
||||
@@ -149,7 +149,6 @@ public interface IPaperCard extends InventoryItem {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public abstract String getName();
|
||||
public abstract String getEdition();
|
||||
public abstract int getArtIndex();
|
||||
@@ -157,7 +156,6 @@ public interface IPaperCard extends InventoryItem {
|
||||
public abstract boolean isToken();
|
||||
public abstract CardRules getRules();
|
||||
public abstract CardRarity getRarity();
|
||||
|
||||
public abstract CardPreferences getPrefs();
|
||||
public abstract String getItemType();
|
||||
|
||||
}
|
||||
@@ -19,6 +19,7 @@ package forge.item;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
import forge.card.CardPreferences;
|
||||
import forge.card.CardRarity;
|
||||
import forge.card.CardRules;
|
||||
|
||||
@@ -188,4 +189,9 @@ public final class PaperCard implements Comparable<IPaperCard>, InventoryItemFro
|
||||
// TODO compare sets properly
|
||||
return this.edition.compareTo(o.getEdition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardPreferences getPrefs() {
|
||||
return CardPreferences.getPrefs(this.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package forge.item;
|
||||
import java.util.Locale;
|
||||
|
||||
import forge.card.CardEdition;
|
||||
import forge.card.CardPreferences;
|
||||
import forge.card.CardRarity;
|
||||
import forge.card.CardRules;
|
||||
|
||||
@@ -45,20 +46,51 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard {
|
||||
this.imageFileName = String.format("%s%s", null == edition || CardEdition.UNKNOWN == edition ? "" : edition.getCode(), imageFileName);
|
||||
}
|
||||
|
||||
@Override public String getName() { return name; }
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override public String getEdition() { return edition.getCode(); }
|
||||
@Override
|
||||
public String getEdition() {
|
||||
return edition.getCode();
|
||||
}
|
||||
|
||||
@Override public int getArtIndex() { return 0; } // This might change however
|
||||
@Override public boolean isFoil() { return false; }
|
||||
@Override public CardRules getRules() { return card; }
|
||||
@Override
|
||||
public int getArtIndex() {
|
||||
return 0; // This might change however
|
||||
}
|
||||
|
||||
@Override public CardRarity getRarity() { return CardRarity.Common; } // They don't have rarity though!
|
||||
@Override
|
||||
public boolean isFoil() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardRules getRules() {
|
||||
return card;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardRarity getRarity() {
|
||||
return CardRarity.Common; // They don't have rarity though!
|
||||
}
|
||||
|
||||
// Unfortunately this is a property of token, cannot move it outside of class
|
||||
public String getImageFilename() { return imageFileName; }
|
||||
|
||||
@Override public String getItemType() { return "Token"; }
|
||||
@Override
|
||||
public String getItemType() {
|
||||
return "Token";
|
||||
}
|
||||
|
||||
@Override public boolean isToken() { return true; }
|
||||
@Override
|
||||
public boolean isToken() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CardPreferences getPrefs() {
|
||||
return CardPreferences.getPrefs(this.imageFileName); //use generated image file name as key
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<pref name="display_unique_only" value="true"></pref>
|
||||
<pref name="elastic_columns" value="false"></pref>
|
||||
<pref name="stats_deck" value="true"></pref>
|
||||
<col enumval="CAT_FAVORITE" identifier="" show="true" sortpriority="1" sortstate="DESC" width="17"></col>
|
||||
<col enumval="CAT_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
|
||||
<col enumval="CAT_NAME" identifier="Name" show="true" sortpriority="2" sortstate="ASC" width="115"></col>
|
||||
<col enumval="CAT_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col>
|
||||
|
||||
@@ -36,10 +36,10 @@ import forge.gui.toolbox.FSkin.JLabelSkin;
|
||||
public class ManaCostRenderer extends DefaultTableCellRenderer {
|
||||
private static final long serialVersionUID = 1770527102334163549L;
|
||||
|
||||
static final int elemtWidth = 13;
|
||||
static final int elemtGap = 0;
|
||||
static final int padding0 = 1;
|
||||
static final int spaceBetweenSplitCosts = 3;
|
||||
private static final int elemtWidth = 13;
|
||||
private static final int elemtGap = 0;
|
||||
private static final int padding0 = 2;
|
||||
private static final int spaceBetweenSplitCosts = 3;
|
||||
|
||||
private final JLabelSkin<ManaCostRenderer> skin = FSkin.get(this);
|
||||
private ManaCost v1;
|
||||
@@ -58,7 +58,7 @@ public class ManaCostRenderer extends DefaultTableCellRenderer {
|
||||
CardRules v = value instanceof CardRules ? (CardRules) value : null;
|
||||
this.v1 = v == null ? ManaCost.NO_COST : v.getMainPart().getManaCost();
|
||||
this.v2 = v == null || v.getSplitType() != CardSplitType.Split ? null : v.getOtherPart().getManaCost();
|
||||
this.setToolTipText(v2 == null ? v1.toString() : v1.toString() + " / " + v2.toString());
|
||||
this.setToolTipText(v2 == null ? v1.toString() : v1.toString() + " // " + v2.toString());
|
||||
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
|
||||
}
|
||||
|
||||
@@ -73,17 +73,17 @@ public class ManaCostRenderer extends DefaultTableCellRenderer {
|
||||
|
||||
final int cellWidth = this.getWidth();
|
||||
|
||||
if ( null == v2 )
|
||||
if (v2 == null) {
|
||||
drawCost(g, v1, padding0, cellWidth);
|
||||
else
|
||||
{
|
||||
}
|
||||
else {
|
||||
int shards1 = v1.getGlyphCount();
|
||||
int shards2 = v2.getGlyphCount();
|
||||
|
||||
int perGlyph = (cellWidth - padding0 - spaceBetweenSplitCosts) / (shards1 + shards2);
|
||||
perGlyph = Math.min(perGlyph, elemtWidth + elemtGap);
|
||||
drawCost(g, v1, padding0, padding0 + perGlyph * shards1);
|
||||
drawCost(g, v2, cellWidth - perGlyph * shards2, cellWidth );
|
||||
drawCost(g, v2, cellWidth - perGlyph * shards2 - padding0, cellWidth );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,29 +94,30 @@ public class ManaCostRenderer extends DefaultTableCellRenderer {
|
||||
* @param cellWidth
|
||||
*/
|
||||
private void drawCost(final Graphics g, ManaCost value, final int padding, final int cellWidth) {
|
||||
float xpos = padding;
|
||||
int x = padding;
|
||||
int y = padding0;
|
||||
final int genericManaCost = value.getGenericCost();
|
||||
final int xManaCosts = value.countX();
|
||||
final boolean hasGeneric = (genericManaCost > 0) || this.v1.isPureGeneric();
|
||||
|
||||
final int cntGlyphs = value.getGlyphCount();
|
||||
final float offsetIfNoSpace = cntGlyphs > 1 ? (cellWidth - padding - elemtWidth) / (cntGlyphs - 1f)
|
||||
final int offsetIfNoSpace = cntGlyphs > 1 ? (cellWidth - padding - elemtWidth) / (cntGlyphs - 1)
|
||||
: elemtWidth + elemtGap;
|
||||
final float offset = Math.min(elemtWidth + elemtGap, offsetIfNoSpace);
|
||||
final int dx = Math.min(elemtWidth + elemtGap, offsetIfNoSpace);
|
||||
|
||||
// Display X Mana before any other type of mana
|
||||
if (xManaCosts > 0) {
|
||||
for (int i = 0; i < xManaCosts; i++) {
|
||||
CardFaceSymbols.drawSymbol(ManaCostShard.X.getImageKey(), skin, g, (int) xpos, 1);
|
||||
xpos += offset;
|
||||
CardFaceSymbols.drawSymbol(ManaCostShard.X.getImageKey(), skin, g, x, y);
|
||||
x += dx;
|
||||
}
|
||||
}
|
||||
|
||||
// Display colorless mana before colored mana
|
||||
if (hasGeneric) {
|
||||
final String sGeneric = Integer.toString(genericManaCost);
|
||||
CardFaceSymbols.drawSymbol(sGeneric, skin, g, (int) xpos, 1);
|
||||
xpos += offset;
|
||||
CardFaceSymbols.drawSymbol(sGeneric, skin, g, x, y);
|
||||
x += dx;
|
||||
}
|
||||
|
||||
for (final ManaCostShard s : value) {
|
||||
@@ -124,9 +125,8 @@ public class ManaCostRenderer extends DefaultTableCellRenderer {
|
||||
// X costs already drawn up above
|
||||
continue;
|
||||
}
|
||||
CardFaceSymbols.drawSymbol(s.getImageKey(), skin, g, (int) xpos, 1);
|
||||
xpos += offset;
|
||||
CardFaceSymbols.drawSymbol(s.getImageKey(), skin, g, x, y);
|
||||
x += dx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -59,43 +59,44 @@ public final class SColumnUtil {
|
||||
* <br><br>
|
||||
* Note: To add a new column, put an enum here, and also add in the XML prefs file.
|
||||
*/
|
||||
public enum ColumnName { /** */
|
||||
CAT_QUANTITY, /** */
|
||||
CAT_NAME, /** */
|
||||
CAT_COST, /** */
|
||||
CAT_COLOR, /** */
|
||||
CAT_TYPE, /** */
|
||||
CAT_POWER, /** */
|
||||
CAT_TOUGHNESS, /** */
|
||||
CAT_CMC, /** */
|
||||
CAT_RARITY, /** */
|
||||
CAT_SET, /** */
|
||||
CAT_AI, /** */
|
||||
CAT_NEW, /** */
|
||||
CAT_PURCHASE_PRICE, /** */
|
||||
CAT_OWNED, /** */
|
||||
public enum ColumnName {
|
||||
CAT_FAVORITE,
|
||||
CAT_QUANTITY,
|
||||
CAT_NAME,
|
||||
CAT_COST,
|
||||
CAT_COLOR,
|
||||
CAT_TYPE,
|
||||
CAT_POWER,
|
||||
CAT_TOUGHNESS,
|
||||
CAT_CMC,
|
||||
CAT_RARITY,
|
||||
CAT_SET,
|
||||
CAT_AI,
|
||||
CAT_NEW,
|
||||
CAT_PURCHASE_PRICE,
|
||||
CAT_OWNED,
|
||||
CAT_RANKING,
|
||||
DECK_QUANTITY, /** */
|
||||
DECK_NAME, /** */
|
||||
DECK_COST, /** */
|
||||
DECK_COLOR, /** */
|
||||
DECK_TYPE, /** */
|
||||
DECK_POWER, /** */
|
||||
DECK_TOUGHNESS, /** */
|
||||
DECK_CMC, /** */
|
||||
DECK_RARITY, /** */
|
||||
DECK_SET, /** */
|
||||
DECK_AI, /** */
|
||||
DECK_NEW, /** */
|
||||
DECK_SALE_PRICE, /** */
|
||||
DECK_QUANTITY,
|
||||
DECK_NAME,
|
||||
DECK_COST,
|
||||
DECK_COLOR,
|
||||
DECK_TYPE,
|
||||
DECK_POWER,
|
||||
DECK_TOUGHNESS,
|
||||
DECK_CMC,
|
||||
DECK_RARITY,
|
||||
DECK_SET,
|
||||
DECK_AI,
|
||||
DECK_NEW,
|
||||
DECK_SALE_PRICE,
|
||||
DECK_DECKS,
|
||||
DECK_RANKING;
|
||||
}
|
||||
|
||||
/** Possible states of data sorting in a column: none, ascending, or descending. */
|
||||
public enum SortState { /** */
|
||||
NONE, /** */
|
||||
ASC, /** */
|
||||
public enum SortState {
|
||||
NONE,
|
||||
ASC,
|
||||
DESC
|
||||
}
|
||||
|
||||
@@ -103,6 +104,7 @@ public final class SColumnUtil {
|
||||
public static List<TableColumnInfo<InventoryItem>> getCatalogDefaultColumns() {
|
||||
final List<TableColumnInfo<InventoryItem>> columns = new ArrayList<TableColumnInfo<InventoryItem>>();
|
||||
|
||||
columns.add(SColumnUtil.getColumn(ColumnName.CAT_FAVORITE));
|
||||
columns.add(SColumnUtil.getColumn(ColumnName.CAT_QUANTITY));
|
||||
columns.add(SColumnUtil.getColumn(ColumnName.CAT_NAME));
|
||||
columns.add(SColumnUtil.getColumn(ColumnName.CAT_COST));
|
||||
@@ -141,6 +143,8 @@ public final class SColumnUtil {
|
||||
|
||||
/** Should be called after column preferences has run, which has created a new column list. */
|
||||
public static void attachSortAndDisplayFunctions() {
|
||||
SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setSortAndDisplayFunctions(
|
||||
SColumnUtil.FN_FAV_COMPARE, SColumnUtil.FN_FAV_GET);
|
||||
SColumnUtil.getColumn(ColumnName.CAT_QUANTITY).setSortAndDisplayFunctions(
|
||||
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET);
|
||||
SColumnUtil.getColumn(ColumnName.CAT_NAME).setSortAndDisplayFunctions(
|
||||
@@ -191,6 +195,7 @@ public final class SColumnUtil {
|
||||
SColumnUtil.getColumn(ColumnName.DECK_RANKING).setSortAndDisplayFunctions(
|
||||
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET);
|
||||
|
||||
SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setCellRenderer(new StarRenderer());
|
||||
SColumnUtil.getColumn(ColumnName.CAT_COST).setCellRenderer(new ManaCostRenderer());
|
||||
SColumnUtil.getColumn(ColumnName.CAT_POWER).setCellRenderer(new IntegerRenderer());
|
||||
SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS).setCellRenderer(new IntegerRenderer());
|
||||
@@ -282,6 +287,9 @@ public final class SColumnUtil {
|
||||
|
||||
private static final Pattern AE_FINDER = Pattern.compile("AE", Pattern.LITERAL);
|
||||
|
||||
private static IPaperCard toCard(final InventoryItem i) {
|
||||
return i instanceof IPaperCard ? ((IPaperCard) i) : null;
|
||||
}
|
||||
private static ManaCost toManaCost(final InventoryItem i) {
|
||||
return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getManaCost() : ManaCost.NO_COST;
|
||||
}
|
||||
@@ -354,6 +362,21 @@ public final class SColumnUtil {
|
||||
//==========
|
||||
|
||||
/** Lamda sort fnQtyCompare. */
|
||||
private static final Function<Entry<InventoryItem, Integer>, Comparable<?>> FN_FAV_COMPARE = new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
|
||||
@Override
|
||||
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
|
||||
return from.getValue();
|
||||
}
|
||||
};
|
||||
|
||||
/** Lamda sort fnQtyGet. */
|
||||
private static final Function<Entry<InventoryItem, Integer>, Object> FN_FAV_GET = new Function<Entry<InventoryItem, Integer>, Object>() {
|
||||
@Override
|
||||
public Object apply(final Entry<InventoryItem, Integer> from) {
|
||||
return SColumnUtil.toCard(from.getKey());
|
||||
}
|
||||
};
|
||||
|
||||
private static final Function<Entry<InventoryItem, Integer>, Comparable<?>> FN_QTY_COMPARE = new Function<Entry<InventoryItem, Integer>, Comparable<?>>() {
|
||||
@Override
|
||||
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Forge: Play Magic: the Gathering.
|
||||
* Copyright (C) 2011 Forge Team
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package forge.gui.toolbox.itemmanager.views;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Graphics;
|
||||
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
|
||||
import forge.gui.toolbox.FSkin;
|
||||
import forge.gui.toolbox.FSkin.SkinImage;
|
||||
import forge.item.IPaperCard;
|
||||
|
||||
/**
|
||||
* Displays favorite icons
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class StarRenderer extends DefaultTableCellRenderer {
|
||||
private IPaperCard card;
|
||||
private SkinImage skinImage;
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see
|
||||
* javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent
|
||||
* (javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
|
||||
*/
|
||||
@Override
|
||||
public final Component getTableCellRendererComponent(final JTable table, final Object value,
|
||||
final boolean isSelected, final boolean hasFocus, final int row, final int column) {
|
||||
if (value instanceof IPaperCard) {
|
||||
card = (IPaperCard) value;
|
||||
}
|
||||
else {
|
||||
card = null;
|
||||
}
|
||||
update();
|
||||
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
|
||||
}
|
||||
|
||||
private void update() {
|
||||
if (card == null) {
|
||||
this.setToolTipText("");
|
||||
skinImage = null;
|
||||
}
|
||||
else if (card.getPrefs().getStarCount() == 0) {
|
||||
this.setToolTipText("Click to add " + card.getName() + " to favorites");
|
||||
skinImage = null;
|
||||
}
|
||||
else { //TODO: consider supporting more than 1 star
|
||||
this.setToolTipText("Click to remove " + card.getName() + " from favorites");
|
||||
skinImage = null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see javax.swing.JComponent#paint(java.awt.Graphics)
|
||||
*/
|
||||
@Override
|
||||
public final void paint(final Graphics g) {
|
||||
super.paint(g);
|
||||
|
||||
if (skinImage == null) { return; }
|
||||
|
||||
int size = 13;
|
||||
int width = this.getWidth();
|
||||
int height = this.getHeight();
|
||||
if (size > width) {
|
||||
size = width;
|
||||
}
|
||||
FSkin.get(this).drawImage(g, skinImage, (width - size) / 2, (height - size) / 2, size, size);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user