mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Refactor how overlays are shown and hidden
This commit is contained in:
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -389,17 +389,16 @@ 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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user