GUI: improved double faced tokens:

- added tokens support in test render dialog;
 - improved PT drawing;
 - fixed broken second side switch button (related to #10231);
 - fixed miss override in TokenImpl (all override with backFace must be removed, see todo);
This commit is contained in:
Oleg Agafonov 2023-04-29 19:13:13 +04:00
parent 8cb89a9a98
commit 583c5fe4e9
13 changed files with 270 additions and 140 deletions

View file

@ -362,6 +362,8 @@ public class CardPanelRenderModeImage extends CardPanel {
int cardXOffset = 0;
int cardYOffset = 0;
CardView cardView = getGameCard();
// workaround to fix a rare NPE error with image loading
// reason: panel runs image load in another thread and that thread can be completed before top panel init, see updateArtImage
if (getTopPanelRef() == null) {
@ -381,7 +383,7 @@ public class CardPanelRenderModeImage extends CardPanel {
imagePanel.setLocation(realCardSize.x, realCardSize.y);
imagePanel.setSize(realCardSize.width, realCardSize.height);
if (hasSickness() && getGameCard().isCreature() && isPermanent()) {
if (hasSickness() && cardView.isCreature() && isPermanent()) {
overlayPanel.setLocation(realCardSize.x, realCardSize.y);
overlayPanel.setSize(realCardSize.width, realCardSize.height);
} else {
@ -441,10 +443,27 @@ public class CardPanelRenderModeImage extends CardPanel {
fullImageText.setBounds(titleText.getX(), titleText.getY(), titleText.getBounds().width, titleText.getBounds().height);
// PT (font as title)
if (getGameCard().getOriginalCard() != null) {
prepareGlowFont(ptText1, Math.max(CARD_PT_FONT_MIN_SIZE, fontSize), getGameCard().getOriginalCard().getPower(), false);
if (cardView.showPT()) {
// real PT info
MageInt currentPower;
MageInt currentToughness;
if (cardView.getOriginalCard() != null) {
// card
currentPower = cardView.getOriginalCard().getPower();
currentToughness = cardView.getOriginalCard().getToughness();
} else if (cardView.getOriginalToken() != null) {
// token
currentPower = cardView.getOriginalToken().getPower();
currentToughness = cardView.getOriginalToken().getToughness();
} else {
currentPower = null;
currentToughness = null;
}
prepareGlowFont(ptText1, Math.max(CARD_PT_FONT_MIN_SIZE, fontSize), currentPower, false);
prepareGlowFont(ptText2, Math.max(CARD_PT_FONT_MIN_SIZE, fontSize), null, false);
prepareGlowFont(ptText3, Math.max(CARD_PT_FONT_MIN_SIZE, fontSize), getGameCard().getOriginalCard().getToughness(), CardRendererUtils.isCardWithDamage(getGameCard()));
prepareGlowFont(ptText3, Math.max(CARD_PT_FONT_MIN_SIZE, fontSize), currentToughness, CardRendererUtils.isCardWithDamage(cardView));
// right bottom corner with margin (sizes from any sample card)
int ptMarginRight = Math.round(64f / 672f * cardWidth);

View file

@ -1,5 +1,6 @@
package org.mage.card.arcane;
import mage.MageInt;
import mage.ObjectColor;
import mage.cards.ArtRect;
import mage.cards.FrameStyle;
@ -1044,7 +1045,7 @@ public class ModernCardRenderer extends CardRenderer {
// Is it a creature?
boolean isVehicle = cardView.getSubTypes().contains(SubType.VEHICLE);
if (cardView.isCreature() || isVehicle) {
if (cardView.showPT()) {
// draws p/t by parts
int ptDeviderSpace = 1; // Arial font is too narrow for devider (2/2) and needs extra space
@ -1093,19 +1094,35 @@ public class ModernCardRenderer extends CardRenderer {
g.setColor(defaultTextColor);
g.setFont(ptTextFont);
// real PT info
MageInt currentPower;
MageInt currentToughness;
if (cardView.getOriginalCard() != null) {
// card
currentPower = cardView.getOriginalCard().getPower();
currentToughness = cardView.getOriginalCard().getToughness();
} else if (cardView.getOriginalToken() != null) {
// token
currentPower = cardView.getOriginalToken().getPower();
currentToughness = cardView.getOriginalToken().getToughness();
} else {
currentPower = null;
currentToughness = null;
}
// draws
int ptEmptySpace = (partBoxWidth - ptContentWidth) / 2;
int ptPosStart1 = x + contentInset + ptEmptySpace;
int ptPosStart2 = ptPosStart1 + ptTextWidth1 + ptDeviderSpace;
int ptPosStart3 = ptPosStart2 + ptTextWidth2 + ptDeviderSpace;
// p
g.setColor(CardRendererUtils.getCardTextColor(cardView.getOriginalCard().getPower(), false, defaultTextColor, defaultTextLight));
g.setColor(CardRendererUtils.getCardTextColor(currentPower, false, defaultTextColor, defaultTextLight));
g.drawString(ptText1, ptPosStart1, curY - ptTextOffset - 1); // left
// /
g.setColor(defaultTextColor);
g.drawString(ptText2, ptPosStart2, curY - ptTextOffset - 1); // center
// t
g.setColor(CardRendererUtils.getCardTextColor(cardView.getOriginalCard().getToughness(), CardRendererUtils.isCardWithDamage(cardView), defaultTextColor, defaultTextLight));
g.setColor(CardRendererUtils.getCardTextColor(currentToughness, CardRendererUtils.isCardWithDamage(cardView), defaultTextColor, defaultTextLight));
g.drawString(ptText3, ptPosStart3, curY - ptTextOffset - 1); // right
//
g.setColor(defaultTextColor);