From e2ddcdda4d7de536ec56a3394f71670caefd73b1 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 21 Jan 2019 11:40:36 -0500 Subject: [PATCH 1/5] stronger highlighting for selectable cards --- .../java/forge/view/arcane/CardPanel.java | 28 +++++++++++++------ .../forge/view/arcane/ScaledImagePanel.java | 9 +++++- .../main/java/forge/interfaces/IGuiGame.java | 1 + .../java/forge/match/AbstractGuiGame.java | 3 ++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 16339ea1602..d1e1e6f1953 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,6 +253,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } + boolean selectable = matchUI.isSelectable(getCard()); + if ( titleText!=null ) { // selectable cards have colored names + titleText.setForeground(selectable?Color.cyan:Color.white); + } + // if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right + // imagePanel.setBrightness(selectable?1.0f:(matchUI.isSelecting()?0.5f:1.0f)); + //} super.paint(g2d); } @@ -268,25 +275,21 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; - // Magenta outline for when card was chosen to pay + // Magenta outline for when card is chosen if (matchUI.isUsedToPay(getCard())) { g2d.setColor(Color.magenta); - final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); - } else if (matchUI.isSelectable(getCard())) { // Cyan outline for selectable cards - g2d.setColor(Color.cyan); - final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } // Green outline for hover if (isSelected) { g2d.setColor(Color.green); - final int n = Math.max(4, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); + final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } - // Black fill - (will become outline for white bordered cards) + // Black fill - (will become an outline for white bordered cards) g2d.setColor(Color.black); g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); @@ -309,6 +312,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins); } } + + if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + g2d.setColor(Color.cyan); + // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset, (cardYOffset) + offset, cardWidth, cardHeight, cornerSize, cornerSize); + // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + } } private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java index 26021b0f670..a9867f6db6c 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java @@ -20,6 +20,7 @@ package forge.view.arcane; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; +import java.awt.image.RescaleOp; /** *

@@ -37,6 +38,10 @@ public class ScaledImagePanel extends JPanel { * */ private volatile BufferedImage srcImage; + private float brightness = 1.0f; + public void setBrightness(final float bright) { + brightness = bright; + } /** *

@@ -127,7 +132,9 @@ public class ScaledImagePanel extends JPanel { } else { int x = (sz.width / 2) - (img.getWidth() / 2); int y = (sz.height / 2) - (img.getHeight() / 2); - g.drawImage(img, x, y, null); + Graphics2D g2d = (Graphics2D) g; + RescaleOp brighten = new RescaleOp(brightness,0,null); + g2d.drawImage(img, brighten, x, y); } } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index ec2c6994a0f..3c9b08f4679 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -159,6 +159,7 @@ public interface IGuiGame { void setUsedToPay(CardView card, boolean value); void setSelectables(final Iterable cards); void clearSelectables(); + boolean isSelecting(); void awaitNextInput(); void cancelAwaitNextInput(); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index e71e4ff0293..ed4a467e112 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -230,6 +230,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public boolean isSelectable(final CardView card) { return selectableCards.contains(card); } + public boolean isSelecting() { + return !selectableCards.isEmpty(); + } /** Concede game, bring up WinLose UI. */ public boolean concede() { From 62316abf383f2c513b2b40cca230a615b58c60e8 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 23 Jan 2019 02:35:58 -0500 Subject: [PATCH 2/5] darken non-selectable cards when selecting (needs work) --- .../java/forge/view/arcane/CardPanel.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index d1e1e6f1953..280fb8c3905 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,14 +253,14 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } - boolean selectable = matchUI.isSelectable(getCard()); - if ( titleText!=null ) { // selectable cards have colored names - titleText.setForeground(selectable?Color.cyan:Color.white); + // System.out.println("Paint " + getCard() + " selecting " + matchUI.isSelecting()); + boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); + if ( titleText!=null ) { // non-selectable cards have gray names + titleText.setForeground(nonselectable?Color.DARK_GRAY:Color.WHITE); } - // if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right - // imagePanel.setBrightness(selectable?1.0f:(matchUI.isSelecting()?0.5f:1.0f)); - //} - super.paint(g2d); + if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right + imagePanel.setBrightness(nonselectable?0.4f:1.0f); + } super.paint(g2d); } @Override @@ -304,7 +304,8 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl colorIsSet = true; } else if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) { // Non-foil cards from white-bordered sets are drawn with white border - g2d.setColor(Color.WHITE); + // unless selecting and card is not selectable + g2d.setColor(matchUI.isSelecting()&&!matchUI.isSelectable(getCard())?Color.DARK_GRAY:Color.WHITE); colorIsSet = true; } if (colorIsSet) { @@ -313,11 +314,12 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } } - if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards - g2d.setColor(Color.cyan); - // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset, (cardYOffset) + offset, cardWidth, cardHeight, cornerSize, cornerSize); - // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + g2d.setColor(Color.WHITE); + final int ins = 1; + g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); + // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } } @@ -368,6 +370,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final boolean canShow = matchUI.mayView(card); final boolean showText = !imagePanel.hasImage() || !isAnimationPanel; + System.out.println("doLayout " + card); displayCardNameOverlay(showText && canShow && showCardNameOverlay(), imgSize, imgPos); displayPTOverlay(showText && (canShow || card.isFaceDown()) && showCardPowerOverlay(), imgSize, imgPos); displayCardIdOverlay(showText && canShow && showCardIdOverlay(), imgSize, imgPos); @@ -793,6 +796,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl return FModel.getPreferences().getPrefBoolean(preferenceName); } + // don't show overlays on non-selectable cards when selecting private boolean isShowingOverlays() { return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null; } From 70f0f1108b14bd7ff5c465ec5b140bb9b2342c71 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 27 Jan 2019 08:22:50 -0500 Subject: [PATCH 3/5] darken non-selectable cards during paintChildren --- .../java/forge/view/arcane/CardPanel.java | 31 ++++++++++--------- .../forge/view/arcane/ScaledImagePanel.java | 9 +----- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 280fb8c3905..7d0cbb2ce89 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,14 +253,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } - // System.out.println("Paint " + getCard() + " selecting " + matchUI.isSelecting()); - boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); - if ( titleText!=null ) { // non-selectable cards have gray names - titleText.setForeground(nonselectable?Color.DARK_GRAY:Color.WHITE); - } - if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right - imagePanel.setBrightness(nonselectable?0.4f:1.0f); - } super.paint(g2d); + super.paint(g2d); } @Override @@ -304,8 +297,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl colorIsSet = true; } else if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) { // Non-foil cards from white-bordered sets are drawn with white border - // unless selecting and card is not selectable - g2d.setColor(matchUI.isSelecting()&&!matchUI.isSelectable(getCard())?Color.DARK_GRAY:Color.WHITE); + g2d.setColor(Color.WHITE); colorIsSet = true; } if (colorIsSet) { @@ -314,12 +306,10 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } } - if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + if (matchUI.isSelectable(getCard())) { // White border for selectable cards to further highlight them g2d.setColor(Color.WHITE); final int ins = 1; - g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); - // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); } } @@ -344,6 +334,19 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl drawFoilEffect(g, card, cardXOffset, cardYOffset, cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); } + + System.out.println("Painting " + getCard() + " selecting " + matchUI.isSelecting()); + boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); + // if selecting, darken non-selectable cards - pfps - needs fixes to refreshing to do right + if ( nonselectable ) { + System.out.println("Paint nonselectable " + card); + boolean noBorderPref = !isPreferenceEnabled(FPref.UI_RENDER_BLACK_BORDERS); + boolean cardImgHasAlpha = imagePanel != null && imagePanel.getSrcImage() != null && imagePanel.getSrcImage().getColorModel().hasAlpha(); + final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); + final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; + g.setColor(new Color(0.0f,0.0f,0.0f,0.6f)); + g.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); + } } public static void drawFoilEffect(final Graphics g, final CardView card2, final int x, final int y, final int width, final int height, final int borderSize) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java index a9867f6db6c..26021b0f670 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java @@ -20,7 +20,6 @@ package forge.view.arcane; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; -import java.awt.image.RescaleOp; /** *

@@ -38,10 +37,6 @@ public class ScaledImagePanel extends JPanel { * */ private volatile BufferedImage srcImage; - private float brightness = 1.0f; - public void setBrightness(final float bright) { - brightness = bright; - } /** *

@@ -132,9 +127,7 @@ public class ScaledImagePanel extends JPanel { } else { int x = (sz.width / 2) - (img.getWidth() / 2); int y = (sz.height / 2) - (img.getHeight() / 2); - Graphics2D g2d = (Graphics2D) g; - RescaleOp brighten = new RescaleOp(brightness,0,null); - g2d.drawImage(img, brighten, x, y); + g.drawImage(img, x, y, null); } } From 25003aa74e5a95e384ece291386dc823eeb02bae Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 27 Jan 2019 21:09:52 -0500 Subject: [PATCH 4/5] better way to schedule visual updates to non-selectable cards --- .../java/forge/screens/match/CMatchUI.java | 39 +++++++++++++++++++ .../java/forge/view/arcane/CardPanel.java | 7 +--- .../java/forge/view/arcane/FloatingZone.java | 5 +++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index db4efdbbee0..1e12acb4e9e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -524,6 +524,45 @@ public final class CMatchUI } } + @Override + public void setSelectables(final Iterable cards) { + super.setSelectables(cards); + // update zones on tabletop and floating zones - non-selectable cards may be rendered differently + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public final void run() { + for (final PlayerView p : getGameView().getPlayers()) { + if ( p.getCards(ZoneType.Battlefield) != null ) { + updateCards(p.getCards(ZoneType.Battlefield)); + } + if ( p.getCards(ZoneType.Hand) != null ) { + updateCards(p.getCards(ZoneType.Hand)); + } + } + FloatingZone.refreshAll(); + } + }); + } + + @Override + public void clearSelectables() { + super.clearSelectables(); + // update zones on tabletop and floating zones - non-selectable cards may be rendered differently + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public final void run() { + for (final PlayerView p : getGameView().getPlayers()) { + if ( p.getCards(ZoneType.Battlefield) != null ) { + updateCards(p.getCards(ZoneType.Battlefield)); + } + if ( p.getCards(ZoneType.Hand) != null ) { + updateCards(p.getCards(ZoneType.Hand)); + } + } + FloatingZone.refreshAll(); + } + }); + } + + @Override public List getMenus() { return menus.getMenus(); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 7d0cbb2ce89..8a7ee3c99c1 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -279,7 +279,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl if (isSelected) { g2d.setColor(Color.green); final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } // Black fill - (will become an outline for white bordered cards) @@ -335,11 +335,9 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); } - System.out.println("Painting " + getCard() + " selecting " + matchUI.isSelecting()); boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); - // if selecting, darken non-selectable cards - pfps - needs fixes to refreshing to do right + // if selecting, darken non-selectable cards if ( nonselectable ) { - System.out.println("Paint nonselectable " + card); boolean noBorderPref = !isPreferenceEnabled(FPref.UI_RENDER_BLACK_BORDERS); boolean cardImgHasAlpha = imagePanel != null && imagePanel.getSrcImage() != null && imagePanel.getSrcImage().getColorModel().hasAlpha(); final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); @@ -373,7 +371,6 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final boolean canShow = matchUI.mayView(card); final boolean showText = !imagePanel.hasImage() || !isAnimationPanel; - System.out.println("doLayout " + card); displayCardNameOverlay(showText && canShow && showCardNameOverlay(), imgSize, imgPos); displayPTOverlay(showText && (canShow || card.isFaceDown()) && showCardPowerOverlay(), imgSize, imgPos); displayCardIdOverlay(showText && canShow && showCardIdOverlay(), imgSize, imgPos); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index d81af9fef88..616a7cce38c 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -94,6 +94,11 @@ public class FloatingZone extends FloatingCardArea { } floatingAreas.clear(); } + public static void refreshAll() { + for (final FloatingZone cardArea : floatingAreas.values()) { + cardArea.refresh(); + } + } private final ZoneType zone; private PlayerView player; From 1ba1226661753124552fa0544afa0a17270c997e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 28 Jan 2019 05:53:38 -0500 Subject: [PATCH 5/5] refresh hand floating zone when hand is updated --- .../src/main/java/forge/screens/match/CMatchUI.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 1e12acb4e9e..5df40f54120 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -397,6 +397,7 @@ public final class CMatchUI case Hand: updateHand = true; updateZones = true; + FloatingZone.refresh(owner, zone); break; default: updateZones = true;