forked from External/mage
- reworked skip and phase buttons to use layouts instead IDE designer; - added GUI scale support skip and phase buttons (depend on dialogs font size from preferences settings);
This commit is contained in:
parent
8186b35dfb
commit
1d701df0e8
8 changed files with 274 additions and 144 deletions
|
|
@ -29,6 +29,7 @@ import mage.constants.*;
|
|||
import mage.game.events.PlayerQueryEvent;
|
||||
import mage.players.PlayableObjectStats;
|
||||
import mage.players.PlayableObjectsList;
|
||||
import mage.util.DebugUtil;
|
||||
import mage.util.MultiAmountMessage;
|
||||
import mage.view.*;
|
||||
import org.apache.log4j.Logger;
|
||||
|
|
@ -64,7 +65,12 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
|
||||
private static final Logger logger = Logger.getLogger(GamePanel.class);
|
||||
private static final String YOUR_HAND = "Your hand";
|
||||
private static final int X_PHASE_WIDTH = 55;
|
||||
|
||||
private static final int SKIP_BUTTONS_SPACE_H = 3;
|
||||
private static final int SKIP_BUTTONS_SPACE_V = 3;
|
||||
|
||||
private static final int PHASE_BUTTONS_SPACE_H = 3;
|
||||
private static final int PHASE_BUTTONS_SPACE_V = 3;
|
||||
|
||||
private static final String CMD_AUTO_ORDER_FIRST = "cmdAutoOrderFirst";
|
||||
private static final String CMD_AUTO_ORDER_LAST = "cmdAutoOrderLast";
|
||||
|
|
@ -188,6 +194,27 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
initComponents = true;
|
||||
initComponents();
|
||||
|
||||
// prepare commands buttons panel with flow layout (instead custom from IDE)
|
||||
// size changes in helper method at the end
|
||||
// TODO: remove IDE form file (it useless anyway due many custom code in init)
|
||||
if (DebugUtil.GUI_GAME_DRAW_COMMAND_BUTTONS_PANEL_BORDER) {
|
||||
pnlShortCuts.setBorder(BorderFactory.createLineBorder(Color.red));
|
||||
}
|
||||
pnlShortCuts.removeAll();
|
||||
pnlShortCuts.setLayout(null); // real layout on size settings
|
||||
pnlShortCuts.add(btnSkipToNextTurn);
|
||||
pnlShortCuts.add(btnSkipToEndTurn);
|
||||
pnlShortCuts.add(btnSkipToNextMain);
|
||||
pnlShortCuts.add(btnSkipToYourTurn);
|
||||
pnlShortCuts.add(btnSkipStack);
|
||||
pnlShortCuts.add(btnSkipToEndStepBeforeYourTurn);
|
||||
pnlShortCuts.add(txtHoldPriority);
|
||||
//pnlShortCuts.add(btnToggleMacro);
|
||||
pnlShortCuts.add(btnSwitchHands);
|
||||
pnlShortCuts.add(btnCancelSkip);
|
||||
pnlShortCuts.add(btnConcede);
|
||||
pnlShortCuts.add(btnStopWatching);
|
||||
|
||||
pickNumber = new PickNumberDialog();
|
||||
MageFrame.getDesktop().add(pickNumber, JLayeredPane.MODAL_LAYER);
|
||||
|
||||
|
|
@ -426,7 +453,7 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
|
||||
// hand + stack panels
|
||||
// the stack takes up a portion of the possible space (GUISizeHelper.stackWidth)
|
||||
|
||||
// TODO: research and delete rare used settings
|
||||
int newStackWidth = pnlHelperHandButtonsStackArea.getWidth() * GUISizeHelper.stackWidth / 100;
|
||||
newStackWidth = Math.max(410, newStackWidth);
|
||||
Dimension newDimension = new Dimension(
|
||||
|
|
@ -451,11 +478,48 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
userChatPanel.changeGUISize(GUISizeHelper.chatFont);
|
||||
gameChatPanel.changeGUISize(GUISizeHelper.chatFont);
|
||||
|
||||
// skip buttons
|
||||
newDimension = new Dimension(newStackWidth, (int) pnlShortCuts.getPreferredSize().getHeight());
|
||||
// skip buttons - sizes
|
||||
// must be able to put controls in 2 rows
|
||||
float guiScale = GUISizeHelper.dialogGuiScale;
|
||||
int hGap = GUISizeHelper.guiSizeScale(SKIP_BUTTONS_SPACE_H, guiScale);
|
||||
int vGap = GUISizeHelper.guiSizeScale(SKIP_BUTTONS_SPACE_V, guiScale);
|
||||
newDimension = new Dimension(newStackWidth, (4 * vGap) + (2 * GUISizeHelper.gameCommandButtonHeight));
|
||||
pnlShortCuts.setLayout(new FlowLayout(FlowLayout.RIGHT, hGap, vGap));
|
||||
pnlShortCuts.setPreferredSize(newDimension);
|
||||
pnlShortCuts.setMinimumSize(newDimension);
|
||||
pnlShortCuts.setMaximumSize(newDimension);
|
||||
// skip buttons - sizes
|
||||
Dimension strictSize = new Dimension(2 * GUISizeHelper.gameCommandButtonHeight, GUISizeHelper.gameCommandButtonHeight);
|
||||
setSkipButtonSize(btnCancelSkip, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipToNextTurn, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipToEndTurn, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipToEndStepBeforeYourTurn, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipToYourTurn, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipToNextMain, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSkipStack, guiScale, strictSize);
|
||||
setSkipButtonSize(btnConcede, guiScale, strictSize);
|
||||
setSkipButtonSize(btnToggleMacro, guiScale, strictSize);
|
||||
setSkipButtonSize(btnSwitchHands, guiScale, strictSize);
|
||||
setSkipButtonSize(btnStopWatching, guiScale, strictSize);
|
||||
pnlShortCuts.invalidate();
|
||||
|
||||
// phase buttons - sizes
|
||||
int buttonSize = GUISizeHelper.gamePhaseButtonSize;
|
||||
guiScale = GUISizeHelper.dialogGuiScale;
|
||||
hGap = GUISizeHelper.guiSizeScale(PHASE_BUTTONS_SPACE_H, guiScale);
|
||||
vGap = GUISizeHelper.guiSizeScale(PHASE_BUTTONS_SPACE_V, guiScale);
|
||||
BoxLayout layout = new BoxLayout(jPhases, BoxLayout.Y_AXIS);
|
||||
jPhases.setLayout(layout);
|
||||
int fullPhaseWidth = Math.round(1.5f * GUISizeHelper.gamePhaseButtonSize);
|
||||
jPhases.setPreferredSize(new Dimension(fullPhaseWidth, (vGap * phaseButtons.size()) + (buttonSize * phaseButtons.size())));
|
||||
jPhases.setMaximumSize(new Dimension(fullPhaseWidth, Short.MAX_VALUE));
|
||||
phaseButtons.forEach((phaseName, phaseButton) -> {
|
||||
phaseButton.setPreferredSize(new Dimension(buttonSize, buttonSize));
|
||||
});
|
||||
// phase buttons - active size
|
||||
if (lastGameData.game != null) {
|
||||
updateActivePhase(lastGameData.game.getStep());
|
||||
}
|
||||
|
||||
if (themeReload) {
|
||||
reloadThemeRelatedGraphic();
|
||||
|
|
@ -463,18 +527,19 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
}
|
||||
|
||||
private void reloadThemeRelatedGraphic() {
|
||||
// skip buttons
|
||||
btnCancelSkip.setIcon(new ImageIcon(ImageManagerImpl.instance.getCancelSkipButtonImage()));
|
||||
btnSkipToNextTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipNextTurnButtonImage()));
|
||||
btnSkipToEndTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndTurnButtonImage()));
|
||||
btnSkipToEndStepBeforeYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipEndStepBeforeYourTurnButtonImage()));
|
||||
btnSkipToYourTurn.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipYourNextTurnButtonImage()));
|
||||
btnSkipToNextMain.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipMainButtonImage()));
|
||||
btnSkipStack.setIcon(new ImageIcon(ImageManagerImpl.instance.getSkipStackButtonImage()));
|
||||
btnConcede.setIcon(new ImageIcon(ImageManagerImpl.instance.getConcedeButtonImage()));
|
||||
btnToggleMacro.setIcon(new ImageIcon(ImageManagerImpl.instance.getToggleRecordMacroButtonImage()));
|
||||
btnSwitchHands.setIcon(new ImageIcon(ImageManagerImpl.instance.getSwitchHandsButtonImage()));
|
||||
btnStopWatching.setIcon(new ImageIcon(ImageManagerImpl.instance.getStopWatchButtonImage()));
|
||||
// skip buttons - images
|
||||
int buttonHeight = GUISizeHelper.gameCommandButtonHeight;
|
||||
setSkipButtonImage(btnCancelSkip, ImageManagerImpl.instance.getCancelSkipButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipToNextTurn, ImageManagerImpl.instance.getSkipNextTurnButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipToEndTurn, ImageManagerImpl.instance.getSkipEndTurnButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipToEndStepBeforeYourTurn, ImageManagerImpl.instance.getSkipEndStepBeforeYourTurnButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipToYourTurn, ImageManagerImpl.instance.getSkipYourNextTurnButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipToNextMain, ImageManagerImpl.instance.getSkipMainButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSkipStack, ImageManagerImpl.instance.getSkipStackButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnConcede, ImageManagerImpl.instance.getConcedeButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnToggleMacro, ImageManagerImpl.instance.getToggleRecordMacroButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnSwitchHands, ImageManagerImpl.instance.getSwitchHandsButtonImage(buttonHeight));
|
||||
setSkipButtonImage(btnStopWatching, ImageManagerImpl.instance.getStopWatchButtonImage(buttonHeight));
|
||||
|
||||
// hotkeys for skip buttons
|
||||
boolean displayButtonText = PreferencesDialog.getCurrentTheme().isShortcutsVisibleForSkipButtons();
|
||||
|
|
@ -489,7 +554,9 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
|
||||
// phase buttons
|
||||
phaseButtons.forEach((phaseName, phaseButton) -> {
|
||||
phaseButton.update(phaseButton.getText(), ImageManagerImpl.instance.getPhaseImage(phaseName));
|
||||
Image buttonImage = ImageManagerImpl.instance.getPhaseImage(phaseName, GUISizeHelper.gamePhaseButtonSize);
|
||||
Rectangle buttonRect = new Rectangle(buttonImage.getWidth(null), buttonImage.getHeight(null));
|
||||
phaseButton.update(phaseButton.getText(), buttonImage, buttonImage, buttonImage, buttonImage, buttonRect);
|
||||
});
|
||||
|
||||
// player panels
|
||||
|
|
@ -513,6 +580,22 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
private void setSkipButtonImage(JButton button, Image image) {
|
||||
button.setIcon(new ImageIcon(image));
|
||||
}
|
||||
|
||||
private void setSkipButtonSize(JComponent button, float guiScale, Dimension size) {
|
||||
if (button instanceof KeyboundButton) {
|
||||
((KeyboundButton) button).updateGuiScale(guiScale);
|
||||
}
|
||||
|
||||
// no needs in size - it controlled by button's icon
|
||||
if (true) return;
|
||||
button.setMinimumSize(size);
|
||||
button.setPreferredSize(size);
|
||||
button.setMaximumSize(size);
|
||||
}
|
||||
|
||||
private void saveDividerLocations() {
|
||||
// save panel sizes and divider locations.
|
||||
Rectangle rec = MageFrame.getDesktop().getBounds();
|
||||
|
|
@ -564,7 +647,6 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
bigCard.setMinimumSize(bbDimension);
|
||||
bigCard.setPreferredSize(bbDimension);
|
||||
pnlShortCuts.revalidate();
|
||||
pnlShortCuts.repaint();
|
||||
for (PlayAreaPanel p : players.values()) {
|
||||
p.getPlayerPanel().sizePlayerPanel(smallMode);
|
||||
}
|
||||
|
|
@ -576,7 +658,6 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
bigCard.setMinimumSize(bbDimension);
|
||||
bigCard.setPreferredSize(bbDimension);
|
||||
pnlShortCuts.revalidate();
|
||||
pnlShortCuts.repaint();
|
||||
for (PlayAreaPanel p : players.values()) {
|
||||
p.getPlayerPanel().sizePlayerPanel(smallMode);
|
||||
}
|
||||
|
|
@ -893,7 +974,7 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
}
|
||||
|
||||
if (lastGameData.game.getStep() != null) {
|
||||
updatePhases(lastGameData.game.getStep());
|
||||
updateActivePhase(lastGameData.game.getStep());
|
||||
this.txtStep.setText(lastGameData.game.getStep().toString());
|
||||
} else {
|
||||
logger.debug("Step is empty");
|
||||
|
|
@ -1261,63 +1342,63 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
this.stackObjects.loadCards(game.getStack(), bigCard, gameId, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update phase buttons\labels.
|
||||
*/
|
||||
private void updatePhases(PhaseStep step) {
|
||||
if (step == null) {
|
||||
logger.warn("step is null");
|
||||
private void updateActivePhase(PhaseStep currentStep) {
|
||||
if (currentStep == null) {
|
||||
return;
|
||||
}
|
||||
if (currentStep != null) {
|
||||
currentStep.setLocation(prevPoint);
|
||||
}
|
||||
switch (step) {
|
||||
|
||||
switch (currentStep) {
|
||||
case UNTAP:
|
||||
updateButton("Untap");
|
||||
updatePhaseButtons("Untap");
|
||||
break;
|
||||
case UPKEEP:
|
||||
updateButton("Upkeep");
|
||||
updatePhaseButtons("Upkeep");
|
||||
break;
|
||||
case DRAW:
|
||||
updateButton("Draw");
|
||||
updatePhaseButtons("Draw");
|
||||
break;
|
||||
case PRECOMBAT_MAIN:
|
||||
updateButton("Main1");
|
||||
updatePhaseButtons("Main1");
|
||||
break;
|
||||
case BEGIN_COMBAT:
|
||||
updateButton("Combat_Start");
|
||||
updatePhaseButtons("Combat_Start");
|
||||
break;
|
||||
case DECLARE_ATTACKERS:
|
||||
updateButton("Combat_Attack");
|
||||
updatePhaseButtons("Combat_Attack");
|
||||
break;
|
||||
case DECLARE_BLOCKERS:
|
||||
updateButton("Combat_Block");
|
||||
updatePhaseButtons("Combat_Block");
|
||||
break;
|
||||
case FIRST_COMBAT_DAMAGE:
|
||||
case COMBAT_DAMAGE:
|
||||
updateButton("Combat_Damage");
|
||||
updatePhaseButtons("Combat_Damage");
|
||||
break;
|
||||
case END_COMBAT:
|
||||
updateButton("Combat_End");
|
||||
updatePhaseButtons("Combat_End");
|
||||
break;
|
||||
case POSTCOMBAT_MAIN:
|
||||
updateButton("Main2");
|
||||
updatePhaseButtons("Main2");
|
||||
break;
|
||||
case END_TURN:
|
||||
updateButton("Cleanup");
|
||||
case CLEANUP:
|
||||
updatePhaseButtons("Cleanup");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void updateButton(String name) {
|
||||
if (phaseButtons.containsKey(name)) {
|
||||
currentStep = phaseButtons.get(name);
|
||||
prevPoint = currentStep.getLocation();
|
||||
currentStep.setLocation(prevPoint.x - 15, prevPoint.y);
|
||||
}
|
||||
private void updatePhaseButtons(String currentPhaseName) {
|
||||
phaseButtons.forEach((phaseName, phaseButton) -> {
|
||||
if (phaseName.equals(currentPhaseName)) {
|
||||
//phaseButton.setBorder(this.phaseButtonBorderActive);
|
||||
phaseButton.setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||
} else {
|
||||
//phaseButton.setBorder(this.phaseButtonBorderInactive);
|
||||
phaseButton.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
}
|
||||
});
|
||||
jPhases.invalidate();
|
||||
}
|
||||
|
||||
// Called if the game frame is deactivated because the tabled the deck editor or other frames go to foreground
|
||||
|
|
@ -2530,8 +2611,7 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
|
||||
jPhases = new JPanel();
|
||||
jPhases.setBackground(new Color(0, 0, 0, 0));
|
||||
jPhases.setLayout(null);
|
||||
jPhases.setPreferredSize(new Dimension(X_PHASE_WIDTH, 435));
|
||||
// layout on gui size
|
||||
|
||||
MouseAdapter phasesMouseAdapter = new MouseAdapter() {
|
||||
@Override
|
||||
|
|
@ -2539,6 +2619,11 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
mouseClickPhaseBar(evt);
|
||||
}
|
||||
};
|
||||
|
||||
/// phase buttons
|
||||
if (DebugUtil.GUI_GAME_DRAW_PHASE_BUTTONS_PANEL_BORDER) {
|
||||
jPhases.setBorder(BorderFactory.createLineBorder(Color.red));
|
||||
}
|
||||
String[] phases = {"Untap", "Upkeep", "Draw", "Main1",
|
||||
"Combat_Start", "Combat_Attack", "Combat_Block", "Combat_Damage", "Combat_End",
|
||||
"Main2", "Cleanup", "Next_Turn"};
|
||||
|
|
@ -2546,15 +2631,6 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
createPhaseButton(name, phasesMouseAdapter);
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (String name : phaseButtons.keySet()) {
|
||||
HoverButton hoverButton = phaseButtons.get(name);
|
||||
hoverButton.setAlignmentX(LEFT_ALIGNMENT);
|
||||
hoverButton.setBounds(X_PHASE_WIDTH - 36, i * 36, 36, 36);
|
||||
jPhases.add(hoverButton);
|
||||
i++;
|
||||
}
|
||||
|
||||
pnlReplay.setOpaque(false);
|
||||
|
||||
helper = new HelperPanel();
|
||||
|
|
@ -2938,12 +3014,14 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
}
|
||||
|
||||
private void createPhaseButton(String name, MouseAdapter mouseAdapter) {
|
||||
Rectangle rect = new Rectangle(36, 36);
|
||||
HoverButton button = new HoverButton("", ImageManagerImpl.instance.getPhaseImage(name), rect);
|
||||
int buttonSize = GUISizeHelper.gamePhaseButtonSize;
|
||||
Rectangle rect = new Rectangle(buttonSize, buttonSize);
|
||||
HoverButton button = new HoverButton("", ImageManagerImpl.instance.getPhaseImage(name, buttonSize), rect);
|
||||
button.setToolTipText(name.replaceAll("_", " "));
|
||||
button.setPreferredSize(new Dimension(36, 36));
|
||||
button.setPreferredSize(new Dimension(buttonSize, buttonSize));
|
||||
button.addMouseListener(mouseAdapter);
|
||||
phaseButtons.put(name, button);
|
||||
jPhases.add(button);
|
||||
}
|
||||
|
||||
// Event listener for the ShowCardsDialog
|
||||
|
|
@ -3156,9 +3234,6 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
private JPanel phasesContainer;
|
||||
private javax.swing.JLabel txtHoldPriority;
|
||||
|
||||
private HoverButton currentStep;
|
||||
private Point prevPoint;
|
||||
|
||||
private boolean imagePanelState;
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue