mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 10:48:00 +00:00
Subfolders for constructed decks work in r/o mode (part 2 of ~3)
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -15193,6 +15193,7 @@ src/main/java/forge/util/package-info.java -text
|
|||||||
src/main/java/forge/util/storage/IStorage.java -text
|
src/main/java/forge/util/storage/IStorage.java -text
|
||||||
src/main/java/forge/util/storage/StorageBase.java -text
|
src/main/java/forge/util/storage/StorageBase.java -text
|
||||||
src/main/java/forge/util/storage/StorageImmediatelySerialized.java svneol=native#text/plain
|
src/main/java/forge/util/storage/StorageImmediatelySerialized.java svneol=native#text/plain
|
||||||
|
src/main/java/forge/util/storage/StorageNestedFolders.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderBase.java -text
|
src/main/java/forge/util/storage/StorageReaderBase.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderFile.java -text
|
src/main/java/forge/util/storage/StorageReaderFile.java -text
|
||||||
src/main/java/forge/util/storage/StorageReaderFileSections.java -text
|
src/main/java/forge/util/storage/StorageReaderFileSections.java -text
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class CardCollections {
|
|||||||
public CardCollections() {
|
public CardCollections() {
|
||||||
StopWatch sw = new StopWatch();
|
StopWatch sw = new StopWatch();
|
||||||
sw.start();
|
sw.start();
|
||||||
this.constructed = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true));
|
this.constructed = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CONSTRUCTED_DIR), true), true);
|
||||||
this.draft = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_DRAFT_DIR)));
|
this.draft = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_DRAFT_DIR)));
|
||||||
this.sealed = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_SEALED_DIR)));
|
this.sealed = new StorageImmediatelySerialized<DeckGroup>(new DeckGroupSerializer(new File(NewConstants.DECK_SEALED_DIR)));
|
||||||
this.cube = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CUBE_DIR)));
|
this.cube = new StorageImmediatelySerialized<Deck>(new DeckSerializer(new File(NewConstants.DECK_CUBE_DIR)));
|
||||||
|
|||||||
@@ -77,6 +77,13 @@ public class Deck extends DeckBase implements Iterable<Entry<DeckSection, CardPo
|
|||||||
getOrCreate(DeckSection.Main);
|
getOrCreate(DeckSection.Main);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.item.InventoryItem#getItemType()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getItemType() {
|
||||||
|
return "Deck";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
|
|||||||
@@ -19,11 +19,13 @@ package forge.deck;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import forge.item.InventoryItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: Write javadoc for this type.
|
* TODO: Write javadoc for this type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class DeckBase implements Serializable, Comparable<DeckBase> {
|
public abstract class DeckBase implements Serializable, Comparable<DeckBase>, InventoryItem {
|
||||||
private static final long serialVersionUID = -7538150536939660052L;
|
private static final long serialVersionUID = -7538150536939660052L;
|
||||||
// gameType is from Constant.GameType, like GameType.Regular
|
// gameType is from Constant.GameType, like GameType.Regular
|
||||||
|
|
||||||
|
|||||||
@@ -135,4 +135,13 @@ public class DeckGroup extends DeckBase {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.item.InventoryItem#getItemType()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getItemType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return "Set of limited mode decks";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,7 +105,16 @@ public class DeckgenUtil {
|
|||||||
* @return {@link forge.deck.Deck}
|
* @return {@link forge.deck.Deck}
|
||||||
*/
|
*/
|
||||||
public static Deck getConstructedDeck(final String selection) {
|
public static Deck getConstructedDeck(final String selection) {
|
||||||
return Singletons.getModel().getDecks().getConstructed().get(selection);
|
IStorage<Deck> path = Singletons.getModel().getDecks().getConstructed();
|
||||||
|
String name = selection;
|
||||||
|
int idxSlash = name.indexOf('/');
|
||||||
|
while( idxSlash > 0 ) {
|
||||||
|
String sf = name.substring(0, idxSlash);
|
||||||
|
path = path.getFolders().get(sf);
|
||||||
|
name = name.substring(idxSlash+1);
|
||||||
|
idxSlash = name.indexOf('/');
|
||||||
|
};
|
||||||
|
return path.get(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Deck getPreconDeck(String selection) {
|
public static Deck getPreconDeck(String selection) {
|
||||||
|
|||||||
@@ -82,6 +82,15 @@ public class CustomLimited extends DeckBase {
|
|||||||
return this.getName();
|
return this.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.item.InventoryItem#getItemType()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getItemType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return "Limited game setup";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the.
|
* Parses the.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ import forge.gui.toolbox.FList;
|
|||||||
import forge.gui.toolbox.FRadioButton;
|
import forge.gui.toolbox.FRadioButton;
|
||||||
import forge.gui.toolbox.FScrollPane;
|
import forge.gui.toolbox.FScrollPane;
|
||||||
import forge.gui.toolbox.JXButtonPanel;
|
import forge.gui.toolbox.JXButtonPanel;
|
||||||
import forge.item.PreconDeck;
|
import forge.item.InventoryItem;
|
||||||
import forge.quest.QuestController;
|
import forge.quest.QuestController;
|
||||||
import forge.quest.QuestEvent;
|
import forge.quest.QuestEvent;
|
||||||
import forge.quest.QuestEventChallenge;
|
import forge.quest.QuestEventChallenge;
|
||||||
@@ -194,8 +194,7 @@ public class FDeckChooser extends JPanel {
|
|||||||
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
|
||||||
final List<String> customNames = new ArrayList<String>();
|
final List<String> customNames = new ArrayList<String>();
|
||||||
final IStorage<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
|
addDecksRecursive(Singletons.getModel().getDecks().getConstructed(), customNames, null);
|
||||||
for (final Deck d : allDecks) { customNames.add(d.getName()); }
|
|
||||||
|
|
||||||
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
|
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
|
||||||
lst.setName(DeckgenUtil.DeckTypes.CUSTOM.toString());
|
lst.setName(DeckgenUtil.DeckTypes.CUSTOM.toString());
|
||||||
@@ -210,14 +209,23 @@ public class FDeckChooser extends JPanel {
|
|||||||
lst.setSelectedIndex(0);
|
lst.setSelectedIndex(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private <T extends InventoryItem> void addDecksRecursive(IStorage<T> node, List<String> customNames, String namePrefix ) {
|
||||||
|
String path = namePrefix == null ? "" : namePrefix + "/";
|
||||||
|
for (final String fn : node.getFolders().getNames() )
|
||||||
|
{
|
||||||
|
IStorage<T> f = node.getFolders().get(fn);
|
||||||
|
addDecksRecursive(f, customNames, path + fn);
|
||||||
|
}
|
||||||
|
for (final T d : node) { customNames.add(path + d.getName()); }
|
||||||
|
}
|
||||||
|
|
||||||
/** Handles all control for "custom" radio button click. */
|
/** Handles all control for "custom" radio button click. */
|
||||||
private void updatePrecons() {
|
private void updatePrecons() {
|
||||||
final JList<String> lst = getLstDecks();
|
final JList<String> lst = getLstDecks();
|
||||||
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
lst.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||||
|
|
||||||
final List<String> customNames = new ArrayList<String>();
|
final List<String> customNames = new ArrayList<String>();
|
||||||
final IStorage<PreconDeck> allDecks = QuestController.getPrecons();
|
addDecksRecursive(QuestController.getPrecons(), customNames, null);
|
||||||
for (final PreconDeck d : allDecks) { customNames.add(d.getName()); }
|
|
||||||
|
|
||||||
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
|
lst.setListData(customNames.toArray(ArrayUtils.EMPTY_STRING_ARRAY));
|
||||||
lst.setName(DeckgenUtil.DeckTypes.PRECON.toString());
|
lst.setName(DeckgenUtil.DeckTypes.PRECON.toString());
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
*/
|
*/
|
||||||
package forge.util.storage;
|
package forge.util.storage;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
import forge.util.IItemReader;
|
||||||
import forge.util.IItemSerializer;
|
import forge.util.IItemSerializer;
|
||||||
|
|
||||||
//reads and writeDeck Deck objects
|
//reads and writeDeck Deck objects
|
||||||
@@ -32,6 +35,15 @@ import forge.util.IItemSerializer;
|
|||||||
public class StorageImmediatelySerialized<T> extends StorageBase<T> {
|
public class StorageImmediatelySerialized<T> extends StorageBase<T> {
|
||||||
|
|
||||||
private final IItemSerializer<T> serializer;
|
private final IItemSerializer<T> serializer;
|
||||||
|
private final IStorage<IStorage<T>> subfolders;
|
||||||
|
|
||||||
|
private final Function<IItemReader<T>, IStorage<T>> nestedFactory = new Function<IItemReader<T>, IStorage<T>>() {
|
||||||
|
@Override
|
||||||
|
public IStorage<T> apply(IItemReader<T> io) {
|
||||||
|
return new StorageImmediatelySerialized<T>((IItemSerializer<T>) io, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Constructor for DeckManager.
|
* Constructor for DeckManager.
|
||||||
@@ -40,8 +52,14 @@ public class StorageImmediatelySerialized<T> extends StorageBase<T> {
|
|||||||
* @param io the io
|
* @param io the io
|
||||||
*/
|
*/
|
||||||
public StorageImmediatelySerialized(final IItemSerializer<T> io) {
|
public StorageImmediatelySerialized(final IItemSerializer<T> io) {
|
||||||
|
this(io, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public StorageImmediatelySerialized(final IItemSerializer<T> io, boolean withSubFolders) {
|
||||||
super(io);
|
super(io);
|
||||||
this.serializer = io;
|
this.serializer = io;
|
||||||
|
subfolders = withSubFolders ? new StorageNestedFolders<T>(io, nestedFactory) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -65,4 +83,12 @@ public class StorageImmediatelySerialized<T> extends StorageBase<T> {
|
|||||||
public final void delete(final String deckName) {
|
public final void delete(final String deckName) {
|
||||||
this.serializer.erase(this.map.remove(deckName));
|
this.serializer.erase(this.map.remove(deckName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see forge.util.storage.StorageBase#getFolders()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public IStorage<IStorage<T>> getFolders() {
|
||||||
|
return subfolders == null ? super.getFolders() : subfolders;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
src/main/java/forge/util/storage/StorageNestedFolders.java
Normal file
36
src/main/java/forge/util/storage/StorageNestedFolders.java
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package forge.util.storage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.NotImplementedException;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
import forge.util.IItemReader;
|
||||||
|
|
||||||
|
|
||||||
|
public class StorageNestedFolders<T> extends StorageBase<IStorage<T>> {
|
||||||
|
|
||||||
|
public StorageNestedFolders(IItemReader<T> io, Function<IItemReader<T>, IStorage<T>> factory) {
|
||||||
|
super(new HashMap<String, IStorage<T>>());
|
||||||
|
for(File sf : io.getSubFolders() )
|
||||||
|
{
|
||||||
|
map.put(sf.getName(), factory.apply(io.getReaderForFolder(sf)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// need code implementations for folder create/delete operations
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(IStorage<T> deck) {
|
||||||
|
// need folder name here!
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete(String deckName) {
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user