From 9f25b55cfbc514d7cf699bcafe206dc8a9891a07 Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 3 Oct 2014 13:25:52 +0000 Subject: [PATCH] Prevent flickering when multiple dialogs appear in quick succession --- .../src/main/java/forge/ImageCache.java | 2 +- .../forge/toolbox/imaging/FImageUtil.java | 2 +- .../src/forge/assets/ImageCache.java | 2 +- .../src/forge/card/CardRenderer.java | 4 +-- .../src/forge/toolbox/FOverlay.java | 27 ++++++++++--------- .../src/main/java/forge/view/CardView.java | 4 +-- 6 files changed, 22 insertions(+), 19 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index d239ba5230b..497263d5d40 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -81,7 +81,7 @@ public class ImageCache { * and cannot be loaded from disk. pass -1 for width and/or height to avoid resizing in that dimension. */ public static BufferedImage getImage(final CardView card, final int width, final int height) { - final String key = card.getOriginal().getImageKey(); + final String key = card.getOriginal().getImageKey(false); return scaleImage(key, width, height, true); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java index d2cb1418c43..138647f7f3b 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java @@ -48,7 +48,7 @@ public final class FImageUtil { * For flip cards, returns the un-flipped image. */ public static BufferedImage getImage(final CardStateView card) { - BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), true); + BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(false), true); final int foilIndex = card.getFoilIndex(); if (image != null && foilIndex > 0) { image = getImageWithFoilEffect(image, foilIndex); diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 6ab768a93e4..8c96258d8ee 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -80,7 +80,7 @@ public class ImageCache { } public static Texture getImage(CardView card) { - final String key = card.getOriginal().getImageKey(); + final String key = card.getOriginal().getImageKey(false); return getImage(key, true); } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 1b22e864ad8..78643c3d2b5 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -83,7 +83,7 @@ public class CardRenderer { float w = width - 2 * x; float h = height - 2 * y; - final Texture image = ImageCache.getImage(card.getOriginal().getImageKey(), true); + final Texture image = ImageCache.getImage(card.getOriginal().getImageKey(false), true); if (image == ImageCache.defaultImage) { //support drawing card image manually if card image not found float ratio = h / w; if (ratio > FCardPanel.ASPECT_RATIO) { @@ -221,7 +221,7 @@ public class CardRenderer { return getCardArt(ImageKeys.getImageKey(pc, false), pc.getRules().getSplitType() == CardSplitType.Split); } public static FImageComplex getCardArt(CardView card) { - return getCardArt(card.getOriginal().getImageKey(), card.isSplitCard()); + return getCardArt(card.getOriginal().getImageKey(true), card.isSplitCard()); } public static FImageComplex getCardArt(String imageKey, boolean isSplitCard) { FImageComplex cardArt = cardArtCache.get(imageKey); diff --git a/forge-gui-mobile/src/forge/toolbox/FOverlay.java b/forge-gui-mobile/src/forge/toolbox/FOverlay.java index f12efdaec3c..cafa9d906ad 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOverlay.java +++ b/forge-gui-mobile/src/forge/toolbox/FOverlay.java @@ -1,5 +1,6 @@ package forge.toolbox; +import java.util.ArrayList; import java.util.Stack; import com.badlogic.gdx.Input.Keys; @@ -52,6 +53,7 @@ public abstract class FOverlay extends FContainer { @Override public void run () { tempOverlay.hide(); + tempOverlay = null; } }; @@ -80,22 +82,14 @@ public abstract class FOverlay extends FContainer { } else if (!hidingAll) { //hiding all handles cleaning up overlay collection if (overlays.get(overlays.size() - 1) == this) { - overlays.pop(); - - //after removing the top overlay, put up an empty overlay for a brief period + //after removing the top overlay, delay hiding overlay for a brief period //to prevent back color flickering if another popup immediately follows if (tempOverlay != this) { - if (tempOverlay == null) { - tempOverlay = new FOverlay() { - @Override - protected void doLayout(float width, float height) { - } - }; - } - tempOverlay.backColor = backColor; - tempOverlay.show(); + tempOverlay = this; Timer.schedule(hideTempOverlayTask, 0.025f); + return; } + overlays.pop(); } else { overlays.remove(this); @@ -154,8 +148,17 @@ public abstract class FOverlay extends FContainer { return true; } + @Override + public void buildTouchListeners(float screenX, float screenY, ArrayList listeners) { + if (tempOverlay == this) { return; } //suppress touch events if waiting to be hidden + + super.buildTouchListeners(screenX, screenY, listeners); + } + @Override public boolean keyDown(int keyCode) { + if (tempOverlay == this) { return false; } //suppress key events if waiting to be hidden + if (keyCode == Keys.ESCAPE || keyCode == Keys.BACK) { if (Forge.endKeyInput()) { return true; } diff --git a/forge-gui/src/main/java/forge/view/CardView.java b/forge-gui/src/main/java/forge/view/CardView.java index ccdfe5675e3..58d3c99bb33 100644 --- a/forge-gui/src/main/java/forge/view/CardView.java +++ b/forge-gui/src/main/java/forge/view/CardView.java @@ -823,8 +823,8 @@ public class CardView extends GameEntityView { /** * @return the imageKey */ - public String getImageKey() { - return mayBeShown ? imageKey : ImageKeys.HIDDEN_CARD; + public String getImageKey(boolean ignoreMayBeShown) { + return mayBeShown || ignoreMayBeShown ? imageKey : ImageKeys.HIDDEN_CARD; } /**