Merge branch 'highlight' into 'master'

Darken non-selectable cards in Desktop GUI

See merge request core-developers/forge!1317
This commit is contained in:
Michael Kamensky
2019-01-28 17:55:36 +00:00
5 changed files with 72 additions and 9 deletions

View File

@@ -397,6 +397,7 @@ public final class CMatchUI
case Hand: case Hand:
updateHand = true; updateHand = true;
updateZones = true; updateZones = true;
FloatingZone.refresh(owner, zone);
break; break;
default: default:
updateZones = true; updateZones = true;
@@ -524,6 +525,45 @@ public final class CMatchUI
} }
} }
@Override
public void setSelectables(final Iterable<CardView> 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 @Override
public List<JMenu> getMenus() { public List<JMenu> getMenus() {
return menus.getMenus(); return menus.getMenus();

View File

@@ -253,7 +253,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight)
- edgeOffset); - edgeOffset);
} }
super.paint(g2d); super.paint(g2d);
} }
@Override @Override
@@ -268,25 +268,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 cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE));
final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; 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())) { if (matchUI.isUsedToPay(getCard())) {
g2d.setColor(Color.magenta); g2d.setColor(Color.magenta);
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);
} 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));
g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2);
} }
// Green outline for hover // Green outline for hover
if (isSelected) { if (isSelected) {
g2d.setColor(Color.green); g2d.setColor(Color.green);
final int n = Math.max(4, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); 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 outline for white bordered cards) // Black fill - (will become an outline for white bordered cards)
g2d.setColor(Color.black); g2d.setColor(Color.black);
g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize);
@@ -309,6 +305,12 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins); g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins);
} }
} }
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);
}
} }
private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) { private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) {
@@ -332,6 +334,17 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
drawFoilEffect(g, card, cardXOffset, cardYOffset, drawFoilEffect(g, card, cardXOffset, cardYOffset,
cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE));
} }
boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard());
// if selecting, darken non-selectable cards
if ( nonselectable ) {
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) { 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) {
@@ -783,6 +796,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
return FModel.getPreferences().getPrefBoolean(preferenceName); return FModel.getPreferences().getPrefBoolean(preferenceName);
} }
// don't show overlays on non-selectable cards when selecting
private boolean isShowingOverlays() { private boolean isShowingOverlays() {
return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null; return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null;
} }

View File

@@ -94,6 +94,11 @@ public class FloatingZone extends FloatingCardArea {
} }
floatingAreas.clear(); floatingAreas.clear();
} }
public static void refreshAll() {
for (final FloatingZone cardArea : floatingAreas.values()) {
cardArea.refresh();
}
}
private final ZoneType zone; private final ZoneType zone;
private PlayerView player; private PlayerView player;

View File

@@ -159,6 +159,7 @@ public interface IGuiGame {
void setUsedToPay(CardView card, boolean value); void setUsedToPay(CardView card, boolean value);
void setSelectables(final Iterable<CardView> cards); void setSelectables(final Iterable<CardView> cards);
void clearSelectables(); void clearSelectables();
boolean isSelecting();
void awaitNextInput(); void awaitNextInput();
void cancelAwaitNextInput(); void cancelAwaitNextInput();

View File

@@ -230,6 +230,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards {
public boolean isSelectable(final CardView card) { public boolean isSelectable(final CardView card) {
return selectableCards.contains(card); return selectableCards.contains(card);
} }
public boolean isSelecting() {
return !selectableCards.isEmpty();
}
/** Concede game, bring up WinLose UI. */ /** Concede game, bring up WinLose UI. */
public boolean concede() { public boolean concede() {