diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java b/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java index 26b1549cd25..8abdfe0cadd 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/DeckgenUtil.java @@ -84,19 +84,6 @@ public class DeckgenUtil { return deck; } - /** - * @param selection {@link java.lang.String} - * @return {@link forge.deck.Deck} - */ - public static Deck buildThemeDeck(final String selection) { - final GenerateThemeDeck gen = new GenerateThemeDeck(); - final Deck deck = new Deck(); - gen.setSingleton(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS)); - gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); - deck.getMain().addAll(gen.getThemeDeck(selection, 60)); - - return deck; - } public static QuestEvent getQuestEvent(final String name) { QuestController qCtrl = Singletons.getModel().getQuest(); @@ -124,14 +111,6 @@ public class DeckgenUtil { return DeckgenUtil.buildColorDeck(selection, forAi); } - /** @return {@link forge.deck.Deck} */ - public static Deck getRandomThemeDeck() { - final List themeNames = new ArrayList(); - for (final String s : GenerateThemeDeck.getThemeNames()) { themeNames.add(s); } - final int rand = (int) (Math.floor(Math.random() * themeNames.size())); - return DeckgenUtil.buildThemeDeck(themeNames.get(rand)); - } - /** @return {@link forge.deck.Deck} */ public static Deck getRandomCustomDeck() { final IStorage allDecks = Singletons.getModel().getDecks().getConstructed(); diff --git a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java index 3616f332687..8cb8a43b479 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -22,6 +22,7 @@ import forge.gui.toolbox.itemmanager.DeckManager; import forge.gui.toolbox.itemmanager.ItemManagerContainer; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; +import forge.quest.QuestController; import forge.quest.QuestEvent; import forge.quest.QuestEventChallenge; import forge.quest.QuestUtil; @@ -77,7 +78,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private void updateCustom() { lstDecks.setAllowMultipleSelections(false); - lstDecks.setPool(DeckProxy.getAllConstructedDecks()); + lstDecks.setPool(DeckProxy.getAllConstructedDecks(Singletons.getModel().getDecks().getConstructed())); lstDecks.update(); btnRandom.setText("Random Deck"); @@ -175,7 +176,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { private void updatePrecons() { lstDecks.setAllowMultipleSelections(false); - lstDecks.setPool(DeckProxy.getAllPreconstructedDecks()); + lstDecks.setPool(DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons())); lstDecks.update(false, true); btnRandom.setText("Random Deck"); diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/DeckProxy.java b/forge-gui/src/main/java/forge/gui/deckeditor/DeckProxy.java index b2c262d716a..821acf015dd 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/DeckProxy.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/DeckProxy.java @@ -4,10 +4,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; +import org.apache.commons.lang3.StringUtils; +import com.google.common.base.Predicate; import forge.Singletons; import forge.card.ColorSet; import forge.deck.CardPool; @@ -16,29 +15,37 @@ import forge.deck.DeckGroup; import forge.deck.DeckSection; import forge.game.GameFormat; import forge.game.GameType; -import forge.gui.deckchooser.DeckgenUtil; import forge.gui.deckchooser.GenerateThemeDeck; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.item.PreconDeck; +import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; import forge.quest.QuestEvent; import forge.util.storage.IStorage; public class DeckProxy implements InventoryItem { - public final Deck deck; + protected final Deck deck; + protected final IStorage storage; // cached values - private ColorSet color; - private Iterable formats; + protected ColorSet color; + protected Iterable formats; private int mainSize = Integer.MIN_VALUE; private int sbSize = Integer.MIN_VALUE; + private String path; - public DeckProxy(Deck deck, GameType type, IStorage storage) { - this.deck = deck; - // gametype could give us a hint whether the storage is updateable and enable choice of right editor for this deck + public DeckProxy(Deck deck, GameType type, IStorage storage) { + this(deck, type, null, storage); } + public DeckProxy(Deck deck, GameType type, String path, IStorage storage) { + this.deck = deck; + this.storage = storage; + this.path = path; + // gametype could give us a hint whether the storage is updateable and enable choice of right editor for this deck + } + @Override public String getName() { return deck.getName(); @@ -54,6 +61,10 @@ public class DeckProxy implements InventoryItem { return deck; } + public String getPath() { + return path; + } + public void invalidateCache() { color = null; formats = null; @@ -75,21 +86,29 @@ public class DeckProxy implements InventoryItem { } public int getMainSize() { - if ( mainSize < 0 ) - mainSize = deck.getMain().countAll(); + if ( mainSize == Integer.MIN_VALUE ) { + if( deck == null ) + mainSize = -1; + else + mainSize = deck.getMain().countAll(); + } return mainSize; } public int getSideSize() { - if ( sbSize < 0 ) { - if ( deck.has(DeckSection.Sideboard) ) + if ( sbSize == Integer.MIN_VALUE ) { + if ( deck != null && deck.has(DeckSection.Sideboard) ) sbSize = deck.get(DeckSection.Sideboard).countAll(); else - sbSize = 0; + sbSize = -1; } return sbSize; } + public boolean isGeneratedDeck() { + return false; + } + public void updateInStorage() { // if storage is not readonly, save the deck there. } @@ -100,16 +119,27 @@ public class DeckProxy implements InventoryItem { // TODO: The methods below should not take the decks collections from singletons, instead they are supposed to use data passed in parameters - public static Iterable getAllConstructedDecks() { - // This is a temporary solution that does not iterate over subfolders. - will improve + public static Iterable getAllConstructedDecks(IStorage storageRoot) { - return Iterables.transform(Singletons.getModel().getDecks().getConstructed(), new Function(){ - public DeckProxy apply(Deck deck) { return new DeckProxy(deck, GameType.Constructed, Singletons.getModel().getDecks().getConstructed()); - }}); + List result = new ArrayList(); + addDecksRecursivelly(result, "", storageRoot); + return result; + } + + private static void addDecksRecursivelly(List list, String path, IStorage folder) { + for(IStorage f : folder.getFolders()) + { + String subPath = (StringUtils.isBlank(path) ? "" : path ) + "/" + f.getName(); + addDecksRecursivelly(list, subPath, f); + } + + for (Deck d : folder) { + list.add(new DeckProxy(d, GameType.Constructed, path, folder)); + } } - //create predicate that applys a card predicate to all cards in deck + // Consider using a direct predicate to manage DeckProxies (not this tunnel to collection of paper cards) public static final Predicate createPredicate(final Predicate cardPredicate) { return new Predicate() { @Override @@ -143,12 +173,23 @@ public class DeckProxy implements InventoryItem { @Override public Deck getDeck() { - return DeckgenUtil.buildThemeDeck(this.getName()); + final GenerateThemeDeck gen = new GenerateThemeDeck(); + final Deck deck = new Deck(); + gen.setSingleton(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_SINGLETONS)); + gen.setUseArtifacts(Singletons.getModel().getPreferences().getPrefBoolean(FPref.DECKGEN_ARTIFACTS)); + deck.getMain().addAll(gen.getThemeDeck(this.getName(), 60)); + return deck; } @Override public String getName() { return name; } - } + @Override + public String toString() { return name; } + + public boolean isGeneratedDeck() { + return true; + } + } public static Iterable getAllThemeDecks() { ArrayList decks = new ArrayList(); @@ -158,10 +199,10 @@ public class DeckProxy implements InventoryItem { return decks; } - public static Iterable getAllPreconstructedDecks() { + public static Iterable getAllPreconstructedDecks(IStorage iStorage) { ArrayList decks = new ArrayList(); - for (final PreconDeck preconDeck : QuestController.getPrecons()) { - decks.add(new DeckProxy(preconDeck.getDeck(), null, null)); + for (final PreconDeck preconDeck : iStorage) { + decks.add(new DeckProxy(preconDeck.getDeck(), null, iStorage)); } return decks; } @@ -184,7 +225,7 @@ public class DeckProxy implements InventoryItem { // Since AI decks are tied directly to the human choice, // they're just mapped in a parallel map and grabbed when the game starts. for (final DeckGroup d : sealed) { - humanDecks.add(new DeckProxy(d.getHumanDeck(), GameType.Sealed, null)); + humanDecks.add(new DeckProxy(d.getHumanDeck(), GameType.Sealed, sealed)); } return humanDecks; } @@ -201,7 +242,7 @@ public class DeckProxy implements InventoryItem { public static Iterable getDraftDecks(IStorage draft) { ArrayList decks = new ArrayList(); for (DeckGroup d : draft) { - decks.add(new DeckProxy(d.getHumanDeck(), GameType.Draft, null)); + decks.add(new DeckProxy(d.getHumanDeck(), GameType.Draft, draft)); } return decks; } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CAllDecks.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CAllDecks.java index eb3c395e3b9..5ebc3fb3956 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CAllDecks.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CAllDecks.java @@ -1,6 +1,7 @@ package forge.gui.deckeditor.controllers; import forge.Command; +import forge.Singletons; import forge.gui.deckeditor.DeckProxy; import forge.gui.deckeditor.views.VAllDecks; import forge.gui.framework.ICDoc; @@ -30,7 +31,7 @@ public enum CAllDecks implements ICDoc { */ @Override public void initialize() { - VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks()); + VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks(Singletons.getModel().getDecks().getConstructed())); } /* (non-Javadoc) diff --git a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java index 406ba513086..ebc27ca026a 100644 --- a/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui/src/main/java/forge/gui/home/gauntlet/CSubmenuGauntletQuick.java @@ -116,10 +116,6 @@ public enum CSubmenuGauntletQuick implements ICDoc { tempDeck = DeckgenUtil.getRandomColorDeck(true); lstEventNames.add("Random colors deck"); } - else if (lstDecktypes.get(randType).equals(DeckTypes.THEMES)) { - tempDeck = DeckgenUtil.getRandomThemeDeck(); - lstEventNames.add("Random theme deck"); - } else if (lstDecktypes.get(randType).equals(DeckTypes.CUSTOM)) { tempDeck = DeckgenUtil.getRandomCustomDeck(); lstEventNames.add(tempDeck.getName()); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java index 9c83cdf97bb..70399f4bb40 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/views/ItemColumn.java @@ -34,8 +34,6 @@ import forge.card.CardRarity; import forge.card.CardRules; import forge.card.ColorSet; import forge.card.mana.ManaCost; -import forge.deck.Deck; -import forge.deck.DeckSection; import forge.game.GameFormat; import forge.gui.CardPreferences; import forge.gui.deckeditor.DeckProxy; @@ -415,11 +413,11 @@ public class ItemColumn extends TableColumn { new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - Deck deck = toDeck(from.getKey()); + DeckProxy deck = toDeck(from.getKey()); if (deck == null) { return -1; } - Iterable all = Singletons.getModel().getFormats().getAllFormatsOfDeck(deck); + Iterable all = deck.getFormats(); int acc = 0; for(GameFormat gf : all) { int ix = gf.getIndex(); @@ -432,38 +430,37 @@ public class ItemColumn extends TableColumn { new Function, Object>() { @Override public Object apply(final Entry from) { - Deck deck = toDeck(from.getKey()); + DeckProxy deck = toDeck(from.getKey()); if (deck == null) { return null; } - Iterable all = Singletons.getModel().getFormats().getAllFormatsOfDeck(deck); - return StringUtils.join(Iterables.transform(all, GameFormat.FN_GET_NAME) , ", "); + return StringUtils.join(Iterables.transform(deck.getFormats(), GameFormat.FN_GET_NAME) , ", "); } }), DECK_MAIN("Main", "Main Deck", 30, 30, 30, SortState.ASC, new IntegerRenderer(), new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return toDeckCount(from.getKey(), DeckSection.Main); + return toDeck(from.getKey()).getMainSize(); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return toDeckCount(from.getKey(), DeckSection.Main); + return toDeck(from.getKey()).getMainSize(); } }), DECK_SIDE("Side", "Sideboard", 30, 30, 30, SortState.ASC, new IntegerRenderer(), new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return toDeckCount(from.getKey(), DeckSection.Sideboard); + return toDeck(from.getKey()).getSideSize(); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return toDeckCount(from.getKey(), DeckSection.Sideboard); + return toDeck(from.getKey()).getSideSize(); } }); @@ -543,15 +540,11 @@ public class ItemColumn extends TableColumn { return ranking; } - private static Deck toDeck(final InventoryItem i) { - return i instanceof Deck ? ((Deck) i) : null; + private static DeckProxy toDeck(final InventoryItem i) { + return i instanceof DeckProxy ? ((DeckProxy) i) : null; } private static ColorSet toDeckColor(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i).getColor() : null; } - private static int toDeckCount(final InventoryItem i, DeckSection section) { - Deck deck = toDeck(i); - return deck != null && deck.has(section) ? deck.get(section).countAll() : -1; - } } }