Update render mode selection (#13579)

* Update render mode selection

* changes render mode selection to a drop-down
* modes include MTGO, Image, Forced M15, Forced Retro
* debug card test panel updated with additional modes as well

* Update wording on tooltips and update debug panel combobox

* Update CardRenderMode to have id
This commit is contained in:
Jmlundeen 2025-05-28 08:46:27 -05:00 committed by GitHub
parent fa85541fc5
commit c936442ea6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 218 additions and 67 deletions

View file

@ -2183,7 +2183,7 @@
<Component id="panelCardStyles" min="-2" max="-2" attributes="0"/> <Component id="panelCardStyles" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="panelCardImages" min="-2" max="-2" attributes="0"/> <Component id="panelCardImages" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="306" max="32767" attributes="0"/> <EmptySpace pref="309" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
@ -2224,7 +2224,7 @@
<Component id="cbPreferredImageLanguage" min="-2" pref="153" max="-2" attributes="0"/> <Component id="cbPreferredImageLanguage" min="-2" pref="153" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace min="0" pref="480" max="32767" attributes="0"/> <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
@ -2283,7 +2283,6 @@
</Component> </Component>
<Component class="javax.swing.JComboBox" name="cbPreferredImageLanguage"> <Component class="javax.swing.JComboBox" name="cbPreferredImageLanguage">
<Properties> <Properties>
<Property name="maximumRowCount" type="int" value="20"/>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="4"> <StringArray count="4">
<StringItem index="0" value="Item 1"/> <StringItem index="0" value="Item 1"/>
@ -2318,15 +2317,48 @@
</Property> </Property>
</Properties> </Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"> <Layout>
<Property name="axis" type="int" value="1"/> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="cbCardRenderIconsForAbilities" min="-2" max="-2" attributes="0"/>
<Component id="cbCardRenderIconsForPlayable" min="-2" max="-2" attributes="0"/>
<Component id="jSeparator1" min="-2" pref="775" max="-2" attributes="0"/>
<Component id="cbCardRenderShowReminderText" min="-2" max="-2" attributes="0"/>
<Component id="cbCardRenderHideSetSymbol" min="-2" max="-2" attributes="0"/>
<Component id="cbCardRenderShowAbilityTextOverlay" min="-2" max="-2" attributes="0"/>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="6" max="-2" attributes="0"/>
<Component id="labelRenderMode" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="cbCardRenderImageFallback" min="-2" pref="122" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Group type="103" groupAlignment="3" attributes="0">
<Component id="labelRenderMode" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="cbCardRenderImageFallback" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="cbCardRenderIconsForAbilities" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="cbCardRenderIconsForPlayable" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="jSeparator1" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="cbCardRenderShowReminderText" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="cbCardRenderHideSetSymbol" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="cbCardRenderShowAbilityTextOverlay" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Component class="javax.swing.JCheckBox" name="cbCardRenderImageFallback">
<Properties>
<Property name="text" type="java.lang.String" value="Render mode: MTGO style (off) or IMAGE style (on)"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbCardRenderIconsForAbilities"> <Component class="javax.swing.JCheckBox" name="cbCardRenderIconsForAbilities">
<Properties> <Properties>
<Property name="text" type="java.lang.String" value="Enable card icons for abilities (example: flying, deathtouch)"/> <Property name="text" type="java.lang.String" value="Enable card icons for abilities (example: flying, deathtouch)"/>
@ -2354,6 +2386,28 @@
<Property name="text" type="java.lang.String" value="Show ability text as overlay in big card view"/> <Property name="text" type="java.lang.String" value="Show ability text as overlay in big card view"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JLabel" name="labelRenderMode">
<Properties>
<Property name="text" type="java.lang.String" value="Render Mode:"/>
<Property name="toolTipText" type="java.lang.String" value="&lt;HTML&gt;Image - Renders card image with text overlay&lt;br&gt; MTGO - Renders card frame around card art&lt;br&gt; Forced M15 - Renders all cards in the modern frame&lt;br&gt; Forced Retro - Renders all cards in the retro frame"/>
</Properties>
</Component>
<Component class="javax.swing.JComboBox" name="cbCardRenderImageFallback">
<Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="4">
<StringItem index="0" value="Item 1"/>
<StringItem index="1" value="Item 2"/>
<StringItem index="2" value="Item 3"/>
<StringItem index="3" value="Item 4"/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value="&lt;HTML&gt;Image - Renders card image with text overlay&lt;br&gt; MTGO - Renders card frame around card art&lt;br&gt; Forced M15 - Renders all cards in the MTGO style with the modern frame&lt;br&gt; Forced Retro - Renders all cards in the MTGO style with the retro frame"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/>
</AuxValues>
</Component>
</SubComponents> </SubComponents>
</Container> </Container>
</SubComponents> </SubComponents>

View file

@ -4,10 +4,7 @@ import mage.client.MageFrame;
import mage.client.SessionHandler; import mage.client.SessionHandler;
import mage.client.components.KeyBindButton; import mage.client.components.KeyBindButton;
import mage.client.themes.ThemeType; import mage.client.themes.ThemeType;
import mage.client.util.CardLanguage; import mage.client.util.*;
import mage.client.util.ClientDefaultSettings;
import mage.client.util.GUISizeHelper;
import mage.client.util.ImageHelper;
import mage.client.util.audio.MusicPlayer; import mage.client.util.audio.MusicPlayer;
import mage.client.util.gui.BufferedImageBuilder; import mage.client.util.gui.BufferedImageBuilder;
import mage.client.util.gui.GuiDisplayUtil; import mage.client.util.gui.GuiDisplayUtil;
@ -37,7 +34,6 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.prefs.BackingStoreException; import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
import java.util.stream.Collectors;
import static mage.client.constants.Constants.AUTO_TARGET_NON_FEEL_BAD; import static mage.client.constants.Constants.AUTO_TARGET_NON_FEEL_BAD;
import static mage.constants.Constants.*; import static mage.constants.Constants.*;
@ -89,8 +85,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_CARD_IMAGES_SAVE_TO_ZIP = "cardImagesSaveToZip"; public static final String KEY_CARD_IMAGES_SAVE_TO_ZIP = "cardImagesSaveToZip";
public static final String KEY_CARD_IMAGES_PREF_LANGUAGE = "cardImagesPreferredImageLaguage"; public static final String KEY_CARD_IMAGES_PREF_LANGUAGE = "cardImagesPreferredImageLaguage";
public static final String KEY_CARD_RENDERING_IMAGE_MODE = "cardRenderingFallback"; public static final String KEY_CARD_RENDERING_IMAGE_MODE = "cardRenderingMode";
public static final String KEY_CARD_RENDERING_ENABLE_RETRO_FRAMES = "cardRenderingRetroFrames";
public static final String KEY_CARD_RENDERING_ICONS_FOR_ABILITIES = "cardRenderingIconsForAbilities"; public static final String KEY_CARD_RENDERING_ICONS_FOR_ABILITIES = "cardRenderingIconsForAbilities";
public static final String KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE = "cardRenderingIconsForPlayable"; public static final String KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE = "cardRenderingIconsForPlayable";
public static final String KEY_CARD_RENDERING_REMINDER_TEXT = "cardRenderingReminderText"; public static final String KEY_CARD_RENDERING_REMINDER_TEXT = "cardRenderingReminderText";
@ -763,6 +758,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
} }
cbPreferredImageLanguage.setModel(new DefaultComboBoxModel<>(CardLanguage.toList())); cbPreferredImageLanguage.setModel(new DefaultComboBoxModel<>(CardLanguage.toList()));
cbCardRenderImageFallback.setModel(new DefaultComboBoxModel<>(CardRenderMode.toList()));
} }
private void createSizeSetting(Integer position, String key, Integer defaultValue, boolean useExample, String name, String hint) { private void createSizeSetting(Integer position, String key, Integer defaultValue, boolean useExample, String name, String hint) {
@ -964,14 +960,14 @@ public class PreferencesDialog extends javax.swing.JDialog {
cbPreferredImageLanguage = new javax.swing.JComboBox<>(); cbPreferredImageLanguage = new javax.swing.JComboBox<>();
labelPreferredImageLanguage = new javax.swing.JLabel(); labelPreferredImageLanguage = new javax.swing.JLabel();
panelCardStyles = new javax.swing.JPanel(); panelCardStyles = new javax.swing.JPanel();
cbCardRenderImageFallback = new javax.swing.JCheckBox();
cbCardRenderRetroFrames = new javax.swing.JCheckBox();
cbCardRenderIconsForAbilities = new javax.swing.JCheckBox(); cbCardRenderIconsForAbilities = new javax.swing.JCheckBox();
cbCardRenderIconsForPlayable = new javax.swing.JCheckBox(); cbCardRenderIconsForPlayable = new javax.swing.JCheckBox();
jSeparator1 = new javax.swing.JSeparator(); jSeparator1 = new javax.swing.JSeparator();
cbCardRenderShowReminderText = new javax.swing.JCheckBox(); cbCardRenderShowReminderText = new javax.swing.JCheckBox();
cbCardRenderHideSetSymbol = new javax.swing.JCheckBox(); cbCardRenderHideSetSymbol = new javax.swing.JCheckBox();
cbCardRenderShowAbilityTextOverlay = new javax.swing.JCheckBox(); cbCardRenderShowAbilityTextOverlay = new javax.swing.JCheckBox();
labelRenderMode = new javax.swing.JLabel();
cbCardRenderImageFallback = new javax.swing.JComboBox<>();
tabPhases = new javax.swing.JPanel(); tabPhases = new javax.swing.JPanel();
jLabelHeadLine = new javax.swing.JLabel(); jLabelHeadLine = new javax.swing.JLabel();
jLabelYourTurn = new javax.swing.JLabel(); jLabelYourTurn = new javax.swing.JLabel();
@ -2281,7 +2277,6 @@ public class PreferencesDialog extends javax.swing.JDialog {
} }
}); });
cbPreferredImageLanguage.setMaximumRowCount(20);
cbPreferredImageLanguage.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); cbPreferredImageLanguage.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
labelPreferredImageLanguage.setText("Default images language:"); labelPreferredImageLanguage.setText("Default images language:");
@ -2307,7 +2302,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.add(labelPreferredImageLanguage) .add(labelPreferredImageLanguage)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cbPreferredImageLanguage, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 153, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(cbPreferredImageLanguage, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 153, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(0, 480, Short.MAX_VALUE))) .add(0, 0, Short.MAX_VALUE)))
.addContainerGap()) .addContainerGap())
); );
panelCardImagesLayout.setVerticalGroup( panelCardImagesLayout.setVerticalGroup(
@ -2327,29 +2322,59 @@ public class PreferencesDialog extends javax.swing.JDialog {
); );
panelCardStyles.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card styles (restart xmage to apply new settings)")); panelCardStyles.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card styles (restart xmage to apply new settings)"));
panelCardStyles.setLayout(new javax.swing.BoxLayout(panelCardStyles, javax.swing.BoxLayout.Y_AXIS));
cbCardRenderImageFallback.setText("Render mode: MTGO style (off) or IMAGE style (on)");
panelCardStyles.add(cbCardRenderImageFallback);
cbCardRenderRetroFrames.setText("Force retro frames (MTGO render mode will use old border for all cards)");
panelCardStyles.add(cbCardRenderRetroFrames);
cbCardRenderIconsForAbilities.setText("Enable card icons for abilities (example: flying, deathtouch)"); cbCardRenderIconsForAbilities.setText("Enable card icons for abilities (example: flying, deathtouch)");
panelCardStyles.add(cbCardRenderIconsForAbilities);
cbCardRenderIconsForPlayable.setText("Enable card icons for playable abilities (example: if you can activate card's ability then show a special icon in the corner)"); cbCardRenderIconsForPlayable.setText("Enable card icons for playable abilities (example: if you can activate card's ability then show a special icon in the corner)");
panelCardStyles.add(cbCardRenderIconsForPlayable);
panelCardStyles.add(jSeparator1);
cbCardRenderShowReminderText.setText("Show reminder text in rendered card textboxes"); cbCardRenderShowReminderText.setText("Show reminder text in rendered card textboxes");
panelCardStyles.add(cbCardRenderShowReminderText);
cbCardRenderHideSetSymbol.setText("Hide set symbols on cards (more space on the type line for card types)"); cbCardRenderHideSetSymbol.setText("Hide set symbols on cards (more space on the type line for card types)");
panelCardStyles.add(cbCardRenderHideSetSymbol);
cbCardRenderShowAbilityTextOverlay.setText("Show ability text as overlay in big card view"); cbCardRenderShowAbilityTextOverlay.setText("Show ability text as overlay in big card view");
panelCardStyles.add(cbCardRenderShowAbilityTextOverlay);
labelRenderMode.setText("Render Mode:");
labelRenderMode.setToolTipText("<HTML>Image - Renders card image with text overlay<br> MTGO - Renders card frame around card art<br> Forced M15 - Renders all cards in the modern frame<br> Forced Retro - Renders all cards in the retro frame");
cbCardRenderImageFallback.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
cbCardRenderImageFallback.setToolTipText("<HTML>Image - Renders card image with text overlay<br> MTGO - Renders card frame around card art<br> Forced M15 - Renders all cards in the MTGO style with the modern frame<br> Forced Retro - Renders all cards in the MTGO style with the retro frame");
org.jdesktop.layout.GroupLayout panelCardStylesLayout = new org.jdesktop.layout.GroupLayout(panelCardStyles);
panelCardStyles.setLayout(panelCardStylesLayout);
panelCardStylesLayout.setHorizontalGroup(
panelCardStylesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(cbCardRenderIconsForAbilities)
.add(cbCardRenderIconsForPlayable)
.add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 775, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cbCardRenderShowReminderText)
.add(cbCardRenderHideSetSymbol)
.add(cbCardRenderShowAbilityTextOverlay)
.add(panelCardStylesLayout.createSequentialGroup()
.add(6, 6, 6)
.add(labelRenderMode)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cbCardRenderImageFallback, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 122, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
);
panelCardStylesLayout.setVerticalGroup(
panelCardStylesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(panelCardStylesLayout.createSequentialGroup()
.add(0, 0, 0)
.add(panelCardStylesLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(labelRenderMode)
.add(cbCardRenderImageFallback, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(0, 0, 0)
.add(cbCardRenderIconsForAbilities)
.add(0, 0, 0)
.add(cbCardRenderIconsForPlayable)
.add(0, 0, 0)
.add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(0, 0, 0)
.add(cbCardRenderShowReminderText)
.add(0, 0, 0)
.add(cbCardRenderHideSetSymbol)
.add(0, 0, 0)
.add(cbCardRenderShowAbilityTextOverlay))
);
org.jdesktop.layout.GroupLayout tabGuiImagesLayout = new org.jdesktop.layout.GroupLayout(tabGuiImages); org.jdesktop.layout.GroupLayout tabGuiImagesLayout = new org.jdesktop.layout.GroupLayout(tabGuiImages);
tabGuiImages.setLayout(tabGuiImagesLayout); tabGuiImages.setLayout(tabGuiImagesLayout);
@ -2369,7 +2394,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.add(panelCardStyles, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(panelCardStyles, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(panelCardImages, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(panelCardImages, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(306, Short.MAX_VALUE)) .addContainerGap(309, Short.MAX_VALUE))
); );
tabsPanel.addTab("GUI Images", tabGuiImages); tabsPanel.addTab("GUI Images", tabGuiImages);
@ -3040,8 +3065,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbUseRandomBattleImage, KEY_BATTLEFIELD_IMAGE_RANDOM, "true", "false"); save(prefs, dialog.cbUseRandomBattleImage, KEY_BATTLEFIELD_IMAGE_RANDOM, "true", "false");
// rendering // rendering
save(prefs, dialog.cbCardRenderImageFallback, KEY_CARD_RENDERING_IMAGE_MODE, "true", "false"); save(prefs, dialog.cbCardRenderImageFallback, KEY_CARD_RENDERING_IMAGE_MODE);
save(prefs, dialog.cbCardRenderRetroFrames, KEY_CARD_RENDERING_ENABLE_RETRO_FRAMES, "true", "false");
save(prefs, dialog.cbCardRenderIconsForAbilities, KEY_CARD_RENDERING_ICONS_FOR_ABILITIES, "true", "false"); save(prefs, dialog.cbCardRenderIconsForAbilities, KEY_CARD_RENDERING_ICONS_FOR_ABILITIES, "true", "false");
save(prefs, dialog.cbCardRenderIconsForPlayable, KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE, "true", "false"); save(prefs, dialog.cbCardRenderIconsForPlayable, KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE, "true", "false");
save(prefs, dialog.cbCardRenderHideSetSymbol, KEY_CARD_RENDERING_SET_SYMBOL, "true", "false"); save(prefs, dialog.cbCardRenderHideSetSymbol, KEY_CARD_RENDERING_SET_SYMBOL, "true", "false");
@ -3492,8 +3516,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
dialog.cbPreferredImageLanguage.setSelectedItem(MageFrame.getPreferences().get(KEY_CARD_IMAGES_PREF_LANGUAGE, CardLanguage.ENGLISH.getCode())); dialog.cbPreferredImageLanguage.setSelectedItem(MageFrame.getPreferences().get(KEY_CARD_IMAGES_PREF_LANGUAGE, CardLanguage.ENGLISH.getCode()));
// rendering settings // rendering settings
load(prefs, dialog.cbCardRenderImageFallback, KEY_CARD_RENDERING_IMAGE_MODE, "true", "false"); dialog.cbCardRenderImageFallback.setSelectedItem(MageFrame.getPreferences().get(KEY_CARD_RENDERING_IMAGE_MODE, CardRenderMode.MTGO.toString()));
load(prefs, dialog.cbCardRenderRetroFrames, KEY_CARD_RENDERING_ENABLE_RETRO_FRAMES, "true", "false");
load(prefs, dialog.cbCardRenderIconsForAbilities, KEY_CARD_RENDERING_ICONS_FOR_ABILITIES, "true", "true"); load(prefs, dialog.cbCardRenderIconsForAbilities, KEY_CARD_RENDERING_ICONS_FOR_ABILITIES, "true", "true");
load(prefs, dialog.cbCardRenderIconsForPlayable, KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE, "true", "true"); load(prefs, dialog.cbCardRenderIconsForPlayable, KEY_CARD_RENDERING_ICONS_FOR_PLAYABLE, "true", "true");
load(prefs, dialog.cbCardRenderHideSetSymbol, KEY_CARD_RENDERING_SET_SYMBOL, "true"); load(prefs, dialog.cbCardRenderHideSetSymbol, KEY_CARD_RENDERING_SET_SYMBOL, "true");
@ -3817,15 +3840,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
} }
public static int getRenderMode() { public static int getRenderMode() {
if (getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_IMAGE_MODE, "false").equals("false")) { return CardRenderMode.fromString(getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_IMAGE_MODE, CardRenderMode.MTGO.toString())).getId();
return 0; // mtgo
} else {
return 1; // image
}
}
public static boolean getRenderRetroFrames() {
return (getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_ENABLE_RETRO_FRAMES, "true").endsWith("true"));
} }
public static boolean getRenderIconsForAbilities() { public static boolean getRenderIconsForAbilities() {
@ -4055,8 +4070,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JCheckBox cbCardRenderHideSetSymbol; private javax.swing.JCheckBox cbCardRenderHideSetSymbol;
private javax.swing.JCheckBox cbCardRenderIconsForAbilities; private javax.swing.JCheckBox cbCardRenderIconsForAbilities;
private javax.swing.JCheckBox cbCardRenderIconsForPlayable; private javax.swing.JCheckBox cbCardRenderIconsForPlayable;
private javax.swing.JCheckBox cbCardRenderImageFallback; private javax.swing.JComboBox<String> cbCardRenderImageFallback;
private javax.swing.JCheckBox cbCardRenderRetroFrames;
private javax.swing.JCheckBox cbCardRenderShowAbilityTextOverlay; private javax.swing.JCheckBox cbCardRenderShowAbilityTextOverlay;
private javax.swing.JCheckBox cbCardRenderShowReminderText; private javax.swing.JCheckBox cbCardRenderShowReminderText;
private javax.swing.JCheckBox cbConfirmEmptyManaPool; private javax.swing.JCheckBox cbConfirmEmptyManaPool;
@ -4188,6 +4202,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JLabel labelNextTurn; private javax.swing.JLabel labelNextTurn;
private javax.swing.JLabel labelPreferredImageLanguage; private javax.swing.JLabel labelPreferredImageLanguage;
private javax.swing.JLabel labelPriorEnd; private javax.swing.JLabel labelPriorEnd;
private javax.swing.JLabel labelRenderMode;
private javax.swing.JLabel labelSizeGroup1; private javax.swing.JLabel labelSizeGroup1;
private javax.swing.JLabel labelSizeGroup2; private javax.swing.JLabel labelSizeGroup2;
private javax.swing.JLabel labelSkipStep; private javax.swing.JLabel labelSkipStep;

View file

@ -116,11 +116,9 @@
<Component class="javax.swing.JComboBox" name="comboRenderMode"> <Component class="javax.swing.JComboBox" name="comboRenderMode">
<Properties> <Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="2"> <StringArray count="0"/>
<StringItem index="0" value="MTGO"/>
<StringItem index="1" value="Image"/>
</StringArray>
</Property> </Property>
<Property name="toolTipText" type="java.lang.String" value="&lt;HTML&gt;Image - Renders card image with text overlay&lt;br&gt; MTGO - Renders card frame around card art&lt;br&gt; Forced M15 - Renders all cards in the MTGO style with the modern frame&lt;br&gt; Forced Retro - Renders all cards in the MTGO style with the retro frame"/>
</Properties> </Properties>
<Events> <Events>
<EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="comboRenderModeItemStateChanged"/> <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="comboRenderModeItemStateChanged"/>

View file

@ -16,7 +16,7 @@ import mage.client.cards.BigCard;
import mage.client.game.PlayAreaPanel; import mage.client.game.PlayAreaPanel;
import mage.client.game.PlayerPanelExt; import mage.client.game.PlayerPanelExt;
import mage.client.themes.ThemeType; import mage.client.themes.ThemeType;
import mage.client.util.ClientEventType; import mage.client.util.*;
import mage.client.util.Event; import mage.client.util.Event;
import mage.client.util.GUISizeHelper; import mage.client.util.GUISizeHelper;
import mage.client.util.Listener; import mage.client.util.Listener;
@ -82,6 +82,7 @@ public class TestCardRenderDialog extends MageDialog {
getRootPane().setDefaultButton(buttonCancel); getRootPane().setDefaultButton(buttonCancel);
// init render mode // init render mode
this.comboRenderMode.setModel(new DefaultComboBoxModel<>(CardRenderMode.toList()));
this.comboRenderMode.setSelectedIndex(PreferencesDialog.getRenderMode()); this.comboRenderMode.setSelectedIndex(PreferencesDialog.getRenderMode());
// init themes list // init themes list
@ -431,6 +432,7 @@ public class TestCardRenderDialog extends MageDialog {
cardViews.add(createPermanentCard(game, playerYou.getId(), "RNA", "185", 0, 0, 0, true, false, null)); // Judith, the Scourge Diva cardViews.add(createPermanentCard(game, playerYou.getId(), "RNA", "185", 0, 0, 0, true, false, null)); // Judith, the Scourge Diva
cardViews.add(createHandCard(game, playerYou.getId(), "DIS", "153")); // Odds // Ends (split card) cardViews.add(createHandCard(game, playerYou.getId(), "DIS", "153")); // Odds // Ends (split card)
cardViews.add(createHandCard(game, playerYou.getId(), "ELD", "38")); // Animating Faerie (adventure card) cardViews.add(createHandCard(game, playerYou.getId(), "ELD", "38")); // Animating Faerie (adventure card)
cardViews.add(createHandCard(game, playerYou.getId(), "LEA", "278")); // Bayou (retro frame)
cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", false, false, false)); // face down cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", false, false, false)); // face down
cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", true, false, true)); // morphed cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", true, false, true)); // morphed
cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", false, true, false)); // manifested cardViews.add(createFaceDownCard(game, playerOpponent.getId(), "ELD", "38", false, true, false)); // manifested
@ -635,7 +637,7 @@ public class TestCardRenderDialog extends MageDialog {
labelRenderMode.setText("Render mode:"); labelRenderMode.setText("Render mode:");
comboRenderMode.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "MTGO", "Image" })); comboRenderMode.setToolTipText("<HTML>Image - Renders card image with text overlay<br> MTGO - Renders card frame around card art<br> Forced M15 - Renders all cards in the MTGO style with the modern frame<br> Forced Retro - Renders all cards in the MTGO style with the retro frame");
comboRenderMode.addItemListener(new java.awt.event.ItemListener() { comboRenderMode.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) { public void itemStateChanged(java.awt.event.ItemEvent evt) {
comboRenderModeItemStateChanged(evt); comboRenderModeItemStateChanged(evt);

View file

@ -0,0 +1,59 @@
package mage.client.util;
import java.util.ArrayList;
import java.util.List;
public enum CardRenderMode {
MTGO("MTGO", 0),
IMAGE("Image", 1),
FORCED_M15("Forced M15", 2),
FORCED_RETRO("Forced Retro", 3);
private final String text;
private final int id;
CardRenderMode(String text, int id) {
this.text = text;
this.id = id;
}
@Override
public String toString() {
return text;
}
public String getText() {
return text;
}
public int getId() {
return id;
}
public static String[] toList() {
List<String> list = new ArrayList<>();
for (CardRenderMode mode : CardRenderMode.values()) {
list.add(mode.toString());
}
return list.toArray(new String[0]);
}
public static CardRenderMode fromId(int id) {
for (CardRenderMode mode : CardRenderMode.values()) {
if (mode.getId() == id) {
return mode;
}
}
return MTGO;
}
public static CardRenderMode fromString(String text) {
for (CardRenderMode mode : CardRenderMode.values()) {
if (mode.text.equals(text)) {
return mode;
}
}
return MTGO;
}
}

View file

@ -50,6 +50,7 @@ public class CardPanelRenderModeMTGO extends CardPanel {
private CardRenderer cardRenderer; private CardRenderer cardRenderer;
private int updateArtImageStamp; private int updateArtImageStamp;
private final int cardRenderMode;
private static class ImageKey { private static class ImageKey {
final BufferedImage artImage; final BufferedImage artImage;
@ -143,12 +144,13 @@ public class CardPanelRenderModeMTGO extends CardPanel {
} }
public CardPanelRenderModeMTGO(CardView newGameCard, UUID gameId, final boolean loadImage, ActionCallback callback, public CardPanelRenderModeMTGO(CardView newGameCard, UUID gameId, final boolean loadImage, ActionCallback callback,
final boolean foil, Dimension dimension, boolean needFullPermanentRender) { final boolean foil, Dimension dimension, boolean needFullPermanentRender, int renderMode) {
// Call to super // Call to super
super(newGameCard, gameId, loadImage, callback, foil, dimension, needFullPermanentRender); super(newGameCard, gameId, loadImage, callback, foil, dimension, needFullPermanentRender);
// Renderer // Renderer
cardRenderer = cardRendererFactory.create(getGameCard()); cardRenderMode = renderMode;
cardRenderer = cardRendererFactory.create(getGameCard(), cardRenderMode);
// Draw the parts // Draw the parts
initialDraw(); initialDraw();
@ -265,7 +267,7 @@ public class CardPanelRenderModeMTGO extends CardPanel {
// Update renderer // Update renderer
cardImage = null; cardImage = null;
cardRenderer = cardRendererFactory.create(getGameCard()); cardRenderer = cardRendererFactory.create(getGameCard(), cardRenderMode);
cardRenderer.setArtImage(artImage); cardRenderer.setArtImage(artImage);
// Repaint // Repaint

View file

@ -2,6 +2,7 @@ package org.mage.card.arcane;
import mage.cards.FrameStyle; import mage.cards.FrameStyle;
import mage.client.dialog.PreferencesDialog; import mage.client.dialog.PreferencesDialog;
import mage.client.util.CardRenderMode;
import mage.view.CardView; import mage.view.CardView;
/** /**
@ -13,12 +14,27 @@ public class CardRendererFactory {
} }
public CardRenderer create(CardView card) { public CardRenderer create(CardView card) {
return create(card, -1);
}
public CardRenderer create(CardView card, int renderModeOverride) {
if (card.isSplitCard()) { if (card.isSplitCard()) {
return new ModernSplitCardRenderer(card); return new ModernSplitCardRenderer(card);
} else if (card.getFrameStyle().equals(FrameStyle.RETRO) || card.getFrameStyle().equals(FrameStyle.LEA_ORIGINAL_DUAL_LAND_ART_BASIC) || PreferencesDialog.getRenderRetroFrames()) { } else if (shouldRenderRetro(card, renderModeOverride)) {
// TODO: implement split card renderer for retro cards
return new RetroCardRenderer(card); return new RetroCardRenderer(card);
} else { } else {
return new ModernCardRenderer(card); return new ModernCardRenderer(card);
} }
} }
private static boolean shouldRenderRetro(CardView card, int renderModeOverride) {
int renderMode = PreferencesDialog.getRenderMode();
if (renderModeOverride != -1) {
renderMode = renderModeOverride;
}
boolean renderMTGO = (card.getFrameStyle().equals(FrameStyle.RETRO) || card.getFrameStyle().equals(FrameStyle.LEA_ORIGINAL_DUAL_LAND_ART_BASIC)) && renderMode == CardRenderMode.MTGO.ordinal();
boolean forcedRetro = renderMode == CardRenderMode.FORCED_RETRO.ordinal();
return renderMTGO || forcedRetro;
}
} }

View file

@ -3,7 +3,7 @@ package org.mage.plugins.card;
import mage.cards.MageCard; import mage.cards.MageCard;
import mage.cards.MagePermanent; import mage.cards.MagePermanent;
import mage.cards.action.ActionCallback; import mage.cards.action.ActionCallback;
import mage.client.util.GUISizeHelper; import mage.client.util.*;
import mage.interfaces.plugin.CardPlugin; import mage.interfaces.plugin.CardPlugin;
import mage.view.CardView; import mage.view.CardView;
import mage.view.CounterView; import mage.view.CounterView;
@ -35,6 +35,8 @@ import java.util.List;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static mage.client.util.CardRenderMode.*;
/** /**
* {@link CardPlugin} implementation. * {@link CardPlugin} implementation.
* *
@ -102,16 +104,19 @@ public class CardPluginImpl implements CardPlugin {
* yet, so use old component based rendering for the split cards. * yet, so use old component based rendering for the split cards.
*/ */
private CardPanel makeCardPanel(CardView view, UUID gameId, boolean loadImage, ActionCallback callback, private CardPanel makeCardPanel(CardView view, UUID gameId, boolean loadImage, ActionCallback callback,
boolean isFoil, Dimension dimension, int renderMode, boolean needFullPermanentRender) { boolean isFoil, Dimension dimension, int renderModeId, boolean needFullPermanentRender) {
switch (renderMode) { CardRenderMode cardRenderMode = CardRenderMode.fromId(renderModeId);
case 0: switch (cardRenderMode) {
case MTGO:
case FORCED_M15:
case FORCED_RETRO:
return new CardPanelRenderModeMTGO(view, gameId, loadImage, callback, isFoil, dimension, return new CardPanelRenderModeMTGO(view, gameId, loadImage, callback, isFoil, dimension,
needFullPermanentRender); needFullPermanentRender, renderModeId);
case 1: case IMAGE:
return new CardPanelRenderModeImage(view, gameId, loadImage, callback, isFoil, dimension, return new CardPanelRenderModeImage(view, gameId, loadImage, callback, isFoil, dimension,
needFullPermanentRender); needFullPermanentRender);
default: default:
throw new IllegalStateException("Unknown render mode " + renderMode); throw new IllegalStateException("Unknown render mode " + cardRenderMode);
} }
} }