Support marking cards as favorites in catalog

This commit is contained in:
drdev
2013-12-22 08:39:20 +00:00
parent 471e5b5399
commit a062d61c8d
18 changed files with 271 additions and 121 deletions

2
.gitattributes vendored
View File

@@ -15481,8 +15481,8 @@ forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/TextSearchFilter.j
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ToggleButtonsFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/filters/ValueRangeFilter.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/package-info.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/AlwaysShowToolTip.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/IntegerRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java -text
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

View File

@@ -1,24 +1,119 @@
package forge.card;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
/**
* Preferences associated with individual cards
*
*/
public class CardPreferences {
private static final XMLEventFactory EVENT_FACTORY = XMLEventFactory.newInstance();
private static final XMLEvent NEWLINE = EVENT_FACTORY.createDTD("\n");
private static final XMLEvent TAB = EVENT_FACTORY.createDTD("\t");
private static Map<String, CardPreferences> allPrefs = new HashMap<String, CardPreferences>();
public static CardPreferences getPrefs(String key) {
CardPreferences prefs = allPrefs.get(key);
public static CardPreferences getPrefs(String name) {
CardPreferences prefs = allPrefs.get(name);
if (prefs == null) {
prefs = new CardPreferences();
allPrefs.put(key, prefs);
allPrefs.put(name, prefs);
}
return prefs;
}
public static void load(String filename) {
allPrefs.clear();
try {
final XMLInputFactory in = XMLInputFactory.newInstance();
final XMLEventReader reader = in.createXMLEventReader(new FileInputStream(filename));
XMLEvent event;
StartElement element;
Iterator<?> attributes;
Attribute attribute;
String tagname;
CardPreferences prefs;
while (reader.hasNext()) {
event = reader.nextEvent();
if (event.isStartElement()) {
element = event.asStartElement();
tagname = element.getName().getLocalPart();
if (tagname.equals("card")) {
prefs = new CardPreferences();
attributes = element.getAttributes();
while (attributes.hasNext()) {
attribute = (Attribute) attributes.next();
switch (attribute.getName().toString()) {
case "name":
allPrefs.put(attribute.getValue(), prefs);
break;
case "stars":
prefs.starCount = Integer.parseInt(attribute.getValue());
break;
}
}
}
}
}
}
catch (final FileNotFoundException e) {
/* ignore; it's ok if this file doesn't exist */
}
catch (final Exception e) {
e.printStackTrace();
}
}
public static void save(String filename) {
try {
final XMLOutputFactory out = XMLOutputFactory.newInstance();
final XMLEventWriter writer = out.createXMLEventWriter(new FileOutputStream(filename));
writer.add(EVENT_FACTORY.createStartDocument());
writer.add(NEWLINE);
writer.add(EVENT_FACTORY.createStartElement("", "", "preferences"));
writer.add(EVENT_FACTORY.createAttribute("type", "cards"));
writer.add(NEWLINE);
for (Map.Entry<String, CardPreferences> entry : allPrefs.entrySet()) {
if (entry.getValue().starCount > 0) {
writer.add(TAB);
writer.add(EVENT_FACTORY.createStartElement("", "", "card"));
writer.add(EVENT_FACTORY.createAttribute("name", entry.getKey()));
writer.add(EVENT_FACTORY.createAttribute("stars", String.valueOf(entry.getValue().starCount)));
writer.add(EVENT_FACTORY.createEndElement("", "", "card"));
writer.add(NEWLINE);
}
}
writer.add(EVENT_FACTORY.createEndDocument());
writer.flush();
writer.close();
}
catch (final Exception e) {
e.printStackTrace();
}
}
private int starCount;
private CardPreferences() {

View File

@@ -3,9 +3,9 @@
<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_FAVORITE" identifier="" show="true" sortpriority="1" sortstate="DESC" width="18"></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_NAME" identifier="Name" show="true" sortpriority="3" sortstate="ASC" width="115"></col>
<col enumval="CAT_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col>
<col enumval="CAT_COLOR" identifier="Color" show="true" sortpriority="0" sortstate="NONE" width="40"></col>
<col enumval="CAT_TYPE" identifier="Type" show="true" sortpriority="0" sortstate="NONE" width="80"></col>
@@ -18,7 +18,7 @@
<col enumval="CAT_RANKING" identifier="Ranking" show="false" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="CAT_NEW" identifier="New" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="CAT_PURCHASE_PRICE" identifier="Purchase Price" show="true" sortpriority="3" sortstate="DESC" width="30"></col>
<col enumval="CAT_OWNED" identifier="Owned" show="true" sortpriority="1" sortstate="ASC" width="40"></col>
<col enumval="CAT_OWNED" identifier="Owned" show="true" sortpriority="2" sortstate="ASC" width="40"></col>
<col enumval="DECK_QUANTITY" identifier="Quantity" show="true" sortpriority="0" sortstate="NONE" width="30"></col>
<col enumval="DECK_NAME" identifier="Name" show="true" sortpriority="3" sortstate="ASC" width="115"></col>
<col enumval="DECK_COST" identifier="Cost" show="true" sortpriority="0" sortstate="NONE" width="40"></col>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 KiB

After

Width:  |  Height:  |  Size: 638 KiB

View File

@@ -17,6 +17,7 @@
*/
package forge;
import forge.card.CardPreferences;
import forge.control.FControl;
import forge.gui.toolbox.FProgressBar;
import forge.gui.workshop.CardScriptInfo;
@@ -52,8 +53,9 @@ public final class Singletons {
initialized = true;
}
if(withUi)
if (withUi) {
view = FView.SINGLETON_INSTANCE;
}
CardStorageReader.ProgressObserver progressBarBridge = view == null
? CardStorageReader.ProgressObserver.emptyObserver : new CardStorageReader.ProgressObserver() {
@@ -79,9 +81,11 @@ public final class Singletons {
magicDb = new StaticData(reader, "res/editions", "res/blockdata");
model = FModel.getInstance(withUi);
if(withUi)
if (withUi) {
control = FControl.instance;
CardPreferences.load(NewConstants.CARD_PREFS_FILE);
}
}
// disallow instantiation

View File

@@ -362,6 +362,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
catTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override
public void onLeftDoubleClick(MouseEvent e) {
if (e.isConsumed()) { return; } //don't add cards if inline button double clicked
addSelectedCards(false, 1);
}
@@ -376,6 +377,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
deckTable.getComponent().addMouseListener(new FMouseAdapter() {
@Override
public void onLeftDoubleClick(MouseEvent e) {
if (e.isConsumed()) { return; } //don't remove cards if inline button double clicked
removeSelectedCards(false, 1);
}

View File

@@ -40,6 +40,7 @@ import forge.gui.framework.FScreen;
import forge.gui.home.quest.CSubmenuQuestDecks;
import forge.gui.toolbox.itemmanager.CardManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.views.ItemCellRenderer;
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
@@ -266,16 +267,18 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_NEW));
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(),
this.questData.getCards().getFnNewGet());
this.questData.getCards().getFnNewGet(),
new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(),
this.questData.getCards().getFnNewGet());
this.questData.getCards().getFnNewGet(),
new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnDeckCompare, this.fnDeckGet);
this.fnDeckCompare, this.fnDeckGet, new ItemCellRenderer());
this.getCatalogManager().getTable().setup(columnsCatalog);
this.getDeckManager().getTable().setup(columnsDeck);

View File

@@ -50,6 +50,7 @@ import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.itemmanager.SpellShopManager;
import forge.gui.toolbox.itemmanager.SItemManagerUtil;
import forge.gui.toolbox.itemmanager.views.ItemCellRenderer;
import forge.gui.toolbox.itemmanager.views.SColumnUtil;
import forge.gui.toolbox.itemmanager.views.TableColumnInfo;
import forge.gui.toolbox.itemmanager.views.SColumnUtil.ColumnName;
@@ -435,23 +436,23 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
// Add spell shop-specific columns
columnsCatalog.add(SColumnUtil.getColumn(ColumnName.CAT_PURCHASE_PRICE));
columnsCatalog.get(columnsCatalog.size() - 1).setSortAndDisplayFunctions(
this.fnPriceCompare, this.fnPriceGet);
this.fnPriceCompare, this.fnPriceGet, new ItemCellRenderer());
columnsCatalog.add(1, SColumnUtil.getColumn(ColumnName.CAT_OWNED));
columnsCatalog.get(1).setSortAndDisplayFunctions(
questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet());
questData.getCards().getFnOwnedCompare(), questData.getCards().getFnOwnedGet(), new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_SALE_PRICE));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnPriceCompare, this.fnPriceSellGet);
this.fnPriceCompare, this.fnPriceSellGet, new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_NEW));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet());
this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet(), new ItemCellRenderer());
columnsDeck.add(SColumnUtil.getColumn(ColumnName.DECK_DECKS));
columnsDeck.get(columnsDeck.size() - 1).setSortAndDisplayFunctions(
this.fnDeckCompare, this.fnDeckGet);
this.fnDeckCompare, this.fnDeckGet, new ItemCellRenderer());
// don't need AI column for either table
columnsCatalog.remove(SColumnUtil.getColumn(ColumnName.CAT_AI));

View File

@@ -1483,6 +1483,8 @@ public enum FSkin {
}
public enum EditorImages implements SkinProp {
IMG_STAR_OUTINE (new int[] {640, 460, 20, 20}),
IMG_STAR_FILLED (new int[] {660, 460, 20, 20}),
IMG_ARTIFACT (new int[] {280, 720, 40, 40}),
IMG_CREATURE (new int[] {240, 720, 40, 40}),
IMG_ENCHANTMENT (new int[] {320, 720, 40, 40}),

View File

@@ -20,13 +20,12 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/**
* A quick converter to avoid -1 being displayed for unapplicable values.
*/
@SuppressWarnings("serial")
public class IntegerRenderer extends DefaultTableCellRenderer {
public class IntegerRenderer extends ItemCellRenderer {
/*
* (non-Javadoc)
*

View File

@@ -17,9 +17,19 @@
*/
package forge.gui.toolbox.itemmanager.views;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
/**
* A marker interface for indicating that tooltips should always be shown for
* cells rendered with the marked renderer.
* Base cell renderer class for item tables
*/
interface AlwaysShowToolTip {
@SuppressWarnings("serial")
public class ItemCellRenderer extends DefaultTableCellRenderer {
public boolean alwaysShowTooltip() {
return false;
}
public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) {
}
}

View File

@@ -151,40 +151,6 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
this.table.getTableHeader().setBackground(new Color(200, 200, 200));
}
private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) {
Component cell = renderer.getTableCellRendererComponent(
this.table, val, false, false, row, col);
// if we're conditionally showing the tooltip, check to see
// if we shouldn't show it
if (!(cell instanceof AlwaysShowToolTip))
{
// if there's enough room (or there's no value), no tooltip
// we use '>' here instead of '>=' since that seems to be the
// threshold for where the ellipses appear for the default
// JTable renderer
int requiredWidth = cell.getPreferredSize().width;
TableColumn tableColumn = this.table.getColumnModel().getColumn(col);
if (null == val || tableColumn.getWidth() > requiredWidth) {
return null;
}
}
// use a pre-set tooltip if it exists
if (cell instanceof JComponent)
{
JComponent jcell = (JComponent)cell;
String tip = jcell.getToolTipText();
if (null != tip)
{
return tip;
}
}
// otherwise, show the full text in the tooltip
return String.valueOf(val);
}
public void setAvailableColumns(final List<TableColumnInfo<InventoryItem>> cols) {
final DefaultTableColumnModel colModel = new DefaultTableColumnModel();
@@ -331,15 +297,65 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
if (col < 0) { return null; }
TableColumn tableColumn = columnModel.getColumn(col);
TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer();
if (null == headerRenderer) {
if (headerRenderer == null) {
headerRenderer = getDefaultRenderer();
}
return getCellTooltip(
headerRenderer, -1, col, tableColumn.getHeaderValue());
return getCellTooltip(headerRenderer, -1, col, tableColumn.getHeaderValue());
}
};
}
public void processMouseEvent(MouseEvent e) {
Point p = e.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (col < 0 || col >= getColumnCount() || row < 0 || row >= getRowCount()) {
return;
}
Object val = getValueAt(row, col);
if (val == null) {
return;
}
ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col);
if (renderer != null) {
renderer.processMouseEvent(e, this, val, row, col); //give renderer a chance to process the mouse event
}
super.processMouseEvent(e);
}
private String getCellTooltip(TableCellRenderer renderer, int row, int col, Object val) {
Component cell = renderer.getTableCellRendererComponent(this, val, false, false, row, col);
// if we're conditionally showing the tooltip, check to see
// if we shouldn't show it
if (!(cell instanceof ItemCellRenderer)) {
// if there's enough room (or there's no value), no tooltip
// we use '>' here instead of '>=' since that seems to be the
// threshold for where the ellipses appear for the default
// JTable renderer
int requiredWidth = cell.getPreferredSize().width;
TableColumn tableColumn = this.getColumnModel().getColumn(col);
if (null == val || tableColumn.getWidth() > requiredWidth) {
return null;
}
}
// use a pre-set tooltip if it exists
if (cell instanceof JComponent) {
JComponent jcell = (JComponent)cell;
String tip = jcell.getToolTipText();
if (tip != null) {
return tip;
}
}
// otherwise, show the full text in the tooltip
return String.valueOf(val);
}
@Override
public String getToolTipText(MouseEvent e) {
@@ -352,7 +368,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
}
Object val = getValueAt(row, col);
if (null == val) {
if (val == null) {
return null;
}
@@ -370,7 +386,8 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
final int col = columnAtPoint(p);
if (row == lastTooltipRow && col == lastTooltipCol) {
p = lastTooltipPt;
} else {
}
else {
lastTooltipRow = row;
lastTooltipCol = col;
lastTooltipPt = p;

View File

@@ -20,8 +20,6 @@ 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.card.CardRules;
import forge.card.CardSplitType;
import forge.card.mana.ManaCost;
@@ -33,7 +31,7 @@ import forge.gui.toolbox.FSkin.JLabelSkin;
/**
* Displays mana cost as symbols.
*/
public class ManaCostRenderer extends DefaultTableCellRenderer {
public class ManaCostRenderer extends ItemCellRenderer {
private static final long serialVersionUID = 1770527102334163549L;
private static final int elemtWidth = 13;

View File

@@ -144,69 +144,59 @@ 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.FN_FAV_COMPARE, SColumnUtil.FN_FAV_GET, new StarRenderer());
SColumnUtil.getColumn(ColumnName.CAT_QUANTITY).setSortAndDisplayFunctions(
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET);
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_NAME).setSortAndDisplayFunctions(
SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET);
SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_COST).setSortAndDisplayFunctions(
SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET);
SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET, new ManaCostRenderer());
SColumnUtil.getColumn(ColumnName.CAT_COLOR).setSortAndDisplayFunctions(
SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET);
SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_TYPE).setSortAndDisplayFunctions(
SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET);
SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_POWER).setSortAndDisplayFunctions(
SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET);
SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.CAT_TOUGHNESS).setSortAndDisplayFunctions(
SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET);
SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.CAT_CMC).setSortAndDisplayFunctions(
SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET);
SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.CAT_RARITY).setSortAndDisplayFunctions(
SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET);
SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_SET).setSortAndDisplayFunctions(
SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET);
SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET, new SetCodeRenderer());
SColumnUtil.getColumn(ColumnName.CAT_AI).setSortAndDisplayFunctions(
SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET);
SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.CAT_RANKING).setSortAndDisplayFunctions(
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET);
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_QUANTITY).setSortAndDisplayFunctions(
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET);
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_NAME).setSortAndDisplayFunctions(
SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET);
SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_COST).setSortAndDisplayFunctions(
SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET);
SColumnUtil.FN_COST_COMPARE, SColumnUtil.FN_COST_GET, new ManaCostRenderer());
SColumnUtil.getColumn(ColumnName.DECK_COLOR).setSortAndDisplayFunctions(
SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET);
SColumnUtil.FN_COLOR_COMPARE, SColumnUtil.FN_COLOR_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_TYPE).setSortAndDisplayFunctions(
SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET);
SColumnUtil.FN_TYPE_COMPARE, SColumnUtil.FN_TYPE_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_POWER).setSortAndDisplayFunctions(
SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET);
SColumnUtil.FN_POWER_COMPARE, SColumnUtil.FN_POWER_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_TOUGHNESS).setSortAndDisplayFunctions(
SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET);
SColumnUtil.FN_TOUGHNESS_COMPARE, SColumnUtil.FN_TOUGHNESS_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_CMC).setSortAndDisplayFunctions(
SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET);
SColumnUtil.FN_CMC_COMPARE, SColumnUtil.FN_CMC_GET, new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_RARITY).setSortAndDisplayFunctions(
SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET);
SColumnUtil.FN_RARITY_COMPARE, SColumnUtil.FN_RARITY_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_SET).setSortAndDisplayFunctions(
SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET);
SColumnUtil.FN_SET_COMPARE, SColumnUtil.FN_SET_GET, new SetCodeRenderer());
SColumnUtil.getColumn(ColumnName.DECK_AI).setSortAndDisplayFunctions(
SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET);
SColumnUtil.FN_AI_STATUS_COMPARE, SColumnUtil.FN_AI_STATUS_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_RANKING).setSortAndDisplayFunctions(
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET);
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer());
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());
SColumnUtil.getColumn(ColumnName.CAT_CMC).setCellRenderer(new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.CAT_SET).setCellRenderer(new SetCodeRenderer());
SColumnUtil.getColumn(ColumnName.DECK_COST).setCellRenderer(new ManaCostRenderer());
SColumnUtil.getColumn(ColumnName.DECK_POWER).setCellRenderer(new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_TOUGHNESS).setCellRenderer(new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_CMC).setCellRenderer(new IntegerRenderer());
SColumnUtil.getColumn(ColumnName.DECK_SET).setCellRenderer(new SetCodeRenderer());
SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setMinWidth(18); //prevent resizing favorite column
SColumnUtil.getColumn(ColumnName.CAT_FAVORITE).setMaxWidth(18);
}
/**
@@ -365,7 +355,11 @@ public final class SColumnUtil {
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();
IPaperCard card = SColumnUtil.toCard(from.getKey());
if (card == null) {
return -1;
}
return card.getPrefs().getStarCount();
}
};

View File

@@ -17,8 +17,6 @@
*/
package forge.gui.toolbox.itemmanager.views;
import javax.swing.table.DefaultTableCellRenderer;
import forge.Singletons;
import forge.card.CardEdition;
@@ -26,7 +24,12 @@ import forge.card.CardEdition;
* A wrapper to show explanatory tooltips for edition set abbreviations.
*/
@SuppressWarnings("serial")
public class SetCodeRenderer extends DefaultTableCellRenderer implements AlwaysShowToolTip {
public class SetCodeRenderer extends ItemCellRenderer {
@Override
public boolean alwaysShowTooltip() {
return true;
}
@Override
public String getToolTipText() {
String setAbbrev = getText();

View File

@@ -19,22 +19,29 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import forge.card.CardPreferences;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinImage;
import forge.item.IPaperCard;
import forge.properties.NewConstants;
/**
* Displays favorite icons
*/
@SuppressWarnings("serial")
public class StarRenderer extends DefaultTableCellRenderer {
public class StarRenderer extends ItemCellRenderer {
private IPaperCard card;
private SkinImage skinImage;
@Override
public boolean alwaysShowTooltip() {
return true;
}
/*
* (non-Javadoc)
*
@@ -54,6 +61,20 @@ public class StarRenderer extends DefaultTableCellRenderer {
update();
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);
}
@Override
public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) {
if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1 && value instanceof IPaperCard) {
card = (IPaperCard) value;
CardPreferences prefs = card.getPrefs();
prefs.setStarCount((prefs.getStarCount() + 1) % 2); //TODO: consider supporting more than 1 star
CardPreferences.save(NewConstants.CARD_PREFS_FILE);
update();
table.setRowSelectionInterval(row, row);
table.repaint();
e.consume();
}
}
private void update() {
if (card == null) {
@@ -61,12 +82,12 @@ public class StarRenderer extends DefaultTableCellRenderer {
skinImage = null;
}
else if (card.getPrefs().getStarCount() == 0) {
this.setToolTipText("Click to add " + card.getName() + " to favorites");
skinImage = null;
this.setToolTipText("Click to add " + card.getName() + " to your favorites");
skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_OUTINE);
}
else { //TODO: consider supporting more than 1 star
this.setToolTipText("Click to remove " + card.getName() + " from favorites");
skinImage = null;
this.setToolTipText("Click to remove " + card.getName() + " from your favorites");
skinImage = FSkin.getImage(FSkin.EditorImages.IMG_STAR_FILLED);
}
}
@@ -81,7 +102,7 @@ public class StarRenderer extends DefaultTableCellRenderer {
if (skinImage == null) { return; }
int size = 13;
int size = 15;
int width = this.getWidth();
int height = this.getHeight();
if (size > width) {

View File

@@ -155,8 +155,9 @@ public class TableColumnInfo<T> extends TableColumn {
* @param lambda0 the fnSort
* @param lambda1 the fnDisplay
*/
public void setSortAndDisplayFunctions(final Function<Entry<T, Integer>, Comparable<?>> lambda0, final Function<Entry<T, Integer>, Object> lambda1) {
public void setSortAndDisplayFunctions(final Function<Entry<T, Integer>, Comparable<?>> lambda0, final Function<Entry<T, Integer>, Object> lambda1, ItemCellRenderer cellRenderer) {
this.fnSort = lambda0;
this.fnDisplay = lambda1;
this.setCellRenderer(cellRenderer);
}
}

View File

@@ -37,7 +37,7 @@ public final class NewConstants {
public static final String IMAGE_LIST_QUEST_FATPACKS_FILE = _LIST_DIR + "fatpack-images.txt";
public static final String IMAGE_LIST_QUEST_PRECONS_FILE = _LIST_DIR + "precon-images.txt";
public static final String IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE = _LIST_DIR + "tournamentpack-images.txt";
private static final String _QUEST_DIR = _RES_ROOT + "quest/";
public static final String TEXT_HOWTO_FILE = _RES_ROOT + "howto.txt";
public static final String DRAFT_RANKINGS_FILE = _RES_ROOT + "draft/rankings.txt";
@@ -47,11 +47,11 @@ public final class NewConstants {
public static final String DECK_CUBE_DIR = _RES_ROOT + "cube";
public static final String QUEST_WORLD_DIR = _QUEST_DIR + "worlds/";
public static final String QUEST_PRECON_DIR = _QUEST_DIR + "precons/";
public static final String CARD_DATA_PETS_DIR = _QUEST_DIR + "bazaar/";
public static final String DEFAULT_DUELS_DIR = _QUEST_DIR + "duels";
public static final String DEFAULT_CHALLENGES_DIR = _QUEST_DIR + "challenges";
// data tree roots
public static final String USER_DIR;
public static final String CACHE_DIR;
@@ -80,8 +80,8 @@ public final class NewConstants {
public static final String DECK_COMMANDER_DIR = DECK_BASE_DIR + "commander/";
public static final String QUEST_SAVE_DIR = USER_QUEST_DIR + "saves/";
public static final String MAIN_PREFS_FILE = USER_PREFS_DIR + "forge.preferences";
public static final String CARD_PREFS_FILE = USER_PREFS_DIR + "card.preferences";
public static final String QUEST_PREFS_FILE = USER_PREFS_DIR + "quest.preferences";
// data that has defaults in the program dir but overrides/additions in the user dir
private static final String _DEFAULTS_DIR = _RES_ROOT + "defaults/";
@@ -91,7 +91,7 @@ public final class NewConstants {
public static final FileLocation WORKSHOP_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "workshop.xml");
public static final FileLocation EDITOR_LAYOUT_FILE = new FileLocation(_DEFAULTS_DIR, USER_PREFS_DIR, "editor.xml");
public static final FileLocation GAUNTLET_DIR = new FileLocation(_DEFAULTS_DIR, USER_DIR, "gauntlet/");
// data that is only in the cached dir
private static final String _PICS_DIR = CACHE_DIR + "pics/";
public static final String DB_DIR = CACHE_DIR + "db/";
@@ -104,7 +104,7 @@ public final class NewConstants {
public static final String CACHE_TOURNAMENTPACK_PICS_DIR = _PICS_DIR + "tournamentpacks/";
public static final String QUEST_CARD_PRICE_FILE = DB_DIR + "all-prices.txt";
public static final String CACHE_MORPH_IMAGE_FILE = "morph";
public static final String[] PROFILE_DIRS = {
USER_DIR,
CACHE_DIR,
@@ -124,7 +124,7 @@ public final class NewConstants {
CACHE_FATPACK_PICS_DIR,
CACHE_PRECON_PICS_DIR,
CACHE_TOURNAMENTPACK_PICS_DIR };
// URLs
private static final String _URL_CARDFORGE = "http://cardforge.org";
public static final String URL_DRAFT_UPLOAD = _URL_CARDFORGE + "/draftAI/submitDraftData.php";