Add +/- buttons to Deck Editor Quantity column

This commit is contained in:
drdev
2013-12-22 20:43:11 +00:00
parent faa9947974
commit 446dfd2257
8 changed files with 115 additions and 8 deletions

1
.gitattributes vendored
View File

@@ -15482,6 +15482,7 @@ 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/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/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/package-info.java -text
forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.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/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/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/ItemListView.java -text

View File

@@ -10,6 +10,7 @@ Release Notes
- Deck Editor usability improvements - - Deck Editor usability improvements -
You can now mark a card as a favorite in the Catalog by clicking the star icon in the first column. This will default the card to sort ahead of non-favorite cards if you sort on that first column (which is now the Forge default). You can now mark a card as a favorite in the Catalog by clicking the star icon in the first column. This will default the card to sort ahead of non-favorite cards if you sort on that first column (which is now the Forge default).
You can now add or remove cards from a deck using +/- buttons that appear on either side of the quantity for each card.
Filters are now available on Current Deck pane, replacing the need for the static stat labels Filters are now available on Current Deck pane, replacing the need for the static stat labels
A new filter has been added to allow filtering on specific Converted Mana Costs (0, 1, 2, 3, 4, 5, 6+), as well as displaying the card count at each CMC. A new filter has been added to allow filtering on specific Converted Mana Costs (0, 1, 2, 3, 4, 5, 6+), as well as displaying the card count at each CMC.
Color and Type filter buttons no longer wrap, instead growing or shrinking as needed (along with the font the count string is too long). Color and Type filter buttons no longer wrap, instead growing or shrinking as needed (along with the font the count string is too long).

View File

@@ -136,6 +136,25 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
void move(InventoryItem item, int qty); void move(InventoryItem item, int qty);
} }
@SuppressWarnings("unchecked")
public void incrementDeckQuantity(InventoryItem item, int delta) {
if (item == null || delta == 0) { return; }
if (delta > 0) { //add items
int qty = Math.min(delta, ((ItemManager<InventoryItem>)childController.getCatalogManager()).getItemCount(item));
if (qty == 0) { return; }
childController.addCard(item, false, qty);
}
else { //remove items
int qty = Math.min(-delta, ((ItemManager<InventoryItem>)childController.getDeckManager()).getItemCount(item));
if (qty == 0) { return; }
childController.removeCard(item, false, qty);
}
CStatistics.SINGLETON_INSTANCE.update();
CProbabilities.SINGLETON_INSTANCE.update();
}
private void moveSelectedCards(ItemManager<InventoryItem> itemManager, _MoveAction moveAction, int maxQty) { private void moveSelectedCards(ItemManager<InventoryItem> itemManager, _MoveAction moveAction, int maxQty) {
List<? extends InventoryItem> items = itemManager.getSelectedItems(); List<? extends InventoryItem> items = itemManager.getSelectedItems();
if (items.isEmpty()) { if (items.isEmpty()) {

View File

@@ -0,0 +1,81 @@
/*
* 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.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.JLabelSkin;
import forge.gui.toolbox.FSkin.SkinImage;
import forge.item.InventoryItem;
/**
* Displays deck quantity with +/- buttons
*/
@SuppressWarnings("serial")
public class DeckQuantityRenderer extends ItemCellRenderer {
private static final SkinImage imgAdd = FSkin.getIcon(FSkin.InterfaceIcons.ICO_PLUS);
private static final SkinImage imgRemove = FSkin.getIcon(FSkin.InterfaceIcons.ICO_MINUS);
private static final int imgSize = 13;
private final JLabelSkin<DeckQuantityRenderer> skin = FSkin.get(this);
public DeckQuantityRenderer() {
this.setHorizontalAlignment(JLabel.CENTER);
}
@Override
public <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1) {
Rectangle cellBounds = listView.getTable().getCellRect(row, column, false);
int delta = 0;
int x = e.getX() - cellBounds.x;
if (x <= imgSize) { //add button
delta = 1;
}
else if (x >= cellBounds.width - imgSize) { //remove button
delta = -1;
}
if (delta != 0) {
listView.getTable().setRowSelectionInterval(row, row); //must set selection first so scroll doesn't get messed up
CDeckEditorUI.SINGLETON_INSTANCE.incrementDeckQuantity(listView.getItemAtIndex(row), delta);
e.consume();
}
}
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#paint(java.awt.Graphics)
*/
@Override
public final void paint(final Graphics g) {
super.paint(g);
int y = (this.getHeight() - imgSize) / 2;
skin.drawImage(g, imgAdd, 0, y, imgSize, imgSize);
skin.drawImage(g, imgRemove, this.getWidth() - imgSize, y, imgSize, imgSize);
}
}

View File

@@ -19,9 +19,10 @@ package forge.gui.toolbox.itemmanager.views;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
import forge.item.InventoryItem;
/** /**
* Base cell renderer class for item tables * Base cell renderer class for item tables
*/ */
@@ -30,6 +31,6 @@ public class ItemCellRenderer extends DefaultTableCellRenderer {
public boolean alwaysShowTooltip() { public boolean alwaysShowTooltip() {
return false; return false;
} }
public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) { public <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
} }
} }

View File

@@ -322,7 +322,7 @@ public final class ItemListView<T extends InventoryItem> extends ItemView<T> {
ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col); ItemCellRenderer renderer = (ItemCellRenderer)getCellRenderer(row, col);
if (renderer != null) { if (renderer != null) {
renderer.processMouseEvent(e, this, val, row, col); //give renderer a chance to process the mouse event renderer.processMouseEvent(e, ItemListView.this, val, row, col); //give renderer a chance to process the mouse event
} }
super.processMouseEvent(e); super.processMouseEvent(e);
} }

View File

@@ -175,8 +175,11 @@ public final class SColumnUtil {
SColumnUtil.getColumn(ColumnName.CAT_RANKING).setSortAndDisplayFunctions( SColumnUtil.getColumn(ColumnName.CAT_RANKING).setSortAndDisplayFunctions(
SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer()); SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_QUANTITY).setSortAndDisplayFunctions( TableColumnInfo<InventoryItem> deckQuantityColumn = SColumnUtil.getColumn(ColumnName.DECK_QUANTITY);
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer()); deckQuantityColumn.setMinWidth(46); //prevent resizing deck quantity column such that there isn't room for both +/- buttons and a 2-digit quantity
deckQuantityColumn.setSortAndDisplayFunctions(
SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new DeckQuantityRenderer());
SColumnUtil.getColumn(ColumnName.DECK_NAME).setSortAndDisplayFunctions( SColumnUtil.getColumn(ColumnName.DECK_NAME).setSortAndDisplayFunctions(
SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer()); SColumnUtil.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer());
SColumnUtil.getColumn(ColumnName.DECK_COST).setSortAndDisplayFunctions( SColumnUtil.getColumn(ColumnName.DECK_COST).setSortAndDisplayFunctions(

View File

@@ -27,6 +27,7 @@ import forge.gui.CardPreferences;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinImage; import forge.gui.toolbox.FSkin.SkinImage;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.InventoryItem;
import forge.properties.NewConstants; import forge.properties.NewConstants;
/** /**
@@ -63,15 +64,15 @@ public class StarRenderer extends ItemCellRenderer {
} }
@Override @Override
public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) { public <T extends InventoryItem> void processMouseEvent(final MouseEvent e, final ItemListView<T> listView, final Object value, final int row, final int column) {
if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1 && value instanceof IPaperCard) { if (e.getID() == MouseEvent.MOUSE_PRESSED && e.getButton() == 1 && value instanceof IPaperCard) {
card = (IPaperCard) value; card = (IPaperCard) value;
CardPreferences prefs = CardPreferences.getPrefs(card.getName()); CardPreferences prefs = CardPreferences.getPrefs(card.getName());
prefs.setStarCount((prefs.getStarCount() + 1) % 2); //TODO: consider supporting more than 1 star prefs.setStarCount((prefs.getStarCount() + 1) % 2); //TODO: consider supporting more than 1 star
CardPreferences.save(NewConstants.CARD_PREFS_FILE); CardPreferences.save(NewConstants.CARD_PREFS_FILE);
update(); update();
table.setRowSelectionInterval(row, row); listView.getTable().setRowSelectionInterval(row, row);
table.repaint(); listView.getTable().repaint();
e.consume(); e.consume();
} }
} }