Make mouseover on prompt pane show cardview of the controlling card if there is one

This commit is contained in:
pfps
2017-01-20 00:48:01 +00:00
parent 6e706f3662
commit 00ecfe7e49
15 changed files with 97 additions and 18 deletions

View File

@@ -791,6 +791,10 @@ public final class CMatchUI
public void showPromptMessage(final PlayerView playerView, final String message) {
cPrompt.setMessage(message);
}
// no override for now
public void showPromptMessage(final PlayerView playerView, final String message, final SpellAbilityView sav ) {
cPrompt.setMessage(message,sav);
}
@Override
public void showManaPool(final PlayerView player) {

View File

@@ -28,6 +28,8 @@ import javax.swing.JButton;
import forge.FThreads;
import forge.game.GameView;
import forge.game.card.CardView;
import forge.game.spellability.SpellAbilityView;
import forge.gui.framework.ICDoc;
import forge.gui.framework.SDisplayUtil;
import forge.screens.match.CMatchUI;
@@ -47,6 +49,9 @@ public class CPrompt implements ICDoc {
this.view = new VPrompt(this);
}
public final CMatchUI getMatchUI() {
return matchUI;
}
public final VPrompt getView() {
return view;
}
@@ -100,6 +105,11 @@ public class CPrompt implements ICDoc {
public void setMessage(final String s0) {
view.getTarMessage().setText(FSkin.encodeSymbols(s0, false));
view.setSpellAbilityView(null);
}
public void setMessage(final String s0, final SpellAbilityView sav) {
view.getTarMessage().setText(FSkin.encodeSymbols(s0, false));
view.setSpellAbilityView(sav);
}
/**

View File

@@ -17,6 +17,8 @@
*/
package forge.screens.match.views;
import forge.game.card.CardView;
import forge.game.spellability.SpellAbilityView;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
@@ -33,6 +35,8 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* Assembles Swing components of message report.
@@ -52,6 +56,11 @@ public class VPrompt implements IVDoc<CPrompt> {
private final FScrollPane messageScroller = new FScrollPane(tarMessage, false,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
private final JLabel lblGames;
private SpellAbilityView sav = null ;
public void setSpellAbilityView(final SpellAbilityView sav) {
this.sav = sav ;
}
private KeyAdapter buttonKeyAdapter = new KeyAdapter() {
@Override
@@ -84,6 +93,15 @@ public class VPrompt implements IVDoc<CPrompt> {
tarMessage.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
tarMessage.setMargin(new Insets(3, 3, 3, 3));
messageScroller.getViewport().getView().addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(final MouseEvent e) {
if ( sav != null ) {
controller.getMatchUI().setCard(sav.getHostCard());
}
}
});
}
//========== Overridden methods

View File

@@ -156,6 +156,11 @@ public class MatchController extends AbstractGuiGame {
view.getPrompt(player).setMessage(message);
}
@Override
public void showPromptMessage(final PlayerView player, final String message, final SpellAbilityView sav) {
view.getPrompt(player).setMessage(message);
}
@Override
public void updateButtons(final PlayerView owner, final String label1, final String label2, final boolean enable1, final boolean enable2, final boolean focus1) {
final VPrompt prompt = view.getPrompt(owner);

View File

@@ -32,6 +32,7 @@ public interface IGuiGame {
void afterGameEnd();
void showCombat();
void showPromptMessage(PlayerView playerView, String message);
void showPromptMessage(PlayerView playerView, String message, SpellAbilityView sav);
void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk);
void updateButtons(PlayerView owner, String label1, String label2, boolean enable1, boolean enable2, boolean focus1);
void flashIncorrectAction();

View File

@@ -25,6 +25,7 @@ import forge.game.phase.PhaseHandler;
import forge.game.player.Player;
import forge.game.player.PlayerView;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityView;
import forge.player.PlayerControllerHuman;
import forge.util.ITriggerEvent;
@@ -117,6 +118,9 @@ public abstract class InputBase implements java.io.Serializable, Input {
protected final void showMessage(final String message) {
controller.getGui().showPromptMessage(getOwner(), message);
}
protected final void showMessage(final String message, final SpellAbilityView sav) {
controller.getGui().showPromptMessage(getOwner(), message, sav);
}
protected String getTurnPhasePriorityMessage(final Game game) {
final PhaseHandler ph = game.getPhaseHandler();

View File

@@ -19,7 +19,9 @@ package forge.match.input;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.model.FModel;
import forge.player.PlayerControllerHuman;
import forge.properties.ForgePreferences;
/**
* <p>
@@ -61,7 +63,12 @@ public class InputConfirm extends InputSyncronizedBase {
@Override
protected final void showMessage() {
getController().getGui().updateButtons(getOwner(), yesButtonText, noButtonText, true, true, defaultYes);
showMessage(message);
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
(sa!=null) ) {
showMessage(sa.getStackDescription() + "\n" + message, sa.getView());
} else {
showMessage(message, (sa!=null)?sa.getView():null);
}
}
/** {@inheritDoc} */

View File

@@ -422,7 +422,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
getController().getGui().updateButtons(getOwner(), "Auto", "Cancel", true, true, true);
}
}
showMessage(getMessage());
showMessage(getMessage(), saPaidFor.getView());
}
@Override

View File

@@ -51,9 +51,14 @@ public class InputPayManaOfCostPayment extends InputPayMana {
msg.append(messagePrefix).append("\n");
}
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) {
msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", "")).append("\n");
// msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", ""));
if ( saPaidFor.isSpell() ) {
msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", ""));
} else {
msg.append(saPaidFor.getHostCard()).append(" - ").append(saPaidFor.toString());
}
msg.append("Pay Mana Cost: ").append(displayMana);
}
msg.append("\n").append("Pay Mana Cost: ").append(displayMana);
if (this.phyLifeToLose > 0) {
msg.append(" (");
msg.append(this.phyLifeToLose);

View File

@@ -7,6 +7,8 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import forge.model.FModel;
import forge.properties.ForgePreferences;
import forge.game.GameEntity;
import forge.game.card.Card;
import forge.game.card.CounterType;
@@ -27,7 +29,12 @@ public final class InputProliferate extends InputSelectManyBase<GameEntity> {
@Override
protected String getMessage() {
final StringBuilder sb = new StringBuilder("Choose permanents and/or players with counters on them to add one more counter of that type.");
final StringBuilder sb = new StringBuilder();
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
sa != null ) {
sb.append(sa.getStackDescription()).append("\n");
}
sb.append("Choose permanents and/or players with counters on them to add one more counter of that type.");
sb.append("\n\nYou've selected so far:\n");
if (chosenCounters.isEmpty()) {

View File

@@ -8,6 +8,8 @@ import java.util.Map.Entry;
import org.apache.commons.lang3.tuple.ImmutablePair;
import forge.model.FModel;
import forge.properties.ForgePreferences;
import forge.card.ColorSet;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
@@ -33,20 +35,22 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany
private SpellAbility sa;
public InputSelectCardsForConvokeOrImprovise(final PlayerControllerHuman controller, final Player p, final ManaCost cost, final CardCollectionView untapped, boolean impr, final SpellAbility sa) {
super(controller, 0, Math.min(cost.getCMC(), untapped.size()));
super(controller, 0, Math.min(cost.getCMC(), untapped.size()), sa);
remainingCost = new ManaCostBeingPaid(cost);
player = p;
availableCards = untapped;
improvise = impr;
cardType = impr ? "artifact" : "creature";
description = impr ? "Improvise" : "Convoke";
this.sa = sa;
}
@Override
protected String getMessage() {
StringBuilder sb = new StringBuilder();
if (sa != null) sb.append(sa.getStackDescription());
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
sa != null ) {
sb.append(sa.getStackDescription()).append("\n");
}
sb.append(String.format("Choose %s to tap for %s .\nRemaining mana cost is %s", cardType, description, remainingCost.toString()));
return sb.toString();
}

View File

@@ -8,7 +8,9 @@ import forge.game.GameEntity;
import forge.game.card.Card;
import forge.game.card.CardView;
import forge.game.spellability.SpellAbility;
import forge.model.FModel;
import forge.player.PlayerControllerHuman;
import forge.properties.ForgePreferences;
public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyncronizedBase {
private static final long serialVersionUID = -2305549394512889450L;
@@ -51,7 +53,12 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
@Override
public final void showMessage() {
showMessage(getMessage());
if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) &&
(sa!=null) ) {
showMessage( sa.getStackDescription() + "\n" + getMessage(), sa.getView() ) ;
} else {
showMessage(getMessage(), (sa!=null)?sa.getView():null);
}
getController().getGui().updateButtons(getOwner(), hasEnoughTargets(), allowCancel, true);
}

View File

@@ -49,7 +49,14 @@ public final class InputSelectTargets extends InputSyncronizedBase {
// Display targeting card in cardDetailPane in case it's not obviously visible.
getController().getGui().setCard(CardView.get(sa.getHostCard()));
final StringBuilder sb = new StringBuilder();
sb.append("Targeted:\n");
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) {
// sb.append(sa.getStackDescription().replace("(Targeting ERROR)", "")).append("\n<b>").append(tgt.getVTSelection()).append("</b>\n");
if ( sa.isAbility() ) { sb.append(sa.getHostCard()).append(" - " ); }
sb.append(sa.toString()).append("\n<b>").append(tgt.getVTSelection()).append("</b>\n");
} else {
sb.append(sa.getHostCard()).append(" - ").append(tgt.getVTSelection()).append("\n");
}
if ( ! targetDepth.entrySet().isEmpty() ) { sb.append("Targeted:\n"); }
for (final Entry<GameEntity, Integer> o : targetDepth.entrySet()) {
sb.append(o.getKey());
if (o.getValue() > 1) {
@@ -61,11 +68,6 @@ public final class InputSelectTargets extends InputSyncronizedBase {
sb.append("Parent Targeted:");
sb.append(sa.getUniqueTargets()).append("\n");
}
if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) {
sb.append(sa.getStackDescription().replace("(Targeting ERROR)", "")).append("\n").append(tgt.getVTSelection());
} else {
sb.append(sa.getHostCard() + " - " + tgt.getVTSelection());
}
final int maxTargets = tgt.getMaxTargets(sa.getHostCard(), sa);
final int targeted = sa.getTargets().getNumTargeted();
@@ -73,7 +75,7 @@ public final class InputSelectTargets extends InputSyncronizedBase {
sb.append(String.format("\n(%d more can be targeted)", Integer.valueOf(maxTargets - targeted)));
}
showMessage(sb.toString().replace("CARDNAME", sa.getHostCard().toString()));
showMessage(sb.toString().replace("CARDNAME", sa.getHostCard().toString()), sa.getView());
// If reached Minimum targets, enable OK button
if (!tgt.isMinTargetsChosen(sa.getHostCard(), sa) || tgt.isDividedAsYouChoose()) {

View File

@@ -73,6 +73,12 @@ public class NetGuiGame extends AbstractGuiGame {
send(ProtocolMethod.showPromptMessage, playerView, message);
}
@Override
public void showPromptMessage(final PlayerView playerView, final String message, final SpellAbilityView sav) {
updateGameView();
send(ProtocolMethod.showPromptMessage, playerView, message);
}
@Override
public void updateButtons(final PlayerView owner, final String label1, final String label2, final boolean enable1, final boolean enable2, final boolean focus1) {
send(ProtocolMethod.updateButtons, owner, label1, label2, enable1, enable2, focus1);

View File

@@ -861,11 +861,10 @@ public class HumanCostDecision extends CostDecisionMakerBase {
private final CardCollectionView validChoices;
public InputSelectCardToRemoveCounter(final PlayerControllerHuman controller, final int cntCounters, final CounterType cType, final CardCollectionView validCards, final SpellAbility sa) {
super(controller, cntCounters, cntCounters);
super(controller, cntCounters, cntCounters, sa);
this.validChoices = validCards;
counterType = cType;
cardsChosen = cntCounters > 0 ? new HashMap<Card, Integer>() : null;
this.sa = sa;
}
@Override