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 c6c13852a17..ccc1fca0e6a 100644 --- a/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java +++ b/forge-gui/src/main/java/forge/gui/deckchooser/FDeckChooser.java @@ -239,6 +239,7 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { } else { removeAll(); + restoreSavedState(); //ensure decks refreshed and state restored in case any deleted or added since last loaded } this.setLayout(new MigLayout("insets 0, gap 0")); decksComboBox.addTo(this, "w 100%, h 30px!, gapbottom 5px, spanx 2, wrap"); diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java b/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java index 856729cecc4..4fff2d5d5e5 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/SEditorIO.java @@ -3,7 +3,9 @@ package forge.gui.deckeditor; import org.apache.commons.lang3.StringUtils; import forge.Singletons; +import forge.gui.deckeditor.controllers.CAllDecks; import forge.gui.deckeditor.controllers.DeckController; +import forge.gui.deckeditor.views.VAllDecks; import forge.gui.deckeditor.views.VCurrentDeck; import forge.gui.framework.FScreen; import forge.gui.toolbox.FOptionPane; @@ -14,7 +16,6 @@ import forge.gui.toolbox.FOptionPane; *

(S at beginning of class name denotes a static factory.) */ public class SEditorIO { - /** * Saves the current deck, with various prompts depending on the * current save environment. @@ -34,18 +35,28 @@ public class SEditorIO { // Confirm if overwrite else if (controller.fileExists(name)) { boolean confirmResult = true; - if ( !StringUtils.equals(name, controller.getModelName()) ) { // prompt only if name was changed + if (!StringUtils.equals(name, controller.getModelName())) { // prompt only if name was changed confirmResult = FOptionPane.showConfirmDialog( "There is already a deck named '" + name + "'. Overwrite?", "Overwrite Deck?"); } - if (confirmResult) { controller.save(); } + if (confirmResult) { + controller.save(); + DeckProxy deck = VAllDecks.SINGLETON_INSTANCE.getLstDecks().stringToItem(controller.getModelPath() + "/" + name); + if (deck != null) { //reload DeckProxy to pull changes into deck list + deck.reloadFromStorage(); + VAllDecks.SINGLETON_INSTANCE.getLstDecks().setSelectedItem(deck); + VAllDecks.SINGLETON_INSTANCE.getLstDecks().repaint(); + } + } } // Confirm if a new deck will be created else if (FOptionPane.showConfirmDialog("This will create a new deck named '" + name + "'. Continue?", "Create Deck?")) { controller.saveAs(name); + CAllDecks.SINGLETON_INSTANCE.refresh(); //pull new deck into deck list and select it + VAllDecks.SINGLETON_INSTANCE.getLstDecks().setSelectedString(controller.getModelPath() + "/" + name); } return true; 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 5ebc3fb3956..46399e45793 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 @@ -31,6 +31,10 @@ public enum CAllDecks implements ICDoc { */ @Override public void initialize() { + refresh(); + } + + public void refresh() { VAllDecks.SINGLETON_INSTANCE.getLstDecks().setPool(DeckProxy.getAllConstructedDecks(Singletons.getModel().getDecks().getConstructed())); } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java index 3e9d5ced8a2..12ff091a5f0 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CCurrentDeck.java @@ -1,6 +1,8 @@ package forge.gui.deckeditor.controllers; import java.awt.Dialog.ModalityType; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.io.File; import javax.swing.JFileChooser; @@ -111,6 +113,14 @@ public enum CCurrentDeck implements ICDoc { importDeck(); } }); + VCurrentDeck.SINGLETON_INSTANCE.getTxfTitle().addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (Character.isLetterOrDigit(e.getKeyChar())) { + CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().notifyModelChanged(); + } + } + }); } /** diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/DeckController.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/DeckController.java index bbf78a8f14e..f73ea953c85 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/DeckController.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/DeckController.java @@ -37,6 +37,7 @@ public class DeckController { private boolean modelInStorage; private final IStorage rootFolder; private IStorage currentFolder; + private String modelPath; private final ACEditorBase view; private final Supplier newModelCreator; @@ -54,6 +55,7 @@ public class DeckController { this.model = null; this.saved = true; this.modelInStorage = false; + this.modelPath = ""; this.newModelCreator = newModelCreator0; } @@ -66,6 +68,10 @@ public class DeckController { return this.model; } + public String getModelPath() { + return this.modelPath; + } + /** * Sets the model. * @@ -82,7 +88,7 @@ public class DeckController { CProbabilities.SINGLETON_INSTANCE.update(); if (this.isModelInSyncWithFolder()) { - _setSaved(true); + this.setSaved(true); } else { this.notifyModelChanged(); @@ -119,10 +125,12 @@ public class DeckController { * Notify model changed. */ public void notifyModelChanged() { - _setSaved(false); + if (saved) { + this.setSaved(false); + } } - private void _setSaved(boolean val) { + private void setSaved(boolean val) { saved = val; updateCaptions(); } @@ -147,6 +155,7 @@ public class DeckController { else { currentFolder = rootFolder.tryGetFolder(path); } + modelPath = path; load(name); } @@ -155,13 +164,14 @@ public class DeckController { * * @param name the name */ - @SuppressWarnings("unchecked") private void load(final String name) { + @SuppressWarnings("unchecked") + private void load(final String name) { T newModel = this.currentFolder.get(name); if (newModel != null) { this.setModel((T) newModel.copyTo(name), true); } else { - _setSaved(true); + this.setSaved(true); } } @@ -174,11 +184,10 @@ public class DeckController { return; } - this.currentFolder.add(this.model); - // copy to new instance which will be edited and left if unsaved - this.model = (T)this.model.copyTo(this.model.getName()); + // copy to new instance before adding to current folder so further changes are auto-saved + this.currentFolder.add((T) this.model.copyTo(this.model.getName())); this.modelInStorage = true; - _setSaved(true); + this.setSaved(true); } /** @@ -191,6 +200,7 @@ public class DeckController { this.model = (T)this.model.copyTo(name0); this.modelInStorage = false; this.save(); + this.view.resetTables(); //ensure pool updated in CCurrentDeck } /** @@ -238,7 +248,7 @@ public class DeckController { */ public void newModel() { this.model = this.newModelCreator.get(); - _setSaved(true); + this.setSaved(true); this.view.resetTables(); } diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/views/VAllDecks.java b/forge-gui/src/main/java/forge/gui/deckeditor/views/VAllDecks.java index f6ed4fd51fc..7685c989979 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/views/VAllDecks.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/views/VAllDecks.java @@ -79,6 +79,8 @@ public enum VAllDecks implements IVDoc { */ @Override public void populate() { + CAllDecks.SINGLETON_INSTANCE.refresh(); //ensure decks refreshed in case any deleted or added since last loaded + JPanel parentBody = parentCell.getBody(); parentBody.setLayout(new MigLayout("insets 5, gap 0, wrap, hidemode 3")); parentBody.add(new ItemManagerContainer(lstDecks), "push, grow"); diff --git a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java index bf04c69ce26..cf584467c21 100644 --- a/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java +++ b/forge-gui/src/main/java/forge/gui/toolbox/itemmanager/ItemManager.java @@ -397,7 +397,6 @@ public abstract class ItemManager extends JPanel { this.setPool(ItemPool.createFrom(items, this.genericType), false); } - /** * * Sets the item pool. @@ -420,7 +419,7 @@ public abstract class ItemManager extends JPanel { * @param pool0 * @param infinite */ - protected void setPoolImpl(final ItemPool pool0, boolean infinite) { + private void setPoolImpl(final ItemPool pool0, boolean infinite) { this.model.clear(); this.pool = pool0; this.model.addItems(this.pool); @@ -506,6 +505,35 @@ public abstract class ItemManager extends JPanel { return this.table.setSelectedItems(items); } + /** + * + * stringToItem. + * + * @param str - String to get item corresponding to + */ + public T stringToItem(String str) { + for (Entry itemEntry : this.pool) { + if (itemEntry.getKey().toString().equals(str)) { + return itemEntry.getKey(); + } + } + return null; + } + + /** + * + * setSelectedString. + * + * @param str - String to select + */ + public boolean setSelectedString(String str) { + T item = stringToItem(str); + if (item != null) { + return this.setSelectedItem(item); + } + return false; + } + /** * * setSelectedStrings. @@ -514,12 +542,10 @@ public abstract class ItemManager extends JPanel { */ public boolean setSelectedStrings(Iterable strings) { List items = new ArrayList(); - for (String itemName : strings) { - for (Entry itemEntry : this.pool) { - if (itemEntry.getKey().toString().equals(itemName)) { - items.add(itemEntry.getKey()); - break; - } + for (String str : strings) { + T item = stringToItem(str); + if (item != null) { + items.add(item); } } return this.setSelectedItems(items);