From 446dfd22574a0d0b679d1f00f60e384365412aa5 Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 22 Dec 2013 20:43:11 +0000 Subject: [PATCH] Add +/- buttons to Deck Editor Quantity column --- .gitattributes | 1 + forge-gui/CHANGES.txt | 1 + .../forge/gui/deckeditor/CDeckEditorUI.java | 19 +++++ .../views/DeckQuantityRenderer.java | 81 +++++++++++++++++++ .../itemmanager/views/ItemCellRenderer.java | 5 +- .../itemmanager/views/ItemListView.java | 2 +- .../itemmanager/views/SColumnUtil.java | 7 +- .../itemmanager/views/StarRenderer.java | 7 +- 8 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.java diff --git a/.gitattributes b/.gitattributes index f9bd3463dd5..d72027c1f50 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/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/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/ItemCellRenderer.java -text forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java -text diff --git a/forge-gui/CHANGES.txt b/forge-gui/CHANGES.txt index 661c51b38e8..78d9470ed8a 100644 --- a/forge-gui/CHANGES.txt +++ b/forge-gui/CHANGES.txt @@ -10,6 +10,7 @@ Release Notes - 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 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 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). diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java index d329dffa120..46276441e8a 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/CDeckEditorUI.java @@ -136,6 +136,25 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider { 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)childController.getCatalogManager()).getItemCount(item)); + if (qty == 0) { return; } + childController.addCard(item, false, qty); + } + else { //remove items + int qty = Math.min(-delta, ((ItemManager)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 itemManager, _MoveAction moveAction, int maxQty) { List items = itemManager.getSelectedItems(); if (items.isEmpty()) { diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.java new file mode 100644 index 00000000000..1c3c7981a5b --- /dev/null +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/DeckQuantityRenderer.java @@ -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 . + */ +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 skin = FSkin.get(this); + + public DeckQuantityRenderer() { + this.setHorizontalAlignment(JLabel.CENTER); + } + + @Override + public void processMouseEvent(final MouseEvent e, final ItemListView 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); + } +} diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java index 1cc87970a10..8491cbeb628 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemCellRenderer.java @@ -19,9 +19,10 @@ package forge.gui.toolbox.itemmanager.views; import java.awt.event.MouseEvent; -import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; +import forge.item.InventoryItem; + /** * Base cell renderer class for item tables */ @@ -30,6 +31,6 @@ 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) { + public void processMouseEvent(final MouseEvent e, final ItemListView listView, final Object value, final int row, final int column) { } } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java index 4f0b8d60ac0..bf2d9444c78 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemListView.java @@ -322,7 +322,7 @@ public final class ItemListView extends ItemView { 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 + renderer.processMouseEvent(e, ItemListView.this, val, row, col); //give renderer a chance to process the mouse event } super.processMouseEvent(e); } diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java index 20c3dedbe44..64ec34b7bcf 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/SColumnUtil.java @@ -175,8 +175,11 @@ public final class SColumnUtil { SColumnUtil.getColumn(ColumnName.CAT_RANKING).setSortAndDisplayFunctions( SColumnUtil.FN_RANKING_COMPARE, SColumnUtil.FN_RANKING_GET, new ItemCellRenderer()); - SColumnUtil.getColumn(ColumnName.DECK_QUANTITY).setSortAndDisplayFunctions( - SColumnUtil.FN_QTY_COMPARE, SColumnUtil.FN_QTY_GET, new ItemCellRenderer()); + TableColumnInfo deckQuantityColumn = SColumnUtil.getColumn(ColumnName.DECK_QUANTITY); + 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.FN_NAME_COMPARE, SColumnUtil.FN_NAME_GET, new ItemCellRenderer()); SColumnUtil.getColumn(ColumnName.DECK_COST).setSortAndDisplayFunctions( diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java index a12c4ef9a7b..dd04d2a764e 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/StarRenderer.java @@ -27,6 +27,7 @@ import forge.gui.CardPreferences; import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin.SkinImage; import forge.item.IPaperCard; +import forge.item.InventoryItem; import forge.properties.NewConstants; /** @@ -63,15 +64,15 @@ public class StarRenderer extends ItemCellRenderer { } @Override - public void processMouseEvent(final MouseEvent e, final JTable table, final Object value, final int row, final int column) { + public void processMouseEvent(final MouseEvent e, final ItemListView listView, 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 = CardPreferences.getPrefs(card.getName()); 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(); + listView.getTable().setRowSelectionInterval(row, row); + listView.getTable().repaint(); e.consume(); } }