Refactor how overlays are shown and hidden

This commit is contained in:
drdev
2014-03-19 23:56:02 +00:00
parent 93c02e9425
commit 2c3d96228c
15 changed files with 118 additions and 75 deletions

2
.gitattributes vendored
View File

@@ -16146,6 +16146,7 @@ forge-m-base/src/forge/screens/sealed/SealedScreen.java -text
forge-m-base/src/forge/screens/settings/SettingsScreen.java -text
forge-m-base/src/forge/toolbox/FButton.java -text
forge-m-base/src/forge/toolbox/FCardPanel.java -text
forge-m-base/src/forge/toolbox/FCardZoom.java -text
forge-m-base/src/forge/toolbox/FContainer.java -text
forge-m-base/src/forge/toolbox/FDisplayObject.java -text
forge-m-base/src/forge/toolbox/FFileChooser.java -text
@@ -16160,7 +16161,6 @@ forge-m-base/src/forge/toolbox/FScrollPane.java -text
forge-m-base/src/forge/toolbox/FTextArea.java -text
forge-m-base/src/forge/toolbox/GuiChoose.java -text
forge-m-base/src/forge/toolbox/GuiDialog.java -text
forge-m-base/src/forge/toolbox/VCardZoom.java -text
forge-m-base/src/forge/utils/Constants.java -text
forge-m-base/src/forge/utils/Evaluator.java -text
forge-m-base/src/forge/utils/ForgePreferences.java -text

View File

@@ -389,18 +389,17 @@ public class Combat {
}
}
Collection<Card> toRemove = Lists.newArrayList();
for(Entry<AttackingBand, Card> be : blockedBands.entries()) {
Card blocker = be.getValue();
if ( !blocker.isInPlay() || !blocker.isCreature() ) {
missingCombatants.add(blocker);
}
}
for (Card c : missingCombatants)
for (Card c : missingCombatants) {
removeFromCombat(c);
}
}
// Call this method right after turn-based action of declare blockers has been performed
public final void fireTriggersForUnblockedAttackers() {
for(AttackingBand ab : attackedByBands.values()) {

View File

@@ -32,6 +32,7 @@ import forge.screens.home.HomeScreen;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FGestureAdapter;
import forge.toolbox.FOverlay;
public class Forge implements ApplicationListener {
private static Forge game;
@@ -134,6 +135,10 @@ public class Forge implements ApplicationListener {
batch.begin();
Graphics g = new Graphics();
screen.draw(g);
for (FOverlay overlay : FOverlay.getOverlays()) {
overlay.setSize(screenWidth, screenHeight); //update overlay sizes as they're rendered
overlay.draw(g);
}
batch.end();
}
@@ -160,6 +165,11 @@ public class Forge implements ApplicationListener {
@Override
public void dispose () {
if (currentScreen != null) {
FOverlay overlay = FOverlay.getTopOverlay();
while (overlay != null) {
overlay.hide();
overlay = FOverlay.getTopOverlay();
}
currentScreen.onClose(false);
currentScreen = null;
}
@@ -175,7 +185,13 @@ public class Forge implements ApplicationListener {
public boolean touchDown(int x, int y, int pointer, int button) {
potentialListeners.clear();
if (currentScreen != null) { //base potential listeners on object containing touch down point
currentScreen.buildTouchListeners(x, y, potentialListeners);
FOverlay overlay = FOverlay.getTopOverlay();
if (overlay != null) { //let top overlay handle gestures if any is open
overlay.buildTouchListeners(x, y, potentialListeners);
}
else {
currentScreen.buildTouchListeners(x, y, potentialListeners);
}
}
return super.touchDown(x, y, pointer, button);
}

View File

@@ -43,6 +43,7 @@ import forge.screens.match.views.VAssignDamage;
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
import forge.screens.match.views.VPlayerPanel;
import forge.toolbox.FCardPanel;
import forge.toolbox.FCardZoom;
import forge.toolbox.FOptionPane;
import forge.utils.ForgePreferences.FPref;
@@ -229,10 +230,9 @@ public class FControl {
}
public static void showMessage(final String s0) {
if (view.getCardZoom().isVisible() &&
view.getCardZoom().getPrompt().getMessage().equals(view.getPrompt().getMessage())) {
if (FCardZoom.isOpen() && FCardZoom.getMessage().equals(view.getPrompt().getMessage())) {
//update zoom view's prompt message if it's shared with main view's prompt's message
view.getCardZoom().getPrompt().setMessage(s0);
FCardZoom.setMessage(s0);
}
view.getPrompt().setMessage(s0);
}

View File

@@ -14,6 +14,7 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.net.FServer;
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
import forge.screens.match.winlose.ViewWinLose;
import forge.toolbox.GuiChoose;
import forge.util.Lang;
import forge.util.maps.MapOfLists;
@@ -136,8 +137,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
FThreads.invokeInEdtNowOrLater(new Runnable() {
@Override
public void run() {
/*new ViewWinLose(FControl.getGame());
SOverlayUtils.showOverlay();*/
new ViewWinLose(FControl.getGame()).setVisible(true);
}
});
return null;

View File

@@ -10,7 +10,6 @@ import forge.screens.match.views.VAvatar;
import forge.screens.match.views.VHeader;
import forge.screens.match.views.VPlayerPanel;
import forge.screens.match.views.VPrompt;
import forge.toolbox.VCardZoom;
import forge.Forge.Graphics;
import forge.assets.FSkinColor;
import forge.assets.FSkinTexture;
@@ -24,7 +23,6 @@ public class MatchScreen extends FScreen {
private final Map<Player, VPlayerPanel> playerPanels = new HashMap<Player, VPlayerPanel>();
private final VHeader header;
private final VPrompt prompt;
private final VCardZoom cardZoom;
private VPlayerPanel bottomPlayerPanel, topPlayerPanel;
@@ -54,8 +52,6 @@ public class MatchScreen extends FScreen {
}));
header = add(new VHeader(this)); //add header just before zoom so drop downs appear on top
cardZoom = add(new VCardZoom());
}
public void updatePlayers() {
@@ -82,10 +78,6 @@ public class MatchScreen extends FScreen {
return header;
}
public VCardZoom getCardZoom() {
return cardZoom;
}
public VPlayerPanel getTopPlayerPanel() {
return topPlayerPanel;
}
@@ -157,7 +149,6 @@ public class MatchScreen extends FScreen {
topPlayerPanel.setBounds(0, startY, width, topPlayerPanelHeight);
bottomPlayerPanel.setBounds(0, height - VPrompt.HEIGHT - bottomPlayerPanelHeight, width, bottomPlayerPanelHeight);
prompt.setBounds(0, height - VPrompt.HEIGHT, width, VPrompt.HEIGHT);
cardZoom.setBounds(0, 0, width, height);
header.setDropDownHeight(topPlayerPanel.getBottom() - header.getHeight()); //make header drop downs go to bottom of top player panel
}
}

View File

@@ -30,7 +30,8 @@ import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.screens.match.FControl;
import forge.screens.match.events.UiEventAttackerDeclared;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom;
import forge.toolbox.FCardZoom.ZoomController;
import java.util.ArrayList;
import java.util.List;
@@ -143,7 +144,7 @@ public class InputAttack extends InputSyncronizedBase {
/** {@inheritDoc} */
@Override
protected final void onCardSelected(final Card card, final List<Card> orderedCardOptions) {
FControl.getView().getCardZoom().show(FControl.getView().getPrompt().getMessage(),
FCardZoom.show(FControl.getView().getPrompt().getMessage(),
card, orderedCardOptions, new ZoomController<Option>() {
@Override
public List<Option> getOptions(final Card card) {

View File

@@ -25,7 +25,8 @@ import forge.game.phase.PhaseHandler;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.screens.match.FControl;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom;
import forge.toolbox.FCardZoom.ZoomController;
/**
* <p>
@@ -41,7 +42,7 @@ public abstract class InputBase implements java.io.Serializable, Input {
private boolean finished = false;
protected final boolean isFinished() { return finished; }
protected final void setFinished() {
FControl.getView().getCardZoom().hide(); //ensure zoom hidden when input finished
FCardZoom.hideZoom(); //ensure zoom hidden when input finished
finished = true;
}
@@ -83,7 +84,7 @@ public abstract class InputBase implements java.io.Serializable, Input {
protected void onCardSelected(final Card card, final List<Card> orderedCardOptions) {
//for base input, just show zoom view with no options
FControl.getView().getCardZoom().show(FControl.getView().getPrompt().getMessage(),
FCardZoom.show(FControl.getView().getPrompt().getMessage(),
card, orderedCardOptions, new ZoomController<Object>() {
@Override
public List<Object> getOptions(Card card) {

View File

@@ -27,8 +27,9 @@ import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.screens.match.FControl;
import forge.screens.match.events.UiEventBlockerAssigned;
import forge.toolbox.FCardZoom;
import forge.toolbox.FOptionPane;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom.ZoomController;
/**
* <p>
@@ -118,7 +119,7 @@ public class InputBlock extends InputSyncronizedBase {
/** {@inheritDoc} */
@Override
public final void onCardSelected(final Card card, final List<Card> orderedCardOptions) {
FControl.getView().getCardZoom().show(FControl.getView().getPrompt().getMessage(),
FCardZoom.show(FControl.getView().getPrompt().getMessage(),
card, orderedCardOptions, new ZoomController<Option>() {
@Override
public List<Option> getOptions(final Card card) {

View File

@@ -22,8 +22,9 @@ import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.screens.match.FControl;
import forge.toolbox.FCardZoom;
import forge.toolbox.GuiDialog;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom.ZoomController;
import forge.util.Lang;
import forge.util.ThreadUtil;
@@ -114,7 +115,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase {
protected void onCardSelected(final Card card, final List<Card> orderedCardOptions) { // the only place that would cause troubles - input is supposed only to confirm, not to fire abilities
if (cardSelectLocked) { return; }
FControl.getView().getCardZoom().show(FControl.getView().getPrompt().getMessage(),
FCardZoom.show(FControl.getView().getPrompt().getMessage(),
card, orderedCardOptions, new ZoomController<String>() {
@Override
public List<String> getOptions(final Card card) {

View File

@@ -20,8 +20,8 @@ package forge.screens.match.input;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.screens.match.FControl;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom;
import forge.toolbox.FCardZoom.ZoomController;
import java.util.List;
@@ -63,7 +63,7 @@ public class InputPassPriority extends InputSyncronizedBase {
@Override
protected void onCardSelected(final Card card, final List<Card> orderedCardOptions) {
FControl.getView().getCardZoom().show("Select a spell/ability", card, orderedCardOptions, new ZoomController<SpellAbility>() {
FCardZoom.show("Select a spell/ability", card, orderedCardOptions, new ZoomController<SpellAbility>() {
@Override
public List<SpellAbility> getOptions(final Card card) {
return card.getAllPossibleAbilities(player, true);

View File

@@ -17,7 +17,8 @@ import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.player.HumanPlay;
import forge.screens.match.FControl;
import forge.toolbox.VCardZoom.ZoomController;
import forge.toolbox.FCardZoom;
import forge.toolbox.FCardZoom.ZoomController;
import forge.utils.Evaluator;
import org.apache.commons.lang3.StringUtils;
@@ -54,7 +55,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
return;
}
FControl.getView().getCardZoom().show(FControl.getView().getPrompt().getMessage(),
FCardZoom.show(FControl.getView().getPrompt().getMessage(),
card, orderedCardOptions, new ZoomController<SpellAbility>() {
private byte colorCanUse, colorNeeded;

View File

@@ -1,6 +1,5 @@
package forge.screens.match.winlose;
import forge.Forge;
import forge.game.Game;
import forge.game.Match;
import forge.model.FModel;
@@ -73,7 +72,6 @@ public class ControlWinLose {
// Reset other stuff
saveOptions();
FControl.endCurrentGame();
Forge.back();
view.hide();
}

View File

@@ -14,10 +14,65 @@ import forge.game.card.Card;
import forge.screens.match.views.VPrompt;
import forge.toolbox.FList.ListItemRenderer;
public class VCardZoom extends FOverlay {
public class FCardZoom extends FOverlay {
private static final FSkinColor BACK_COLOR = FSkinColor.get(Colors.CLR_THEME).alphaColor(0.9f);
private static final float LIST_OPTION_HEIGHT = VPrompt.HEIGHT;
private static final float CARD_DETAILS_HEIGHT = VPrompt.HEIGHT * 2f;
private static final FCardZoom cardZoom = new FCardZoom();
public static abstract class ZoomController<T> {
public abstract List<T> getOptions(final Card card);
public abstract boolean selectOption(final Card card, final T option);
}
public static <T> void show(String message0, final Card card0, final List<Card> orderedCards0, ZoomController<?> controller0) {
if (cardZoom.isVisible()) { return; } //don't support showing if already shown
if (orderedCards0.isEmpty()) {
return;
}
cardZoom.prompt.setMessage(message0);
cardZoom.orderedCards = orderedCards0;
cardZoom.controller = controller0;
int index = orderedCards0.indexOf(card0);
if (index == -1) {
index = 0;
}
cardZoom.setSelectedIndex(index);
if (showTask.isScheduled()) { //select first option without showing zoom if called a second time in quick succession
showTask.cancel();
cardZoom.selectFirstOption();
}
else { //delay showing briefly to give time for a double-tap to auto-select the first ability
Timer.schedule(showTask, FGestureAdapter.DOUBLE_TAP_INTERVAL);
}
}
private static final Task showTask = new Task() {
@Override
public void run () {
cardZoom.show();
}
};
public static boolean isOpen() {
return cardZoom.isVisible();
}
public static String getMessage() {
return cardZoom.getPrompt().getMessage();
}
public static void setMessage(String message0) {
cardZoom.getPrompt().setMessage(message0);
}
public static void hideZoom() {
cardZoom.hide();
}
private final CardSlider slider;
private final FList<Object> optionList;
@@ -29,7 +84,7 @@ public class VCardZoom extends FOverlay {
@SuppressWarnings("rawtypes")
private ZoomController controller;
public VCardZoom() {
private FCardZoom() {
slider = add(new CardSlider());
optionList = add(new FList<Object>() {
@Override
@@ -81,42 +136,7 @@ public class VCardZoom extends FOverlay {
prompt.getBtnCancel().setEnabled(false);
}
public static abstract class ZoomController<T> {
public abstract List<T> getOptions(final Card card);
public abstract boolean selectOption(final Card card, final T option);
}
public <T> void show(String message0, final Card card0, final List<Card> orderedCards0, ZoomController<?> controller0) {
if (orderedCards0.isEmpty()) {
return;
}
prompt.setMessage(message0);
orderedCards = orderedCards0;
controller = controller0;
int index = orderedCards.indexOf(card0);
if (index == -1) {
index = 0;
}
setSelectedIndex(index);
if (showTask.isScheduled()) { //select first option without showing zoom if called a second time in quick succession
showTask.cancel();
selectFirstOption();
}
else { //delay showing briefly to give time for a double-tap to auto-select the first ability
Timer.schedule(showTask, FGestureAdapter.DOUBLE_TAP_INTERVAL);
}
}
private final Task showTask = new Task() {
@Override
public void run () {
setVisible(true);
}
};
@Override
public void hide() {
if (isVisible()) {
orderedCards = null; //reset fields when hidden
@@ -127,7 +147,7 @@ public class VCardZoom extends FOverlay {
prompt.setMessage(null);
prompt.getBtnCancel().setText("More");
prompt.getBtnCancel().setEnabled(false);
setVisible(false);
super.hide();
}
}

View File

@@ -9,13 +9,24 @@ import forge.assets.FSkinColor;
import forge.assets.FSkinColor.Colors;
public abstract class FOverlay extends FContainer {
private static final FSkinColor BACK_COLOR = FSkinColor.get(Colors.CLR_OVERLAY).alphaColor(0.5f);
private static FSkinColor BACK_COLOR;
private static final Stack<FOverlay> overlays = new Stack<FOverlay>();
public FOverlay() {
super.setVisible(false); //hide by default
}
public static FOverlay getTopOverlay() {
if (overlays.isEmpty()) {
return null;
}
return overlays.peek();
}
public static Iterable<FOverlay> getOverlays() {
return overlays;
}
public void show() {
setVisible(true);
}
@@ -29,6 +40,9 @@ public abstract class FOverlay extends FContainer {
if (this.isVisible() == visible0) { return; }
if (visible0) {
if (BACK_COLOR == null) { //wait to initialize back color until first overlay shown
BACK_COLOR = FSkinColor.get(Colors.CLR_OVERLAY).alphaColor(0.5f);
}
overlays.push(this);
}
else {