From ee75192f0a74d50b127a2a167d6b50c94136b5a9 Mon Sep 17 00:00:00 2001 From: Failure Date: Sat, 15 Feb 2025 20:59:50 -0800 Subject: [PATCH] vertical layout --- .../java/mage/client/constants/Constants.java | 20 +++++++ .../mage/client/dialog/PreferencesDialog.form | 5 ++ .../mage/client/dialog/PreferencesDialog.java | 12 +++++ .../main/java/mage/client/game/GamePanel.java | 54 ++++++++++++++----- pom.xml | 4 ++ 5 files changed, 83 insertions(+), 12 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/constants/Constants.java b/Mage.Client/src/main/java/mage/client/constants/Constants.java index 509a4a22ce8..009cb812530 100644 --- a/Mage.Client/src/main/java/mage/client/constants/Constants.java +++ b/Mage.Client/src/main/java/mage/client/constants/Constants.java @@ -21,6 +21,26 @@ public final class Constants { } public static final ImmutableList> foulMagicsSets = ImmutableList.of( + new Pair("Set 2.5 - Ravnica Cultural Exchange", new String[] { + "* March of the Machine Block", + "* Phyrexia: All Will Be One Block", + "* The Brothers' War Block", + "* Dominaria United Block", + "* Kamigawa: Neon Dynasty Block", + "* Theros Beyond Death Block", + "* Strixhaven: School of Mages Block", + "* The Lost Caverns of Ixalan Block", + "* Ikoria: Lair of Behemoths Block", + "* Adventures in the Forgotten Realms Block", + "Modern Horizons 3", + "The Lord of the Rings: Tales of Middle-earth", + "Double Masters 2022", + "Rise of the Eldrazi", + "Modern Horizons 2", + "* Foundations Block", + "* Guilds of Ravnica Block", + "* Return to Ravnica Block", + }), new Pair("Set 2 - Phyrexians, Eldrazi, Asians - Oh my!", new String[] { "* March of the Machine Block", "* Phyrexia: All Will Be One Block", diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form index 2fb5afdb761..875c0c2033d 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form @@ -1332,6 +1332,11 @@ + + + + + diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java index 94238a49468..7d5c5267e20 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java @@ -70,6 +70,9 @@ public class PreferencesDialog extends javax.swing.JDialog { public static final String KEY_GAME_USE_PROFANITY_FILTER = "gameUseProfanityFilter"; // size settings + public static final String KEY_GUI_VERTICAL_LAYOUT = "guiVerticalLayoyut"; + + public static final String KEY_GUI_CARD_BATTLEFIELD_SIZE = "guiCardBattlefieldSize"; public static final String KEY_GUI_CARD_HAND_SIZE = "guiCardHandSize"; public static final String KEY_GUI_CARD_EDITOR_SIZE = "guiCardEditorSize"; @@ -866,6 +869,7 @@ public class PreferencesDialog extends javax.swing.JDialog { buttonSizeDefault4 = new javax.swing.JButton(); buttonSizeDefault5 = new javax.swing.JButton(); buttonSizeDefault6 = new javax.swing.JButton(); + cbVerticalLayout = new javax.swing.JCheckBox(); panelSizeDetailedSettings = new javax.swing.JPanel(); labelSizeGroup1 = new javax.swing.JLabel(); panelSize1 = new javax.swing.JPanel(); @@ -1735,6 +1739,9 @@ public class PreferencesDialog extends javax.swing.JDialog { buttonSizeDefault6.setText("set to default"); panelSizeDefaultSettings.add(buttonSizeDefault6); + + cbVerticalLayout.setText("Vertical Layout (Experimental)"); + panelSizeDetailedSettings.add(cbVerticalLayout); panelSizeDetailedSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Detailed settings")); panelSizeDetailedSettings.setLayout(new java.awt.GridLayout(16, 1)); @@ -2991,6 +2998,8 @@ public class PreferencesDialog extends javax.swing.JDialog { prefs.putInt(paramName, paramValue); updateCache(paramName, Integer.toString(paramValue)); } + // Hopefully this works + save(prefs, dialog.cbVerticalLayout, KEY_GUI_VERTICAL_LAYOUT, "true", "false"); saveGUISize(false, false); @@ -3416,6 +3425,8 @@ public class PreferencesDialog extends javax.swing.JDialog { load(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true"); load(prefs, dialog.cbLimitedDeckAutoSave, KEY_LIMITED_DECK_AUTO_SAVE, "true"); load(prefs, dialog.cbGameJsonLogAutoSave, KEY_JSON_GAME_LOG_AUTO_SAVE, "true", "false"); + + load(prefs, dialog.cbVerticalLayout, KEY_GUI_VERTICAL_LAYOUT, "true", "false"); String autoTargetParam; try { @@ -4073,6 +4084,7 @@ public class PreferencesDialog extends javax.swing.JDialog { private javax.swing.JCheckBox cbUseDefaultImageFolder; private javax.swing.JCheckBox cbUseRandomBattleImage; private javax.swing.JCheckBox cbUseSameSettingsForReplacementEffect; + private javax.swing.JCheckBox cbVerticalLayout; private javax.swing.JCheckBox checkBoxBeforeCOthers; private javax.swing.JCheckBox checkBoxBeforeCYou; private javax.swing.JCheckBox checkBoxDrawOthers; diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 56d4e666592..987db75da17 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -131,6 +131,8 @@ public final class GamePanel extends javax.swing.JPanel { private final Map splitters = new LinkedHashMap<>(); // settings key, splitter // do not save splitters in intermediate state, e.g. connection to new server with active game private boolean isSplittersFullyRestored = false; + + private boolean vertical = false; public static class MageSplitter { JSplitPane splitPane; @@ -228,6 +230,7 @@ public final class GamePanel extends javax.swing.JPanel { } public GamePanel() { + this.vertical = PreferencesDialog.getCachedValue(KEY_GUI_VERTICAL_LAYOUT, "false").equals("true"); initComponents = true; initComponents(); @@ -259,9 +262,16 @@ public final class GamePanel extends javax.swing.JPanel { pnlCommandsSkipAndStack.add(pnlShortCuts, BorderLayout.NORTH); pnlCommandsSkipAndStack.add(stackObjects, BorderLayout.CENTER); // ... split: feedback + hand <|> skip + stack - splitHandAndStack.setLeftComponent(pnlCommandsFeedbackAndHand); - splitHandAndStack.setRightComponent(pnlCommandsSkipAndStack); - splitHandAndStack.setResizeWeight(DIVIDER_KEEP_RIGHT_COMPONENT); + if (vertical) { + splitHandAndStack.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + splitHandAndStack.setBottomComponent(pnlCommandsFeedbackAndHand); + splitHandAndStack.setTopComponent(pnlCommandsSkipAndStack); + splitHandAndStack.setResizeWeight(DIVIDER_KEEP_RIGHT_COMPONENT); + } else { + splitHandAndStack.setLeftComponent(pnlCommandsFeedbackAndHand); + splitHandAndStack.setRightComponent(pnlCommandsSkipAndStack); + splitHandAndStack.setResizeWeight(DIVIDER_KEEP_RIGHT_COMPONENT); + } pnlCommandsFeedbackAndHand.setMinimumSize(new Dimension(0, 0)); // allow any sizes for hand pnlCommandsSkipAndStack.setMinimumSize(new Dimension(0, 0)); // allow any sizes for stack // ... all @@ -302,7 +312,9 @@ public final class GamePanel extends javax.swing.JPanel { final JLayeredPane jLayeredBackgroundPane = new JLayeredPane(); jLayeredBackgroundPane.setSize(1024, 768); this.add(jLayeredBackgroundPane); - jLayeredBackgroundPane.add(splitGameAndBigCard, JLayeredPane.DEFAULT_LAYER); + var basePane = this.vertical ? splitBattlefieldAndChats : splitGameAndBigCard; + jLayeredBackgroundPane.add(basePane, JLayeredPane.DEFAULT_LAYER); + Map myUi = getUIComponents(jLayeredBackgroundPane); Plugins.instance.updateGamePanel(myUi); @@ -314,7 +326,7 @@ public final class GamePanel extends javax.swing.JPanel { int width = ((JComponent) e.getSource()).getWidth(); int height = ((JComponent) e.getSource()).getHeight(); jLayeredBackgroundPane.setSize(width, height); - splitGameAndBigCard.setSize(width, height); + basePane.setSize(width, height); if (height < storedHeight) { // TODO: wtf, is it needs? Research and delete that code with storedHeight @@ -552,7 +564,11 @@ public final class GamePanel extends javax.swing.JPanel { float guiScale = GUISizeHelper.dialogGuiScale; int hGap = GUISizeHelper.guiSizeScale(SKIP_BUTTONS_SPACE_H, guiScale); int vGap = GUISizeHelper.guiSizeScale(SKIP_BUTTONS_SPACE_V, guiScale); - pnlShortCuts.setLayout(new FlowLayout(FlowLayout.RIGHT, hGap, vGap)); + if (vertical) { + pnlShortCuts.setLayout(new FlowLayout(FlowLayout.CENTER, 1, vGap)); + } else { + pnlShortCuts.setLayout(new FlowLayout(FlowLayout.RIGHT, hGap, vGap)); + } // skip buttons - sizes Dimension strictSize = new Dimension(2 * GUISizeHelper.gameCommandButtonHeight, GUISizeHelper.gameCommandButtonHeight); setSkipButtonSize(btnCancelSkip, guiScale, strictSize); @@ -2274,7 +2290,7 @@ public final class GamePanel extends javax.swing.JPanel { } @SuppressWarnings("unchecked") - private void initComponents() { + private boolean initComponents() { abilityPicker = new mage.client.components.ability.AbilityPicker(GUISizeHelper.dialogGuiScale); pnlHelperHandButtonsStackArea = new javax.swing.JPanel(); pnlShortCuts = new javax.swing.JPanel(); @@ -2358,7 +2374,11 @@ public final class GamePanel extends javax.swing.JPanel { // split: chat <|> game logs splitChatAndLogs = new javax.swing.JSplitPane(); - splitChatAndLogs.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + if (vertical) { + splitChatAndLogs.setOrientation(javax.swing.JSplitPane.HORIZONTAL_SPLIT); + } else { + splitChatAndLogs.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + } splitChatAndLogs.setResizeWeight(DIVIDER_KEEP_LEFT_COMPONENT); splitChatAndLogs.setTopComponent(userChatPanel); splitChatAndLogs.setBottomComponent(gameChatPanel); @@ -2368,8 +2388,15 @@ public final class GamePanel extends javax.swing.JPanel { splitBattlefieldAndChats.setBorder(null); splitBattlefieldAndChats.setResizeWeight(DIVIDER_KEEP_RIGHT_COMPONENT); splitBattlefieldAndChats.setOneTouchExpandable(true); - splitBattlefieldAndChats.setLeftComponent(pnlHelperHandButtonsStackArea); - splitBattlefieldAndChats.setRightComponent(splitChatAndLogs); + + if (vertical) { + splitBattlefieldAndChats.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + splitBattlefieldAndChats.setBottomComponent(pnlHelperHandButtonsStackArea); + splitBattlefieldAndChats.setTopComponent(splitChatAndLogs); + } else { + splitBattlefieldAndChats.setLeftComponent(pnlHelperHandButtonsStackArea); + splitBattlefieldAndChats.setRightComponent(splitChatAndLogs); + } // warning, it's important to store/restore splitters in same order as real life GUI // from outer to inner (otherwise panels will be hidden or weird) @@ -2752,7 +2779,10 @@ public final class GamePanel extends javax.swing.JPanel { // split: game <|> chat/log splitGameAndBigCard.setLeftComponent(splitBattlefieldAndChats); - splitGameAndBigCard.setRightComponent(bigCardPanel); + if (!vertical) { + splitGameAndBigCard.setRightComponent(bigCardPanel); + } + return vertical; } private void removeListener() { @@ -2820,7 +2850,7 @@ public final class GamePanel extends javax.swing.JPanel { this.btnSkipForward.removeActionListener(al); } - final BasicSplitPaneUI myUi = (BasicSplitPaneUI) splitGameAndBigCard.getUI(); + final BasicSplitPaneUI myUi = vertical ? (BasicSplitPaneUI) splitBattlefieldAndChats.getUI() : (BasicSplitPaneUI) splitGameAndBigCard.getUI(); final BasicSplitPaneDivider divider = myUi.getDivider(); final JButton upArrowButton = (JButton) divider.getComponent(0); for (ActionListener al : upArrowButton.getActionListeners()) { diff --git a/pom.xml b/pom.xml index feb6a458482..a9f8e251668 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,10 @@ org.apache.maven.plugins maven-compiler-plugin + + 11 + 11 +