Fix switching between Editors

This commit is contained in:
drdev
2013-10-26 21:49:26 +00:00
parent 5ec7f01b7a
commit ae0069652a
25 changed files with 160 additions and 105 deletions

View File

@@ -184,7 +184,7 @@ public enum FControl implements KeyEventDispatcher {
if (!MenuUtil.getUserConfirmation(userPrompt, "Exit Forge", this.game == null)) { //default Yes if no game active
return false;
}
if (!CDeckEditorUI.SINGLETON_INSTANCE.canExit()) {
if (!CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true)) {
return false;
}
return true;
@@ -273,7 +273,9 @@ public enum FControl implements KeyEventDispatcher {
//if (this.currentScreen == screen) { return; }
//give previous screen a chance to perform special switch handling and/or cancel switching away from screen
if (!Singletons.getView().getNavigationBar().canSwitchAway()) { return; }
if (this.currentScreen != screen && !Singletons.getView().getNavigationBar().canSwitch(screen)) {
return;
}
if (this.currentScreen == FScreen.MATCH_SCREEN) { //hide targeting overlay and reset image if was on match screen
SOverlayUtils.hideTargetingOverlay();

View File

@@ -119,7 +119,7 @@ public enum VBazaarUI implements IVTopLevelUI {
* @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen)
*/
@Override
public boolean onSwitching(FScreen screen) {
public boolean onSwitching(FScreen fromScreen, FScreen toScreen) {
return true;
}

View File

@@ -101,9 +101,15 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
CPicture.SINGLETON_INSTANCE.showImage(item);
}
public boolean canExit() {
public boolean canSwitchAway(boolean isClosing) {
if (this.childController != null) {
return this.childController.exit();
if (!this.childController.canSwitchAway(isClosing)) {
return false;
}
this.childController.resetUIChanges();
if (isClosing) {
screenChildControllers.remove(this.childController.getScreen());
}
}
return true;
}
@@ -117,15 +123,14 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
}
/**
* Set controller for current configuration of editor.
*
* @param editor0 &emsp; {@link forge.gui.deckeditor.controllers.ACEditorBase}<?, ?>
* Set controller for a given editor screen.
*/
public void setCurrentEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> editor0) {
if (this.childController == editor0) { return; }
this.childController = editor0;
screenChildControllers.put(Singletons.getControl().getCurrentScreen(), editor0);
updateController();
public void setEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
FScreen screen = childController0.getScreen();
screenChildControllers.put(screen, childController0);
if (screen == Singletons.getControl().getCurrentScreen()) {
setCurrentEditorController(childController0);
}
}
private interface _MoveAction {
@@ -298,9 +303,11 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
}
/**
* Updates UI and listeners for current controller.
* Set current editor controller
*/
private void updateController() {
private void setCurrentEditorController(ACEditorBase<? extends InventoryItem, ? extends DeckBase> childController0) {
this.childController = childController0;
if (childController == null) { return; }
final ItemManager<? extends InventoryItem> catView = childController.getCatalogManager();
@@ -588,7 +595,7 @@ public enum CDeckEditorUI implements ICDoc, IMenuProvider {
setCurrentEditorController(screenChildController);
}
else if (screen == FScreen.DECK_EDITOR_CONSTRUCTED) {
setCurrentEditorController(new CEditorConstructed()); //ensure Constructed deck editor controller initialized
setEditorController(new CEditorConstructed()); //ensure Constructed deck editor controller initialized
}
}

View File

@@ -45,8 +45,9 @@ public enum VDeckEditorUI implements IVTopLevelUI {
* @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen)
*/
@Override
public boolean onSwitching(FScreen screen) {
return CDeckEditorUI.SINGLETON_INSTANCE.canExit(); //ensure deck saved before switching away
public boolean onSwitching(FScreen fromScreen, FScreen toScreen) {
//ensure deck saved before switching
return CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(false);
}
/* (non-Javadoc)
@@ -59,6 +60,6 @@ public enum VDeckEditorUI implements IVTopLevelUI {
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
return false;
}
return CDeckEditorUI.SINGLETON_INSTANCE.canExit();
return CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true);
}
}

View File

@@ -21,6 +21,7 @@ import javax.swing.SwingUtilities;
import forge.deck.DeckBase;
import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen;
import forge.gui.framework.ICDoc;
import forge.gui.framework.IVDoc;
import forge.gui.framework.SRearrangingUtil;
@@ -59,9 +60,18 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
}
public boolean listenersHooked;
private final FScreen screen;
private ItemManager<TItem> catalogManager;
private ItemManager<TItem> deckManager;
protected ACEditorBase(FScreen screen0) {
this.screen = screen0;
}
public FScreen getScreen() {
return this.screen;
}
/**
* Operation to add one of selected card to current deck.
*/
@@ -88,18 +98,22 @@ public abstract class ACEditorBase<TItem extends InventoryItem, TModel extends D
public abstract DeckController<TModel> getDeckController();
/**
* Called when an editor wants to exit. Should confirm save options,
* update next UI screen, etc.
* Called when switching away from or closing the editor wants to exit. Should confirm save options.
*
* @return boolean &emsp; true if safe to exit
*/
public abstract boolean exit();
public abstract boolean canSwitchAway(boolean isClosing);
/**
* Resets and initializes the current editor.
*/
public abstract void update();
/**
* Reset UI changes made in update
*/
public abstract void resetUIChanges();
/**
* Gets the ItemManager holding the cards in the current deck.
*

View File

@@ -78,7 +78,7 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
* all cards are available.
*/
public CEditorCommander() {
super();
super(FScreen.DECK_EDITOR_COMMANDER);
allSections.add(DeckSection.Main);
allSections.add(DeckSection.Sideboard);
allSections.add(DeckSection.Commander);
@@ -208,15 +208,18 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
if (!SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_COMMANDER))
{
return false;
}
public boolean canSwitchAway(boolean isClosing) {
return SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_COMMANDER);
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
@@ -224,8 +227,6 @@ public final class CEditorCommander extends ACEditorBase<PaperCard, Deck> {
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
return true;
}
/**

View File

@@ -75,7 +75,7 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
* all cards are available.
*/
public CEditorConstructed() {
super();
super(FScreen.DECK_EDITOR_CONSTRUCTED);
allSections.add(DeckSection.Main);
allSections.add(DeckSection.Sideboard);
@@ -308,10 +308,17 @@ public final class CEditorConstructed extends ACEditorBase<PaperCard, Deck> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
public boolean canSwitchAway(boolean isClosing) {
return SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_CONSTRUCTED);
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
}
}

View File

@@ -64,6 +64,8 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
* Updates the deck editor UI as necessary draft selection mode.
*/
public CEditorDraftingProcess() {
super(FScreen.DRAFTING_PROCESS);
final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false);
final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), false);
@@ -271,10 +273,18 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
public boolean canSwitchAway(boolean isClosing) {
return true;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
CSubmenuDraft.SINGLETON_INSTANCE.update();
//Re-rename buttons
@@ -297,7 +307,5 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
// set catalog table back to free-selection mode
getCatalogManager().getTable().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
return true;
}
}

View File

@@ -49,7 +49,6 @@ import forge.util.storage.IStorage;
public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
private final DeckController<DeckGroup> controller;
private final FScreen screen;
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
@@ -61,7 +60,7 @@ public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
* @param deckMap0 &emsp; {@link forge.deck.DeckGroup}<{@link forge.util.storage.IStorage}>
*/
public CEditorLimited(final IStorage<DeckGroup> deckMap0, FScreen screen0) {
this.screen = screen0;
super(screen0);
final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false);
final CardManager deckManager = new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), false);
@@ -180,26 +179,27 @@ public final class CEditorLimited extends ACEditorBase<PaperCard, DeckGroup> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
final boolean okToExit = SEditorIO.confirmSaveChanges(this.screen);
public boolean canSwitchAway(boolean isClosing) {
return SEditorIO.confirmSaveChanges(getScreen());
}
if (okToExit) {
CSubmenuDraft.SINGLETON_INSTANCE.update();
CSubmenuSealed.SINGLETON_INSTANCE.update();
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
CSubmenuDraft.SINGLETON_INSTANCE.update();
CSubmenuSealed.SINGLETON_INSTANCE.update();
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
return okToExit;
}
}

View File

@@ -94,6 +94,8 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
* @param questData0 &emsp; {@link forge.quest.QuestController}
*/
public CEditorQuest(final QuestController questData0) {
super(FScreen.DECK_EDITOR_QUEST);
this.questData = questData0;
final CardManager catalogManager = new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false);
@@ -302,24 +304,30 @@ public final class CEditorQuest extends ACEditorBase<PaperCard, Deck> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
final boolean okToExit = SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST);
if (okToExit) {
public boolean canSwitchAway(boolean isClosing) {
if (SEditorIO.confirmSaveChanges(FScreen.DECK_EDITOR_QUEST)) {
Singletons.getModel().getQuest().save();
CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
return true;
}
return false;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
}
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
return okToExit;
}
/**

View File

@@ -45,6 +45,7 @@ import forge.gui.deckeditor.views.VCurrentDeck;
import forge.gui.deckeditor.views.VDeckgen;
import forge.gui.deckeditor.views.VProbabilities;
import forge.gui.framework.DragCell;
import forge.gui.framework.FScreen;
import forge.gui.home.quest.CSubmenuQuestDecks;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
@@ -125,6 +126,8 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
* a {@link forge.quest.data.QuestData} object.
*/
public CEditorQuestCardShop(final QuestController qd) {
super(FScreen.QUEST_CARD_SHOP);
this.questData = qd;
final InventoryItemManager catalogManager = new InventoryItemManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), false);
@@ -536,15 +539,23 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
public boolean canSwitchAway(boolean isClosing) {
Singletons.getModel().getQuest().save();
return true;
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
if (showingFullCatalog) {
toggleFullCatalog();
}
Singletons.getModel().getQuest().save();
CSubmenuQuestDecks.SINGLETON_INSTANCE.update();
// undo Card Shop Specifics
@@ -575,7 +586,5 @@ public final class CEditorQuestCardShop extends ACEditorBase<InventoryItem, Deck
if (probsParent != null) {
probsParent.addDoc(VProbabilities.SINGLETON_INSTANCE);
}
return true;
}
}

View File

@@ -55,7 +55,6 @@ import forge.util.storage.IStorage;
*/
public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
private final DeckController<Deck> controller;
private final FScreen screen;
private DragCell allDecksParent = null;
private DragCell deckGenParent = null;
private final Predicate<PaperCard> cardPoolCondition;
@@ -67,10 +66,9 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
* all cards are available.
*/
public CEditorVariant(final IStorage<Deck> folder, final Predicate<PaperCard> poolCondition, final FScreen screen0) {
super();
super(screen0);
this.cardPoolCondition = poolCondition;
this.screen = screen0;
this.setCatalogManager(new CardManager(VCardCatalog.SINGLETON_INSTANCE.getStatLabels(), true));
this.setDeckManager(new CardManager(VCurrentDeck.SINGLETON_INSTANCE.getStatLabels(), true));
@@ -169,15 +167,18 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#exit()
* @see forge.gui.deckeditor.controllers.ACEditorBase#canSwitchAway()
*/
@Override
public boolean exit() {
if (!SEditorIO.confirmSaveChanges(this.screen))
{
return false;
}
public boolean canSwitchAway(boolean isClosing) {
return SEditorIO.confirmSaveChanges(getScreen());
}
/* (non-Javadoc)
* @see forge.gui.deckeditor.controllers.ACEditorBase#resetUIChanges()
*/
@Override
public void resetUIChanges() {
//Re-add tabs
if (deckGenParent != null) {
deckGenParent.addDoc(VDeckgen.SINGLETON_INSTANCE);
@@ -185,7 +186,5 @@ public final class CEditorVariant extends ACEditorBase<PaperCard, Deck> {
if (allDecksParent != null) {
allDecksParent.addDoc(VAllDecks.SINGLETON_INSTANCE);
}
return true;
}
}

View File

@@ -168,8 +168,8 @@ public enum FScreen {
return closeButtonTooltip;
}
public boolean onSwitching() {
return view.onSwitching(this);
public boolean onSwitching(FScreen toScreen) {
return view.onSwitching(this, toScreen);
}
public boolean onClosing() {

View File

@@ -31,7 +31,7 @@ public interface IVTopLevelUI {
* Fires when this view's tab is being switched away from.
*
* @return true to allow switching away from tab, false otherwise */
boolean onSwitching(FScreen screen);
boolean onSwitching(FScreen fromScreen, FScreen toScreen);
/**
* Fires when this view's tab is closing.

View File

@@ -326,7 +326,7 @@ public enum VHomeUI implements IVTopLevelUI {
* @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen)
*/
@Override
public boolean onSwitching(FScreen screen) {
public boolean onSwitching(FScreen fromScreen, FScreen toScreen) {
return true;
}

View File

@@ -52,7 +52,7 @@ public enum CSubmenuQuestDecks implements ICDoc {
return;
}
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_QUEST);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(new CEditorQuest(Singletons.getModel().getQuest()));
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorQuest(Singletons.getModel().getQuest()));
}
});
}

View File

@@ -254,7 +254,7 @@ public class SSubmenuQuestUtil {
return;
}
Singletons.getControl().setCurrentScreen(FScreen.QUEST_CARD_SHOP);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(
new CEditorQuestCardShop(Singletons.getModel().getQuest()));
}

View File

@@ -160,7 +160,7 @@ public enum CSubmenuDraft implements ICDoc {
draft.showGui(new BoosterDraft(o));
Singletons.getControl().setCurrentScreen(FScreen.DRAFTING_PROCESS);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(draft);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(draft);
}
/* (non-Javadoc)

View File

@@ -208,7 +208,7 @@ public enum CSubmenuSealed implements ICDoc {
Singletons.getModel().getDecks().getSealed(), FScreen.DECK_EDITOR_SEALED);
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_SEALED);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(editor);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(editor);
editor.getDeckController().setModel((T) sealed);
}

View File

@@ -100,7 +100,7 @@ public enum CSubmenuArchenemy implements ICDoc {
};
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_ARCHENEMY);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(
new CEditorVariant(Singletons.getModel().getDecks().getScheme(), predSchemes, FScreen.DECK_EDITOR_ARCHENEMY));
}
});

View File

@@ -95,8 +95,7 @@ public enum CSubmenuCommander implements ICDoc {
@Override
public void run() {
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_COMMANDER);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(
new CEditorCommander());
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(new CEditorCommander());
}
});
}

View File

@@ -101,7 +101,7 @@ public enum CSubmenuPlanechase implements ICDoc {
};
Singletons.getControl().setCurrentScreen(FScreen.DECK_EDITOR_PLANECHASE);
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(
new CEditorVariant(Singletons.getModel().getDecks().getPlane(), predPlanes, FScreen.DECK_EDITOR_PLANECHASE));
}
});

View File

@@ -169,7 +169,7 @@ public enum VMatchUI implements IVTopLevelUI {
* @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen)
*/
@Override
public boolean onSwitching(FScreen screen) {
public boolean onSwitching(FScreen fromScreen, FScreen toScreen) {
return true;
}

View File

@@ -461,7 +461,7 @@ public class DeckLister extends JPanel implements ILocalRepaint {
Singletons.getControl().setCurrentScreen(screen);
if (editorCtrl != null) {
CDeckEditorUI.SINGLETON_INSTANCE.setCurrentEditorController(editorCtrl);
CDeckEditorUI.SINGLETON_INSTANCE.setEditorController(editorCtrl);
}
CDeckEditorUI.SINGLETON_INSTANCE.getCurrentEditorController().getDeckController().load(d0.getName());
}

View File

@@ -123,8 +123,8 @@ public class FNavigationBar extends FTitleBarBase {
return null;
}
public boolean canSwitchAway() {
return (selectedTab == null || selectedTab.screen.onSwitching());
public boolean canSwitch(FScreen toScreen) {
return (selectedTab == null || selectedTab.screen.onSwitching(toScreen));
}
public void updateSelectedTab() {