- add bulk addition and removal routines to editor model

- add button to sell excess duplicates of all cards in spell shop
- ensure table selection is restored properly after adding a card
This commit is contained in:
myk
2013-02-04 03:09:14 +00:00
parent e5d4d84e00
commit 34dd170f62
7 changed files with 165 additions and 63 deletions

View File

@@ -20,6 +20,7 @@ package forge.gui.deckeditor.controllers;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -27,6 +28,8 @@ import java.util.Map.Entry;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function;
import forge.Command;
@@ -103,6 +106,9 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
private String CCAddLabel = new String();
private String CDTabLabel = new String();
private String CDRemLabel = new String();
private String prevRem4Label = null;
private String prevRem4Tooltip = null;
private Command prevRem4Cmd = null;
/**
* Child controller for quest card shop UI.
@@ -133,11 +139,13 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
this.getTableCatalog().setDeck(fullCatalogCards);
VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setEnabled(false);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setEnabled(false);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setEnabled(false);
fullCatalogToggle.setText("Return to spell shop");
} else {
this.getTableCatalog().setDeck(cardsForSale);
VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setEnabled(true);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setEnabled(true);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setEnabled(true);
fullCatalogToggle.setText("See full catalog");
}
}
@@ -189,6 +197,10 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
CDRemLabel = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().getText();
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText("Sell Card");
prevRem4Label = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getText();
prevRem4Tooltip = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getToolTipText();
prevRem4Cmd = VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().getCommand();
VCurrentDeck.SINGLETON_INSTANCE.getPnlHeader().setVisible(false);
}
@@ -288,11 +300,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
*/
@Override
public void addCard(InventoryItem item) {
if (showingFullCatalog) {
// no "buying" from the full catalog
return;
}
if (item == null) {
return;
}
@@ -324,9 +331,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
}
this.questData.getCards().buyPack(booster, value);
final List<CardPrinted> newCards = booster.getCards();
for (final CardPrinted card : newCards) {
this.getTableDeck().addCard(card);
}
final List<InventoryItem> newInventory = new LinkedList<InventoryItem>(newCards);
getTableDeck().addCards(newInventory);
final CardListViewer c = new CardListViewer(booster.getName(),
"You have found the following cards inside:", newCards);
c.show();
@@ -334,11 +340,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
this.getTableCatalog().removeCard(item);
final PreconDeck deck = (PreconDeck) item;
this.questData.getCards().buyPreconDeck(deck, value);
for (final CardPrinted card : deck.getDeck().getMain().toFlatList()) {
this.getTableDeck().addCard(card);
}
final ItemPool<InventoryItem> newInventory = ItemPool.createFrom(deck.getDeck().getMain(), InventoryItem.class, false);
getTableDeck().addCards(newInventory);
JOptionPane.showMessageDialog(null, String.format(
"Deck '%s' was added to your decklist.%n%nCards from it were also added to your pool.",
deck.getName()), "Thanks for purchasing!", JOptionPane.INFORMATION_MESSAGE);
@@ -352,11 +355,6 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
*/
@Override
public void removeCard(InventoryItem item) {
if (showingFullCatalog) {
// no "selling" to the full catalog
return;
}
if ((item == null) || !(item instanceof CardPrinted)) {
return;
}
@@ -367,11 +365,27 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)), this.questData.getCards()
.getSellPriceLimit());
this.questData.getCards().sellCard(card, price);
this.questData.getCards().sellCard(card, 1, price);
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
}
public void removeCards(List<Map.Entry<InventoryItem, Integer>> cardsToRemove) {
this.getTableDeck().removeCards(cardsToRemove);
this.getTableCatalog().addCards(cardsToRemove);
for (Map.Entry<InventoryItem, Integer> item : cardsToRemove) {
if (!(item.getKey() instanceof CardPrinted)) {
continue;
}
CardPrinted card = (CardPrinted)item.getKey();
final int price = Math.min((int) (this.multiplier * this.getCardValue(card)),
this.questData.getCards().getSellPriceLimit());
this.questData.getCards().sellCard(card, item.getValue(), price);
}
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
}
/*
* (non-Javadoc)
@@ -395,6 +409,7 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
/* (non-Javadoc)
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@SuppressWarnings("serial")
@Override
public void init() {
setup();
@@ -409,7 +424,21 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
this.getTableCatalog().setDeck(cardsForSale);
this.getTableDeck().setDeck(ownedItems);
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().remove(VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4());
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setText("Sell excess cards");
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setToolTipText("Sell extra non-basic land cards of which you have more than four copies");
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setCommand(new Command() {
@Override
public void execute() {
List<Map.Entry<InventoryItem, Integer>> cardsToRemove = new LinkedList<Map.Entry<InventoryItem,Integer>>();
for (Map.Entry<InventoryItem, Integer> item : getTableDeck().getCards()) {
if (4 < item.getValue() && !"Basic Land - ".startsWith(item.getKey().getItemType())) {
cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - 4));
}
}
removeCards(cardsToRemove);
}
});
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().add(creditsLabel);
this.creditsLabel.setText("Credits: " + this.questData.getAssets().getCredits());
@@ -446,14 +475,16 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
VCardCatalog.SINGLETON_INSTANCE.getPnlAddButtons().add(VCardCatalog.SINGLETON_INSTANCE.getBtnAdd4());
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().remove(creditsLabel);
VCurrentDeck.SINGLETON_INSTANCE.getPnlRemButtons().add(VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4());
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setText(prevRem4Label);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setToolTipText(prevRem4Tooltip);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove4().setCommand(prevRem4Cmd);
VCardCatalog.SINGLETON_INSTANCE.getTabLabel().setText(CCTabLabel);
VCurrentDeck.SINGLETON_INSTANCE.getTabLabel().setText(CDTabLabel);
VCardCatalog.SINGLETON_INSTANCE.getBtnAdd().setText(CCAddLabel);
VCurrentDeck.SINGLETON_INSTANCE.getBtnRemove().setText(CDRemLabel);
return true;
}
}

View File

@@ -139,10 +139,10 @@ public final class EditorTableModel<T extends InventoryItem> extends AbstractTab
*
* @param card0 &emsp; {@link forge.Card} object
*/
public void removeCard(final T card0) {
public void removeCard(final T card0, int qty) {
final boolean wasThere = this.data.count(card0) > 0;
if (wasThere) {
this.data.remove(card0);
this.data.remove(card0, qty);
this.fireTableDataChanged();
}
}
@@ -152,8 +152,8 @@ public final class EditorTableModel<T extends InventoryItem> extends AbstractTab
*
* @param card0 &emsp; {@link forge.Card} object.
*/
public void addCard(final T card0) {
this.data.add(card0);
public void addCard(final T card0, int qty) {
this.data.add(card0, qty);
this.fireTableDataChanged();
}

View File

@@ -22,11 +22,14 @@ import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableColumnModel;
@@ -243,13 +246,21 @@ public final class EditorTableView<T extends InventoryItem> {
*/
public void fixSelection(final int rowLastSelected) {
// 3 cases: 0 cards left, select the same row, select prev row
int newRow = rowLastSelected;
final int cntRowsAbove = this.model.getRowCount();
if (cntRowsAbove != 0) {
if (0 <= rowLastSelected && cntRowsAbove != 0) {
int newRow = rowLastSelected;
if (cntRowsAbove == newRow) {
// move selection away from the last, already missing, option
newRow--;
} // move selection away from the last, already missing, option
this.table.setRowSelectionInterval(newRow, newRow);
}
final int selectRow = newRow;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
table.setRowSelectionInterval(selectRow, selectRow);
}
});
}
}
@@ -346,12 +357,37 @@ public final class EditorTableView<T extends InventoryItem> {
* an InventoryItem
*/
public void addCard(final T card) {
// int n = table.getSelectedRow();
final int n = this.table.getSelectedRow();
this.pool.add(card);
if (this.isUnfiltered()) {
this.model.addCard(card);
this.model.addCard(card, 1);
}
this.updateView(false);
this.fixSelection(n);
}
public void addCards(Iterable<Map.Entry<T, Integer>> cardsToAdd) {
final int n = this.table.getSelectedRow();
for (Map.Entry<T, Integer> item : cardsToAdd) {
this.pool.add(item.getKey(), item.getValue());
if (this.isUnfiltered()) {
this.model.addCard(item.getKey(), item.getValue());
}
}
this.updateView(false);
this.fixSelection(n);
}
public void addCards(Collection<T> cardsToAdd) {
final int n = this.table.getSelectedRow();
for (T item : cardsToAdd) {
this.pool.add(item, 1);
if (this.isUnfiltered()) {
this.model.addCard(item, 1);
}
}
this.updateView(false);
this.fixSelection(n);
}
/**
@@ -365,7 +401,19 @@ public final class EditorTableView<T extends InventoryItem> {
final int n = this.table.getSelectedRow();
this.pool.remove(card);
if (this.isUnfiltered()) {
this.model.removeCard(card);
this.model.removeCard(card, 1);
}
this.updateView(false);
this.fixSelection(n);
}
public void removeCards(List<Map.Entry<T, Integer>> cardsToRemove) {
final int n = this.table.getSelectedRow();
for (Map.Entry<T, Integer> item : cardsToRemove) {
this.pool.remove(item.getKey(), item.getValue());
if (this.isUnfiltered()) {
this.model.removeCard(item.getKey(), item.getValue());
}
}
this.updateView(false);
this.fixSelection(n);

View File

@@ -80,14 +80,14 @@ public enum VCurrentDeck implements IVDoc<CCurrentDeck>, ITableContainer {
private final JPanel pnlRemoveButtons =
new JPanel(new MigLayout("insets 0, gap 0, ax center, hidemode 3"));
private final JLabel btnRemove = new FLabel.Builder()
private final FLabel btnRemove = new FLabel.Builder()
.fontSize(14)
.text("Remove card")
.tooltip("Remove selected card to current deck (or double click the row)")
.icon(FSkin.getIcon(FSkin.InterfaceIcons.ICO_MINUS))
.iconScaleAuto(false).hoverable(true).build();
private final JLabel btnRemove4 = new FLabel.Builder()
private final FLabel btnRemove4 = new FLabel.Builder()
.fontSize(14)
.text("Remove 4 of card")
.tooltip("Remove up to 4 of selected card to current deck")
@@ -236,12 +236,12 @@ public enum VCurrentDeck implements IVDoc<CCurrentDeck>, ITableContainer {
//========== Retrieval
/** @return {@link javax.swing.JLabel} */
public JLabel getBtnRemove() {
public FLabel getBtnRemove() {
return btnRemove;
}
/** @return {@link javax.swing.JLabel} */
public JLabel getBtnRemove4() {
public FLabel getBtnRemove4() {
return btnRemove4;
}

View File

@@ -144,7 +144,7 @@ public class QuestWinLose extends ControlWinLose {
this.anteWon(anteCards);
} else {
for (CardPrinted c : anteCards) {
qc.getCards().loseCard(c);
qc.getCards().loseCard(c, 1);
}
this.anteLost(anteCards);
}

View File

@@ -26,6 +26,7 @@ import com.google.common.collect.Iterables;
import forge.card.BoosterData;
import forge.card.BoosterGenerator;
import forge.card.CardRulesPredicates;
import forge.deck.Deck;
import forge.util.Aggregates;
/**
@@ -80,7 +81,7 @@ public abstract class OpenablePack implements InventoryItemFromSet {
}
return this.cards;
}
/**
* Gets the total cards.
*

View File

@@ -17,19 +17,6 @@
*/
package forge.quest;
import forge.Singletons;
import forge.card.BoosterGenerator;
import forge.card.CardEdition;
import forge.card.FormatCollection;
import forge.deck.Deck;
import forge.quest.data.GameFormatQuest;
import forge.item.*;
import forge.quest.bazaar.QuestItemType;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestPreferences;
import forge.quest.data.QuestPreferences.QPref;
import forge.util.Aggregates;
import forge.util.MyRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
@@ -39,6 +26,29 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.Singletons;
import forge.card.BoosterGenerator;
import forge.card.CardEdition;
import forge.card.FormatCollection;
import forge.deck.Deck;
import forge.item.BoosterPack;
import forge.item.CardDb;
import forge.item.CardPrinted;
import forge.item.FatPack;
import forge.item.InventoryItem;
import forge.item.ItemPool;
import forge.item.ItemPoolView;
import forge.item.OpenablePack;
import forge.item.PreconDeck;
import forge.item.TournamentPack;
import forge.quest.bazaar.QuestItemType;
import forge.quest.data.GameFormatQuest;
import forge.quest.data.QuestAssets;
import forge.quest.data.QuestPreferences;
import forge.quest.data.QuestPreferences.QPref;
import forge.util.Aggregates;
import forge.util.MyRandom;
/**
* This is a helper class to execute operations on QuestData. It has been
* created to decrease complexity of questData class
@@ -305,12 +315,12 @@ public final class QuestUtilCards {
* @param price
* the price
*/
public void sellCard(final CardPrinted card, final int price) {
this.sellCard(card, price, true);
public void sellCard(final CardPrinted card, int qty, final int pricePerCard) {
this.sellCard(card, qty, pricePerCard, true);
}
public void loseCard(final CardPrinted card) {
this.sellCard(card, 0, false);
public void loseCard(final CardPrinted card, int qty) {
this.sellCard(card, qty, 0, false);
}
/**
@@ -323,13 +333,13 @@ public final class QuestUtilCards {
* @param addToShop
* true if this card should be added to the shop, false otherwise
*/
private void sellCard(final CardPrinted card, final int price, final boolean addToShop) {
if (price > 0) {
this.qa.setCredits(this.qa.getCredits() + price);
private void sellCard(final CardPrinted card, int qty, final int pricePerCard, final boolean addToShop) {
if (pricePerCard > 0) {
this.qa.setCredits(this.qa.getCredits() + (qty * pricePerCard));
}
this.qa.getCardPool().remove(card);
this.qa.getCardPool().remove(card, qty);
if (addToShop) {
this.qa.getShopList().add(card);
this.qa.getShopList().add(card, qty);
}
// remove card being sold from all decks
@@ -623,7 +633,13 @@ public final class QuestUtilCards {
@Override
public Comparable<?> apply(final Entry<InventoryItem, Integer> from) {
InventoryItem i = from.getKey();
return i instanceof CardPrinted ? QuestUtilCards.this.qa.getCardPool().count((CardPrinted)i) : null;
if (i instanceof CardPrinted) {
return QuestUtilCards.this.qa.getCardPool().count((CardPrinted)i);
} else if (i instanceof PreconDeck) {
PreconDeck pDeck = (PreconDeck)i;
return Singletons.getModel().getQuest().getMyDecks().contains(pDeck.getName()) ? 1 : 0;
}
return null;
}
};
@@ -632,7 +648,13 @@ public final class QuestUtilCards {
@Override
public Object apply(final Entry<InventoryItem, Integer> from) {
InventoryItem i = from.getKey();
return i instanceof CardPrinted ? QuestUtilCards.this.qa.getCardPool().count((CardPrinted)i) : null;
if (i instanceof CardPrinted) {
return QuestUtilCards.this.qa.getCardPool().count((CardPrinted)i);
} else if (i instanceof PreconDeck) {
PreconDeck pDeck = (PreconDeck)i;
return Singletons.getModel().getQuest().getMyDecks().contains(pDeck.getName()) ? "YES" : "NO";
}
return null;
}
};
}