Phase inidicators arranged into a separate control

Moved special and more complex control like DeckChooser aside from the simpliest ones (like FButton or FLabel)
This commit is contained in:
Maxmtg
2013-06-30 06:05:48 +00:00
parent 5d3db0dbd3
commit 80b403c881
28 changed files with 389 additions and 358 deletions

View File

@@ -62,7 +62,6 @@ import forge.gui.match.controllers.CMessage;
import forge.gui.match.controllers.CStack;
import forge.gui.match.nonsingleton.VField;
import forge.gui.match.views.VAntes;
import forge.gui.toolbox.CardFaceSymbols;
import forge.gui.toolbox.FSkin;
import forge.net.NetServer;
import forge.properties.NewConstants;
@@ -172,9 +171,6 @@ public enum FControl {
UIManager.put("TabbedPane.contentOpaque", FSkin.getColor(FSkin.Colors.CLR_THEME));
UIManager.put("TabbedPane.unselectedBackground", FSkin.getColor(FSkin.Colors.CLR_THEME2));
// Does not use progress bar, due to be deprecated with battlefield refactoring.
CardFaceSymbols.loadImages();
this.shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
this.display = FView.SINGLETON_INSTANCE.getLpnDocument();

View File

@@ -32,7 +32,7 @@ import forge.gui.match.ViewWinLose;
import forge.gui.match.controllers.CMessage;
import forge.gui.match.controllers.CStack;
import forge.gui.match.nonsingleton.VHand;
import forge.gui.match.nonsingleton.VField.PhaseLabel;
import forge.gui.toolbox.special.PhaseLabel;
public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
private final FControl fc;
@@ -56,7 +56,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
phaseUpdPlanned.set(false);
final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE;
PhaseLabel lbl = matchUi.getFieldViewFor(p).getLabelFor(ph);
PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseInidicator().getLabelFor(ph);
matchUi.resetAllPhaseButtons();
if (lbl != null) lbl.setActive(true);

View File

@@ -9,7 +9,7 @@ import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
import forge.gui.framework.IVDoc;
import forge.gui.toolbox.DeckLister;
import forge.gui.toolbox.special.DeckLister;
/**
* Assembles Swing components of all deck viewer in deck editor.

View File

@@ -19,12 +19,12 @@ import forge.gui.framework.EDocID;
import forge.gui.home.EMenuGroup;
import forge.gui.home.IVSubmenu;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextField;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of "build gauntlet" submenu singleton.

View File

@@ -17,10 +17,10 @@ import forge.gui.home.EMenuGroup;
import forge.gui.home.IVSubmenu;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of "build gauntlet" submenu singleton.

View File

@@ -19,10 +19,10 @@ import forge.gui.home.IVSubmenu;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of "quick gauntlet" submenu singleton.

View File

@@ -10,10 +10,10 @@ import forge.gui.framework.EDocID;
import forge.gui.home.EMenuGroup;
import forge.gui.home.IVSubmenu;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.DeckLister;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.DeckLister;
/**
* Assembles Swing components of quest decks submenu singleton.
@@ -90,7 +90,7 @@ public enum VSubmenuQuestDecks implements IVSubmenu<CSubmenuQuestDecks> {
return EDocID.HOME_QUESTDECKS;
}
/** @return {@link forge.gui.toolbox.DeckLister} */
/** @return {@link forge.gui.toolbox.special.DeckLister} */
public DeckLister getLstDecks() {
return this.lstDecks;
}

View File

@@ -14,8 +14,8 @@ import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of constructed submenu singleton.

View File

@@ -20,13 +20,13 @@ import forge.gui.home.IVSubmenu;
import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.DeckLister;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.JXButtonPanel;
import forge.gui.toolbox.special.DeckLister;
/**
* Assembles Swing components of draft submenu singleton.
@@ -131,7 +131,7 @@ public enum VSubmenuDraft implements IVSubmenu<CSubmenuDraft> {
return radSingle.isSelected();
}
/** @return {@link forge.gui.toolbox.DeckLister} */
/** @return {@link forge.gui.toolbox.special.DeckLister} */
public DeckLister getLstDecks() {
return lstDecks;
}

View File

@@ -25,12 +25,12 @@ import forge.gui.home.IVSubmenu;
import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.DeckLister;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FPanel;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.DeckLister;
/**
* Assembles Swing components of sealed submenu singleton.
@@ -143,7 +143,7 @@ public enum VSubmenuSealed implements IVSubmenu<CSubmenuSealed> {
return this.btnStart;
}
/** @return {@link forge.gui.toolbox.DeckLister} */
/** @return {@link forge.gui.toolbox.special.DeckLister} */
public DeckLister getLstDecks() {
return lstDecks;
}

View File

@@ -27,8 +27,8 @@ import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.CEditorVariant;
import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.special.FDeckChooser;
import forge.item.PaperCard;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;

View File

@@ -28,8 +28,8 @@ import forge.gui.deckeditor.CDeckEditorUI;
import forge.gui.deckeditor.controllers.CEditorVariant;
import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.special.FDeckChooser;
import forge.item.PaperCard;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;

View File

@@ -23,7 +23,7 @@ import forge.game.player.LobbyPlayer;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.special.FDeckChooser;
import forge.item.PaperCard;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;

View File

@@ -24,7 +24,6 @@ import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FPanel;
@@ -33,6 +32,7 @@ import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTabbedPane;
import forge.gui.toolbox.JXButtonPanel;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of constructed submenu singleton.

View File

@@ -24,7 +24,6 @@ import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FPanel;
@@ -32,6 +31,7 @@ import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTabbedPane;
import forge.gui.toolbox.special.FDeckChooser;
/**
* Assembles Swing components of constructed submenu singleton.

View File

@@ -28,7 +28,6 @@ import forge.gui.home.LblHeader;
import forge.gui.home.StartButton;
import forge.gui.home.VHomeUI;
import forge.gui.toolbox.FCheckBox;
import forge.gui.toolbox.FDeckChooser;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FPanel;
@@ -36,6 +35,7 @@ import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTabbedPane;
import forge.gui.toolbox.special.FDeckChooser;
import forge.item.PaperCard;
import forge.item.IPaperCard;

View File

@@ -45,10 +45,10 @@ import forge.gui.match.controllers.CMessage;
import forge.gui.match.controllers.CPicture;
import forge.gui.match.nonsingleton.VCommand;
import forge.gui.match.nonsingleton.VField;
import forge.gui.match.nonsingleton.VField.PhaseLabel;
import forge.gui.match.nonsingleton.VHand;
import forge.gui.match.views.VPlayers;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.special.PhaseLabel;
import forge.item.InventoryItem;
import forge.properties.ForgePreferences.FPref;
@@ -179,7 +179,7 @@ public enum CMatchUI {
// (not just one).
public void resetAllPhaseButtons() {
for (final VField v : view.getFieldViews()) {
v.resetPhaseButtons();
v.getPhaseInidicator().resetPhaseButtons();
}
}
@@ -237,7 +237,7 @@ public enum CMatchUI {
*/
public final boolean stopAtPhase(final Player turn, final PhaseType phase) {
VField vf = getFieldViewFor(turn);
PhaseLabel label = vf.getLabelFor(phase);
PhaseLabel label = vf.getPhaseInidicator().getLabelFor(phase);
return label == null || label.getEnabled();
}

View File

@@ -18,9 +18,7 @@
package forge.gui.match.nonsingleton;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@@ -40,7 +38,6 @@ import net.miginfocom.swing.MigLayout;
import forge.card.MagicColor;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.mana.ManaPool;
import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -52,6 +49,7 @@ import forge.gui.match.controllers.CPlayers;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FSkin.SkinProp;
import forge.gui.toolbox.special.PhaseIndicator;
import forge.view.arcane.PlayArea;
/**
@@ -73,14 +71,12 @@ public class VField implements IVDoc<CField> {
private final JScrollPane scroller = new JScrollPane();
private final PlayArea tabletop;
private final JPanel avatarArea = new JPanel();
private final JPanel phaseArea = new JPanel();
private final JPanel pnlDetails = new JPanel();
// Avatar area
private final FLabel lblAvatar = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
.iconScaleFactor(1.0f).build();
private final FLabel lblLife = new FLabel.Builder().fontAlign(SwingConstants.CENTER)
.fontStyle(Font.BOLD).build();
private final FLabel lblAvatar = new FLabel.Builder().fontAlign(SwingConstants.CENTER).iconScaleFactor(1.0f).build();
private final FLabel lblLife = new FLabel.Builder().fontAlign(SwingConstants.CENTER).fontStyle(Font.BOLD).build();
// Info labels
private FLabel lblHand = getBuiltFLabel(FSkin.ZoneImages.ICO_HAND, "99", "Cards in hand");
@@ -91,19 +87,7 @@ public class VField implements IVDoc<CField> {
private FLabel lblPoison = getBuiltFLabel(FSkin.ZoneImages.ICO_POISON, "99", "Poison counters");
private final List<Pair<FLabel, Byte>> manaLabels = new ArrayList<Pair<FLabel,Byte>>();
// Phase labels
private PhaseLabel lblUpkeep = new PhaseLabel("UP");
private PhaseLabel lblDraw = new PhaseLabel("DR");
private PhaseLabel lblMain1 = new PhaseLabel("M1");
private PhaseLabel lblBeginCombat = new PhaseLabel("BC");
private PhaseLabel lblDeclareAttackers = new PhaseLabel("DA");
private PhaseLabel lblDeclareBlockers = new PhaseLabel("DB");
private PhaseLabel lblFirstStrike = new PhaseLabel("FS");
private PhaseLabel lblCombatDamage = new PhaseLabel("CD");
private PhaseLabel lblEndCombat = new PhaseLabel("EC");
private PhaseLabel lblMain2 = new PhaseLabel("M2");
private PhaseLabel lblEndTurn = new PhaseLabel("ET");
private PhaseLabel lblCleanup = new PhaseLabel("CL");
private final PhaseIndicator phaseInidicator = new PhaseIndicator();
private final Border borderAvatarSimple = new LineBorder(new Color(0, 0, 0, 0), 1);
private final Border borderAvatarHover = new LineBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS), 1);
@@ -161,10 +145,6 @@ public class VField implements IVDoc<CField> {
}
});
phaseArea.setOpaque(false);
phaseArea.setLayout(new MigLayout("insets 0 0 1% 0, gap 0, wrap"));
populatePhase();
tabletop.setBorder(new MatteBorder(0, 1, 0, 0,
FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
tabletop.setOpaque(false);
@@ -190,7 +170,7 @@ public class VField implements IVDoc<CField> {
pnl.setLayout(new MigLayout("insets 0, gap 0"));
pnl.add(avatarArea, "w 10%!, h 30%!");
pnl.add(phaseArea, "w 5%!, h 100%!, span 1 2");
pnl.add(phaseInidicator, "w 5%!, h 100%!, span 1 2");
pnl.add(scroller, "w 85%!, h 100%!, span 1 2, wrap");
pnl.add(pnlDetails, "w 10%!, h 69%!, gapleft 1px");
}
@@ -237,47 +217,7 @@ public class VField implements IVDoc<CField> {
//========= Populate helper methods
/** Adds phase indicator labels to phase area JPanel container. */
private void populatePhase() {
// Constraints string, set once
final String constraints = "w 94%!, h 7.2%, gaptop 1%, gapleft 3%";
VField.this.lblUpkeep.setToolTipText("<html>Phase: Upkeep<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblUpkeep, constraints);
VField.this.lblDraw.setToolTipText("<html>Phase: Draw<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblDraw, constraints);
VField.this.lblMain1.setToolTipText("<html>Phase: Main 1<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblMain1, constraints);
VField.this.lblBeginCombat.setToolTipText("<html>Phase: Begin Combat<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblBeginCombat, constraints);
VField.this.lblDeclareAttackers.setToolTipText("<html>Phase: Declare Attackers<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblDeclareAttackers, constraints);
VField.this.lblDeclareBlockers.setToolTipText("<html>Phase: Declare Blockers<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblDeclareBlockers, constraints);
VField.this.lblFirstStrike.setToolTipText("<html>Phase: First Strike Damage<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblFirstStrike, constraints);
VField.this.lblCombatDamage.setToolTipText("<html>Phase: Combat Damage<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblCombatDamage, constraints);
VField.this.lblEndCombat.setToolTipText("<html>Phase: End Combat<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblEndCombat, constraints);
VField.this.lblMain2.setToolTipText("<html>Phase: Main 2<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblMain2, constraints);
VField.this.lblEndTurn.setToolTipText("<html>Phase: End Turn<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblEndTurn, constraints);
VField.this.lblCleanup.setToolTipText("<html>Phase: Cleanup<br>Click to toggle.</html>");
phaseArea.add(VField.this.lblCleanup, constraints);
}
/** Adds various labels to pool area JPanel container. */
private void populateDetails() {
@@ -458,242 +398,13 @@ public class VField implements IVDoc<CField> {
return this.lblPoison;
}
// Phases
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblUpkeep() {
return this.lblUpkeep;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDraw() {
return this.lblDraw;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblMain1() {
return this.lblMain1;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblBeginCombat() {
return this.lblBeginCombat;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDeclareAttackers() {
return this.lblDeclareAttackers;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDeclareBlockers() {
return this.lblDeclareBlockers;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblCombatDamage() {
return this.lblCombatDamage;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblFirstStrike() {
return this.lblFirstStrike;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblEndCombat() {
return this.lblEndCombat;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblMain2() {
return this.lblMain2;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblEndTurn() {
return this.lblEndTurn;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblCleanup() {
return this.lblCleanup;
}
//========== Custom class handling
public PhaseLabel getLabelFor(final PhaseType s) {
switch (s) {
case UPKEEP:
return this.getLblUpkeep();
case DRAW:
return this.getLblDraw();
case MAIN1:
return this.getLblMain1();
case COMBAT_BEGIN:
return this.getLblBeginCombat();
case COMBAT_DECLARE_ATTACKERS:
return this.getLblDeclareAttackers();
case COMBAT_DECLARE_BLOCKERS:
return this.getLblDeclareBlockers();
case COMBAT_DAMAGE:
return this.getLblCombatDamage();
case COMBAT_FIRST_STRIKE_DAMAGE:
return this.getLblFirstStrike();
case COMBAT_END:
return this.getLblEndCombat();
case MAIN2:
return this.getLblMain2();
case END_OF_TURN:
return this.getLblEndTurn();
case CLEANUP:
return this.getLblCleanup();
default:
return null;
}
}
/**
* Resets all phase buttons to "inactive", so highlight won't be drawn on
* them. "Enabled" state remains the same.
* TODO: Write javadoc for this method.
* @return
*/
public void resetPhaseButtons() {
getLblUpkeep().setActive(false);
getLblDraw().setActive(false);
getLblMain1().setActive(false);
getLblBeginCombat().setActive(false);
getLblDeclareAttackers().setActive(false);
getLblDeclareBlockers().setActive(false);
getLblFirstStrike().setActive(false);
getLblCombatDamage().setActive(false);
getLblEndCombat().setActive(false);
getLblMain2().setActive(false);
getLblEndTurn().setActive(false);
getLblCleanup().setActive(false);
public PhaseIndicator getPhaseInidicator() {
return phaseInidicator;
}
/**
* Shows phase labels, handles repainting and on/off states. A PhaseLabel
* has "skip" and "active" states, meaning "this phase is (not) skipped" and
* "this is the current phase".
*/
@SuppressWarnings("serial")
public class PhaseLabel extends JLabel {
private boolean enabled = true;
private boolean active = false;
private boolean hover = false;
/**
* Shows phase labels, handles repainting and on/off states. A
* PhaseLabel has "skip" and "active" states, meaning
* "this phase is (not) skipped" and "this is the current phase".
*
* @param txt
* &emsp; Label text
*/
public PhaseLabel(final String txt) {
super(txt);
this.setHorizontalTextPosition(SwingConstants.CENTER);
this.setHorizontalAlignment(SwingConstants.CENTER);
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
if (PhaseLabel.this.enabled) {
PhaseLabel.this.enabled = false;
} else {
PhaseLabel.this.enabled = true;
}
}
@Override
public void mouseEntered(final MouseEvent e) {
PhaseLabel.this.hover = true;
PhaseLabel.this.repaintOnlyThisLabel();
}
@Override
public void mouseExited(final MouseEvent e) {
PhaseLabel.this.hover = false;
PhaseLabel.this.repaintOnlyThisLabel();
}
});
}
/**
* Determines whether play pauses at this phase or not.
*
* @param b
* &emsp; boolean, true if play pauses
*/
@Override
public void setEnabled(final boolean b) {
this.enabled = b;
}
/**
* Determines whether play pauses at this phase or not.
*
* @return boolean
*/
public boolean getEnabled() {
return this.enabled;
}
/**
* Makes this phase the current phase (or not).
*
* @param b
* &emsp; boolean, true if phase is current
*/
public void setActive(final boolean b) {
this.active = b;
this.repaintOnlyThisLabel();
}
/**
* Determines if this phase is the current phase (or not).
*
* @return boolean
*/
public boolean getActive() {
return this.active;
}
/** Prevent label from repainting the whole screen. */
public void repaintOnlyThisLabel() {
final Dimension d = PhaseLabel.this.getSize();
repaint(0, 0, d.width, d.height);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
@Override
public void paintComponent(final Graphics g) {
final int w = this.getWidth();
final int h = this.getHeight();
Color c;
// Set color according to skip or active or hover state of label
if (this.hover) {
c = FSkin.getColor(FSkin.Colors.CLR_HOVER);
} else if (this.active && this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_ACTIVE_ENABLED);
} else if (!this.active && this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_INACTIVE_ENABLED);
} else if (this.active && !this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_ACTIVE_DISABLED);
} else {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_INACTIVE_DISABLED);
}
// Center vertically and horizontally. Show border if active.
g.setColor(c);
g.fillRoundRect(1, 1, w - 2, h - 2, 5, 5);
super.paintComponent(g);
}
}
}

View File

@@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox;
package forge.gui.toolbox.special;
import java.util.Collections;
import java.util.List;

View File

@@ -17,7 +17,7 @@ ram is free software: you can redistribute it and/or modify
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.gui.toolbox;
package forge.gui.toolbox.special;
import java.awt.Color;
import java.awt.Dimension;
@@ -50,6 +50,8 @@ import forge.gui.deckeditor.controllers.CEditorConstructed;
import forge.gui.deckeditor.controllers.CEditorLimited;
import forge.gui.deckeditor.controllers.CEditorQuest;
import forge.gui.framework.ILocalRepaint;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
import forge.item.InventoryItem;
/**

View File

@@ -1,4 +1,4 @@
package forge.gui.toolbox;
package forge.gui.toolbox.special;
import java.awt.Font;
import java.awt.event.MouseAdapter;
@@ -25,6 +25,11 @@ import forge.deck.Deck;
import forge.deck.DeckgenUtil;
import forge.deck.generate.GenerateThemeDeck;
import forge.game.RegisteredPlayer;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FList;
import forge.gui.toolbox.FRadioButton;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.JXButtonPanel;
import forge.item.PreconDeck;
import forge.quest.QuestController;
import forge.quest.QuestEvent;

View File

@@ -0,0 +1,191 @@
package forge.gui.toolbox.special;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import forge.game.phase.PhaseType;
/**
* TODO: Write javadoc for this type.
*
*/
public class PhaseIndicator extends JPanel {
private static final long serialVersionUID = -863730022835609252L;
// Phase labels
private PhaseLabel lblUpkeep = new PhaseLabel("UP");
private PhaseLabel lblDraw = new PhaseLabel("DR");
private PhaseLabel lblMain1 = new PhaseLabel("M1");
private PhaseLabel lblBeginCombat = new PhaseLabel("BC");
private PhaseLabel lblDeclareAttackers = new PhaseLabel("DA");
private PhaseLabel lblDeclareBlockers = new PhaseLabel("DB");
private PhaseLabel lblFirstStrike = new PhaseLabel("FS");
private PhaseLabel lblCombatDamage = new PhaseLabel("CD");
private PhaseLabel lblEndCombat = new PhaseLabel("EC");
private PhaseLabel lblMain2 = new PhaseLabel("M2");
private PhaseLabel lblEndTurn = new PhaseLabel("ET");
private PhaseLabel lblCleanup = new PhaseLabel("CL");
public PhaseIndicator() {
this.setOpaque(false);
this.setLayout(new MigLayout("insets 0 0 1% 0, gap 0, wrap"));
populatePhase();
}
/** Adds phase indicator labels to phase area JPanel container. */
private void populatePhase() {
// Constraints string, set once
final String constraints = "w 94%!, h 7.2%, gaptop 1%, gapleft 3%";
lblUpkeep.setToolTipText("<html>Phase: Upkeep<br>Click to toggle.</html>");
this.add(lblUpkeep, constraints);
lblDraw.setToolTipText("<html>Phase: Draw<br>Click to toggle.</html>");
this.add(lblDraw, constraints);
lblMain1.setToolTipText("<html>Phase: Main 1<br>Click to toggle.</html>");
this.add(lblMain1, constraints);
lblBeginCombat.setToolTipText("<html>Phase: Begin Combat<br>Click to toggle.</html>");
this.add(lblBeginCombat, constraints);
lblDeclareAttackers.setToolTipText("<html>Phase: Declare Attackers<br>Click to toggle.</html>");
this.add(lblDeclareAttackers, constraints);
lblDeclareBlockers.setToolTipText("<html>Phase: Declare Blockers<br>Click to toggle.</html>");
this.add(lblDeclareBlockers, constraints);
lblFirstStrike.setToolTipText("<html>Phase: First Strike Damage<br>Click to toggle.</html>");
this.add(lblFirstStrike, constraints);
lblCombatDamage.setToolTipText("<html>Phase: Combat Damage<br>Click to toggle.</html>");
this.add(lblCombatDamage, constraints);
lblEndCombat.setToolTipText("<html>Phase: End Combat<br>Click to toggle.</html>");
this.add(lblEndCombat, constraints);
lblMain2.setToolTipText("<html>Phase: Main 2<br>Click to toggle.</html>");
this.add(lblMain2, constraints);
lblEndTurn.setToolTipText("<html>Phase: End Turn<br>Click to toggle.</html>");
this.add(lblEndTurn, constraints);
lblCleanup.setToolTipText("<html>Phase: Cleanup<br>Click to toggle.</html>");
this.add(lblCleanup, constraints);
}
//========== Custom class handling
public PhaseLabel getLabelFor(final PhaseType s) {
switch (s) {
case UPKEEP:
return this.getLblUpkeep();
case DRAW:
return this.getLblDraw();
case MAIN1:
return this.getLblMain1();
case COMBAT_BEGIN:
return this.getLblBeginCombat();
case COMBAT_DECLARE_ATTACKERS:
return this.getLblDeclareAttackers();
case COMBAT_DECLARE_BLOCKERS:
return this.getLblDeclareBlockers();
case COMBAT_DAMAGE:
return this.getLblCombatDamage();
case COMBAT_FIRST_STRIKE_DAMAGE:
return this.getLblFirstStrike();
case COMBAT_END:
return this.getLblEndCombat();
case MAIN2:
return this.getLblMain2();
case END_OF_TURN:
return this.getLblEndTurn();
case CLEANUP:
return this.getLblCleanup();
default:
return null;
}
}
/**
* Resets all phase buttons to "inactive", so highlight won't be drawn on
* them. "Enabled" state remains the same.
*/
public void resetPhaseButtons() {
getLblUpkeep().setActive(false);
getLblDraw().setActive(false);
getLblMain1().setActive(false);
getLblBeginCombat().setActive(false);
getLblDeclareAttackers().setActive(false);
getLblDeclareBlockers().setActive(false);
getLblFirstStrike().setActive(false);
getLblCombatDamage().setActive(false);
getLblEndCombat().setActive(false);
getLblMain2().setActive(false);
getLblEndTurn().setActive(false);
getLblCleanup().setActive(false);
}
// Phases
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblUpkeep() {
return this.lblUpkeep;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDraw() {
return this.lblDraw;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblMain1() {
return this.lblMain1;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblBeginCombat() {
return this.lblBeginCombat;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDeclareAttackers() {
return this.lblDeclareAttackers;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblDeclareBlockers() {
return this.lblDeclareBlockers;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblCombatDamage() {
return this.lblCombatDamage;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblFirstStrike() {
return this.lblFirstStrike;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblEndCombat() {
return this.lblEndCombat;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblMain2() {
return this.lblMain2;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblEndTurn() {
return this.lblEndTurn;
}
/** @return {@link javax.swing.JLabel} */
public PhaseLabel getLblCleanup() {
return this.lblCleanup;
}
}

View File

@@ -0,0 +1,138 @@
package forge.gui.toolbox.special;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import forge.gui.toolbox.FSkin;
/**
* Shows phase labels, handles repainting and on/off states. A PhaseLabel
* has "skip" and "active" states, meaning "this phase is (not) skipped" and
* "this is the current phase".
*/
@SuppressWarnings("serial")
public class PhaseLabel extends JLabel {
private boolean enabled = true;
private boolean active = false;
private boolean hover = false;
/**
* Shows phase labels, handles repainting and on/off states. A
* PhaseLabel has "skip" and "active" states, meaning
* "this phase is (not) skipped" and "this is the current phase".
*
* @param txt
* &emsp; Label text
*/
public PhaseLabel(final String txt) {
super(txt);
this.setHorizontalTextPosition(SwingConstants.CENTER);
this.setHorizontalAlignment(SwingConstants.CENTER);
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
if (PhaseLabel.this.enabled) {
PhaseLabel.this.enabled = false;
} else {
PhaseLabel.this.enabled = true;
}
}
@Override
public void mouseEntered(final MouseEvent e) {
PhaseLabel.this.hover = true;
PhaseLabel.this.repaintOnlyThisLabel();
}
@Override
public void mouseExited(final MouseEvent e) {
PhaseLabel.this.hover = false;
PhaseLabel.this.repaintOnlyThisLabel();
}
});
}
/**
* Determines whether play pauses at this phase or not.
*
* @param b
* &emsp; boolean, true if play pauses
*/
@Override
public void setEnabled(final boolean b) {
this.enabled = b;
}
/**
* Determines whether play pauses at this phase or not.
*
* @return boolean
*/
public boolean getEnabled() {
return this.enabled;
}
/**
* Makes this phase the current phase (or not).
*
* @param b
* &emsp; boolean, true if phase is current
*/
public void setActive(final boolean b) {
this.active = b;
this.repaintOnlyThisLabel();
}
/**
* Determines if this phase is the current phase (or not).
*
* @return boolean
*/
public boolean getActive() {
return this.active;
}
/** Prevent label from repainting the whole screen. */
public void repaintOnlyThisLabel() {
final Dimension d = PhaseLabel.this.getSize();
repaint(0, 0, d.width, d.height);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
@Override
public void paintComponent(final Graphics g) {
final int w = this.getWidth();
final int h = this.getHeight();
Color c;
// Set color according to skip or active or hover state of label
if (this.hover) {
c = FSkin.getColor(FSkin.Colors.CLR_HOVER);
} else if (this.active && this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_ACTIVE_ENABLED);
} else if (!this.active && this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_INACTIVE_ENABLED);
} else if (this.active && !this.enabled) {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_ACTIVE_DISABLED);
} else {
c = FSkin.getColor(FSkin.Colors.CLR_PHASE_INACTIVE_DISABLED);
}
// Center vertically and horizontally. Show border if active.
g.setColor(c);
g.fillRoundRect(1, 1, w - 2, h - 2, 5, 5);
super.paintComponent(g);
}
}

View File

@@ -0,0 +1,3 @@
/** Views (as in model-view-controller) for Forge. */
package forge.gui.toolbox.special;

View File

@@ -26,6 +26,7 @@ import forge.gui.home.EMenuItem;
import forge.gui.match.VMatchUI;
import forge.gui.match.nonsingleton.VField;
import forge.gui.match.views.VDev;
import forge.gui.toolbox.special.PhaseIndicator;
public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
/**
@@ -151,7 +152,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
// AI field is at index [1]
VField fvAi = fieldViews.get(1);
PhaseIndicator fvAi = fieldViews.get(1).getPhaseInidicator();
this.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled()));
this.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled()));
this.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled()));
@@ -166,7 +167,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
this.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled()));
// Human field is at index [0]
VField fvHuman = fieldViews.get(0);
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseInidicator();
this.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled()));
this.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled()));
this.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled()));
@@ -197,7 +198,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
Preferences.UPLOAD_DRAFT = Constant.Runtime.NET_CONN && this.getPrefBoolean(FPref.UI_UPLOAD_DRAFT);
// AI field is at index [0]
VField fvAi = fieldViews.get(1);
PhaseIndicator fvAi = fieldViews.get(1).getPhaseInidicator();
fvAi.getLblUpkeep().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
fvAi.getLblDraw().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_DRAW));
fvAi.getLblMain1().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_MAIN1));
@@ -212,7 +213,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
fvAi.getLblCleanup().setEnabled(this.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
// Human field is at index [1]
VField fvHuman = fieldViews.get(0);
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseInidicator();
fvHuman.getLblUpkeep().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
fvHuman.getLblDraw().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
fvHuman.getLblMain1().setEnabled(this.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));

View File

@@ -45,6 +45,7 @@ import forge.gui.framework.SLayoutConstants;
import forge.gui.home.VHomeUI;
import forge.gui.match.TargetingOverlay;
import forge.gui.match.VMatchUI;
import forge.gui.toolbox.CardFaceSymbols;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FOverlay;
@@ -124,6 +125,9 @@ public enum FView {
// Populate all drag tab components.
this.cacheUIStates();
// Does not use progress bar, due to be deprecated with battlefield refactoring.
CardFaceSymbols.loadImages();
// Initialize actions on all drag tab components (which should
// be realized / populated already).
for (EDocID doc : EDocID.values()) {

View File

@@ -75,7 +75,6 @@ public abstract class CardPanelContainer extends JPanel {
private int mouseDragOffsetX, mouseDragOffsetY;
private int intialMouseDragX = -1, intialMouseDragY;
private boolean dragEnabled;
private int zoneID;
/**
* <p>
@@ -583,28 +582,6 @@ public abstract class CardPanelContainer extends JPanel {
return (null == p || p != hoveredPanel) ? null : p.getGameCard();
}
/**
* <p>
* Getter for the field <code>zoneID</code>.
* </p>
*
* @return a int.
*/
public final int getZoneID() {
return this.zoneID;
}
/**
* <p>
* Setter for the field <code>zoneID</code>.
* </p>
*
* @param zoneID
* a int.
*/
public final void setZoneID(final int zoneID) {
this.zoneID = zoneID;
}
/**
* Gets the card panels.