mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Support marking cards as favorites in catalog
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 |
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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}),
|
||||
|
||||
@@ -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)
|
||||
*
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user