diff --git a/.gitattributes b/.gitattributes index a10fca50d8e..f64f6442e52 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1145,6 +1145,7 @@ forge-gui-mobile/src/forge/menu/FTooltip.java -text forge-gui-mobile/src/forge/screens/FScreen.java -text forge-gui-mobile/src/forge/screens/LaunchScreen.java -text forge-gui-mobile/src/forge/screens/SplashScreen.java -text +forge-gui-mobile/src/forge/screens/TabPageScreen.java -text forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java -text forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java -text forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text @@ -1175,6 +1176,7 @@ forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java -text forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java -text forge-gui-mobile/src/forge/screens/quest/QuestScreen.java -text forge-gui-mobile/src/forge/screens/sealed/SealedScreen.java -text +forge-gui-mobile/src/forge/screens/settings/SettingsPage.java -text forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java -text forge-gui-mobile/src/forge/toolbox/DualListBox.java -text forge-gui-mobile/src/forge/toolbox/FButton.java -text diff --git a/forge-gui-mobile/src/forge/screens/FScreen.java b/forge-gui-mobile/src/forge/screens/FScreen.java index c0c84cfbaa1..5cd8b70d1f3 100644 --- a/forge-gui-mobile/src/forge/screens/FScreen.java +++ b/forge-gui-mobile/src/forge/screens/FScreen.java @@ -83,21 +83,20 @@ public abstract class FScreen extends FContainer { } public static abstract class Header extends FContainer { - protected static final FSkinColor BTN_PRESSED_COLOR = TEXTURE_OVERLAY_COLOR.alphaColor(1f); - protected static final FSkinColor LINE_COLOR = BTN_PRESSED_COLOR.stepColor(-40); - protected static final FSkinColor BACK_COLOR = BTN_PRESSED_COLOR.stepColor(-80); - protected static final float LINE_THICKNESS = Utils.scaleY(1); + public static final FSkinColor BTN_PRESSED_COLOR = TEXTURE_OVERLAY_COLOR.alphaColor(1f); + public static final FSkinColor LINE_COLOR = BTN_PRESSED_COLOR.stepColor(-40); + public static final FSkinColor BACK_COLOR = BTN_PRESSED_COLOR.stepColor(-80); + public static final float LINE_THICKNESS = Utils.scaleY(1); public abstract float getPreferredHeight(); } private static class DefaultHeader extends Header { - protected static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f); + private static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 0.8f); private static final FSkinFont FONT = FSkinFont.get(16); - private final FLabel lblCaption, btnBack; + private final FLabel btnBack, lblCaption; public DefaultHeader(String headerCaption) { - lblCaption = add(new FLabel.Builder().text(headerCaption).font(FONT).align(HAlignment.CENTER).build()); btnBack = add(new FLabel.Builder().icon(new BackIcon(HEIGHT, HEIGHT)).pressedColor(BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new FEventHandler() { @Override public void handleEvent(FEvent e) { @@ -105,6 +104,7 @@ public abstract class FScreen extends FContainer { } }).build()); btnBack.setSize(HEIGHT, HEIGHT); + lblCaption = add(new FLabel.Builder().text(headerCaption).font(FONT).align(HAlignment.CENTER).build()); } @Override @@ -125,16 +125,16 @@ public abstract class FScreen extends FContainer { @Override protected void doLayout(float width, float height) { - lblCaption.setBounds(0, 0, width, height); + lblCaption.setBounds(height, 0, width - 2 * height, height); } } - private static class BackIcon implements FImage { + protected static class BackIcon implements FImage { private static final float THICKNESS = Utils.scaleMax(3); private static final FSkinColor COLOR = FSkinColor.get(Colors.CLR_TEXT); private final float width, height; - private BackIcon(float width0, float height0) { + public BackIcon(float width0, float height0) { width = width0; height = height0; } @@ -151,7 +151,7 @@ public abstract class FScreen extends FContainer { @Override public void draw(Graphics g, float x, float y, float w, float h) { - float xMid = x + w / 3; + float xMid = x + w * 0.4f; float yMid = y + h / 2; float offsetX = h / 8; float offsetY = w / 4; diff --git a/forge-gui-mobile/src/forge/screens/TabPageScreen.java b/forge-gui-mobile/src/forge/screens/TabPageScreen.java new file mode 100644 index 00000000000..551367f324d --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/TabPageScreen.java @@ -0,0 +1,176 @@ +package forge.screens; + +import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; + +import forge.Forge; +import forge.Forge.Graphics; +import forge.assets.FImage; +import forge.assets.FSkinColor; +import forge.assets.FSkinFont; +import forge.assets.FSkinColor.Colors; +import forge.toolbox.FContainer; +import forge.toolbox.FDisplayObject; +import forge.toolbox.FEvent; +import forge.toolbox.FLabel; +import forge.toolbox.FScrollPane; +import forge.toolbox.FEvent.FEventHandler; +import forge.util.Utils; + +public class TabPageScreen extends FScreen { + private final TabPage[] tabPages; + private TabPage selectedPage; + + public TabPageScreen(TabPage[] tabPages0) { + super(new TabHeader(tabPages0)); + + tabPages = tabPages0; + for (TabPage tabPage : tabPages) { + tabPage.parentScreen = this; + add(tabPage); + tabPage.setVisible(false); + } + setSelectedPage(tabPages[0]); + } + + public TabPage getSelectedPage() { + return selectedPage; + } + public void setSelectedPage(TabPage tabPage0) { + if (selectedPage == tabPage0) { return; } + + if (selectedPage != null) { + selectedPage.setVisible(false); + } + selectedPage = tabPage0; + if (selectedPage != null) { + selectedPage.setVisible(true); + } + } + + @Override + protected void doLayout(float startY, float width, float height) { + height -= startY; + for (TabPage tabPage : tabPages) { + tabPage.setBounds(0, startY, width, height); + } + } + + private static class TabHeader extends Header { + public static final float HEIGHT = Math.round(Utils.AVG_FINGER_HEIGHT * 1.6f); + public static final float TAB_WIDTH = HEIGHT * 1.2f; + private static final float BACK_BUTTON_WIDTH = HEIGHT / 2; + private static final FSkinColor SEPARATOR_COLOR = BACK_COLOR.stepColor(-40); + + private final FLabel btnBack; + private final FScrollPane scroller; + + public TabHeader(TabPage[] tabPages) { + btnBack = add(new FLabel.Builder().iconScaleAuto(false).icon(new BackIcon(BACK_BUTTON_WIDTH, BACK_BUTTON_WIDTH)).pressedColor(BTN_PRESSED_COLOR).align(HAlignment.CENTER).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + Forge.back(); + } + }).build()); + btnBack.setSize(BACK_BUTTON_WIDTH, HEIGHT); + + scroller = add(new FScrollPane() { + @Override + protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { + float x = 0; + for (FDisplayObject tab : getChildren()) { + tab.setBounds(x, 0, TAB_WIDTH, visibleHeight); + x += TAB_WIDTH; + } + return new ScrollBounds(x, visibleHeight); + } + }); + + for (TabPage tabPage : tabPages) { + scroller.add(tabPage.createTab()); + } + } + + @Override + public float getPreferredHeight() { + return HEIGHT; + } + + @Override + public void drawBackground(Graphics g) { + g.fillRect(BACK_COLOR, 0, 0, getWidth(), HEIGHT); + } + + @Override + public void drawOverlay(Graphics g) { + //draw right border for back button + float x = btnBack.getWidth() - LINE_THICKNESS / 2; + g.drawLine(LINE_THICKNESS, SEPARATOR_COLOR, x, 0, x, getHeight()); + + //draw bottom border for header + float y = HEIGHT - LINE_THICKNESS / 2; + g.drawLine(LINE_THICKNESS, LINE_COLOR, 0, y, getWidth(), y); + } + + @Override + protected void doLayout(float width, float height) { + scroller.setBounds(btnBack.getWidth(), 0, width - btnBack.getWidth(), height); + } + } + + public static abstract class TabPage extends FContainer { + private static final float TAB_PADDING = TabHeader.HEIGHT * 0.1f; + private static final FSkinColor SEL_TAB_COLOR = FSkinColor.get(Colors.CLR_ACTIVE); + private static final FSkinColor TAB_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); + private static final FSkinFont TAB_FONT = FSkinFont.get(12); + + private TabPageScreen parentScreen; + private final String caption; + private final FImage icon; + + protected TabPage(String caption0, FImage icon0) { + caption = caption0; + icon = icon0; + } + + private FDisplayObject createTab() { + return new Tab(); + } + + private class Tab extends FDisplayObject { + @Override + public boolean tap(float x, float y, int count) { + parentScreen.setSelectedPage(TabPage.this); + return true; + } + + @Override + public void draw(Graphics g) { + float w = getWidth(); + float h = getHeight(); + if (parentScreen.getSelectedPage() == TabPage.this) { + g.fillRect(SEL_TAB_COLOR, Header.LINE_THICKNESS / 2, 0, w - Header.LINE_THICKNESS, h); + } + + //draw caption + float y = h - TAB_PADDING - TAB_FONT.getCapHeight(); + g.drawText(caption, TAB_FONT, TAB_FORE_COLOR, 0, y, w, h - y, false, HAlignment.CENTER, false); + + //draw icon if one + if (icon != null) { + float iconHeight = y - 2 * TAB_PADDING; + float iconWidth = iconHeight * icon.getWidth() / icon.getHeight(); + float maxWidth = w - 2 * TAB_PADDING; + if (iconWidth > maxWidth) { + iconHeight *= maxWidth / iconWidth; + iconWidth = maxWidth; + } + g.drawImage(icon, (w - iconWidth) / 2, (y - iconHeight) / 2, iconWidth, iconHeight); + } + + //draw right border + float x = getWidth() - Header.LINE_THICKNESS / 2; + g.drawLine(Header.LINE_THICKNESS, TabHeader.SEPARATOR_COLOR, x, 0, x, h); + } + } + } +} diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java new file mode 100644 index 00000000000..7c33ba775e8 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -0,0 +1,303 @@ +package forge.screens.settings; + +import java.util.ArrayList; +import java.util.List; + +import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; + +import forge.Forge; +import forge.Forge.Graphics; +import forge.ai.AiProfileUtil; +import forge.assets.FSkin; +import forge.assets.FSkinColor; +import forge.assets.FSkinFont; +import forge.assets.FSkinImage; +import forge.game.GameLogEntryType; +import forge.model.FModel; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.screens.FScreen; +import forge.screens.TabPageScreen.TabPage; +import forge.toolbox.FCheckBox; +import forge.toolbox.FGroupList; +import forge.toolbox.FList; +import forge.util.Utils; + +public class SettingsPage extends TabPage { + private final FGroupList lstSettings = add(new FGroupList()); + + public SettingsPage() { + super("Settings", FSkinImage.SETTINGS); + + lstSettings.setListItemRenderer(new SettingRenderer()); + + lstSettings.addGroup("General Settings"); + lstSettings.addGroup("Gameplay Options"); + lstSettings.addGroup("Random Deck Generation"); + lstSettings.addGroup("Advanced Settings"); + lstSettings.addGroup("Graphic Options"); + //lstSettings.addGroup("Sound Options"); //TODO: Uncomment when sound supported + + //General Settings + lstSettings.addItem(new CustomSelectSetting(FPref.UI_SKIN, "Theme", + "Sets the theme that determines how display components are skinned.", + FSkin.getAllSkins()) { + @Override + public void valueChanged(String newValue) { + FSkin.changeSkin(newValue); + } + }, 0); + + //Gameplay Options + lstSettings.addItem(new CustomSelectSetting(FPref.UI_CURRENT_AI_PROFILE, + "AI Personality", + "Choose your AI opponent.", + AiProfileUtil.getProfilesArray()), + 1); + lstSettings.addItem(new BooleanSetting(FPref.UI_ANTE, + "Play for Ante", + "Determines whether or not the game is played for ante."), + 1); + lstSettings.addItem(new BooleanSetting(FPref.UI_ANTE_MATCH_RARITY, + "Match Ante Rarity", + "Attempts to make antes the same rarity for all players."), + 1); + /*lstSettings.addItem(new BooleanSetting(FPref.UI_UPLOAD_DRAFT, + "Upload Draft Picks", + "Sends draft picks to Forge servers for analysis, to improve draft AI."), + 1);*/ + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_AI_CHEATS, + "Allow AI Cheating", + "Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."), + 1); + lstSettings.addItem(new BooleanSetting(FPref.UI_MANABURN, + "Mana Burn", + "Play with mana burn (from pre-Magic 2010 rules)."), + 1); + lstSettings.addItem(new BooleanSetting(FPref.ENFORCE_DECK_LEGALITY, + "Deck Conformance", + "Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc)."), + 1); + lstSettings.addItem(new BooleanSetting(FPref.UI_CLONE_MODE_SOURCE, + "Clones Use Original Card Art", + "When enabled clones will use their original art instead of the cloned card's art."), + 1); + lstSettings.addItem(new BooleanSetting(FPref.MATCHPREF_PROMPT_FREE_BLOCKS, + "Free Block Handling", + "When enabled, if you would have to pay 0 to block, pay automatically without prompt."), + 1); + + //Random Deck Generation + lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_NOSMALL, + "Remove Small Creatures", + "Disables 1/1 and 0/X creatures in generated decks."), + 2); + lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_SINGLETONS, + "Singleton Mode", + "Disables non-land duplicates in generated decks."), + 2); + lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_ARTIFACTS, + "Remove Artifacts", + "Disables artifact cards in generated decks."), + 2); + + //Advanced Settings + lstSettings.addItem(new BooleanSetting(FPref.DEV_MODE_ENABLED, + "Developer Mode", + "Enables menu with functions for testing during development.") { + @Override + public void select() { + super.select(); + //update DEV_MODE flag when preference changes + ForgePreferences.DEV_MODE = FModel.getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED); + } + }, 3); + lstSettings.addItem(new CustomSelectSetting(FPref.DEV_LOG_ENTRY_TYPE, + "Game Log Verbosity", + "Changes how much information is displayed in the game log. Sorted by least to most verbose.", + GameLogEntryType.class), + 3); + + //Graphic Options + lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT, + "Display Foil Overlay", + "Displays foil cards with the visual foil overlay effect."), + 4); + lstSettings.addItem(new BooleanSetting(FPref.UI_RANDOM_FOIL, + "Random Foil", + "Adds foil effect to random cards."), + 4); + lstSettings.addItem(new BooleanSetting(FPref.UI_RANDOM_ART_IN_POOLS, + "Randomize Card Art", + "Generates cards with random art in generated limited mode card pools."), + 4); + lstSettings.addItem(new BooleanSetting(FPref.UI_HIDE_REMINDER_TEXT, + "Hide Reminder Text", + "Hide reminder text in Card Detail pane."), + 4); + + //Sound Options + /*lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_SOUNDS, + "Enable Sounds", + "Enable sound effects during the game."), + 5); + lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM, + "Use Alternate Sound System", + "Use the alternate sound system (only use if you have issues with sound not playing or disappearing)."), + 5);*/ //TODO: Uncomment when sound supported + } + + @Override + protected void doLayout(float width, float height) { + lstSettings.setBounds(0, 0, width, height); + } + + private abstract class Setting { + protected String label; + protected String description; + protected FPref pref; + + public Setting(FPref pref0, String label0, String description0) { + label = label0; + description = description0; + pref = pref0; + } + + public abstract void select(); + public abstract void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float width, float height); + } + + private class BooleanSetting extends Setting { + public BooleanSetting(FPref pref0, String label0, String description0) { + super(pref0, label0, description0); + } + + @Override + public void select() { + FModel.getPreferences().setPref(pref, !FModel.getPreferences().getPrefBoolean(pref)); + FModel.getPreferences().save(); + } + + @Override + public void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float w, float h) { + x += w - h; + w = h; + FCheckBox.drawCheckBox(g, SettingsScreen.DESC_COLOR, color, FModel.getPreferences().getPrefBoolean(pref), x, y, w, h); + } + } + + private class CustomSelectSetting extends Setting { + private final List options = new ArrayList(); + + public CustomSelectSetting(FPref pref0, String label0, String description0, String[] options0) { + super(pref0, label0 + ":", description0); + + for (String option : options0) { + options.add(option); + } + } + public CustomSelectSetting(FPref pref0, String label0, String description0, Iterable options0) { + super(pref0, label0 + ":", description0); + + for (String option : options0) { + options.add(option); + } + } + public > CustomSelectSetting(FPref pref0, String label0, String description0, Class enumData) { + super(pref0, label0 + ":", description0); + + for (E option : enumData.getEnumConstants()) { + options.add(option.toString()); + } + } + + public void valueChanged(String newValue) { + FModel.getPreferences().setPref(pref, newValue); + FModel.getPreferences().save(); + } + + @Override + public void select() { + Forge.openScreen(new CustomSelectScreen()); + } + + private class CustomSelectScreen extends FScreen { + private final FList lstOptions; + private final String currentValue = FModel.getPreferences().getPref(pref); + + private CustomSelectScreen() { + super("Select " + label.substring(0, label.length() - 1)); + lstOptions = add(new FList(options)); + lstOptions.setListItemRenderer(new FList.DefaultListItemRenderer() { + @Override + public boolean tap(String value, float x, float y, int count) { + if (!value.equals(currentValue)) { + valueChanged(value); + } + Forge.back(); + return true; + } + + @Override + public void drawValue(Graphics g, String value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { + float offset = w * SettingsScreen.INSETS_FACTOR - FList.PADDING; //increase padding for settings items + x += offset; + y += offset; + w -= 2 * offset; + h -= 2 * offset; + + g.drawText(value, font, foreColor, x, y, w, h, false, HAlignment.LEFT, true); + + float radius = h / 3; + x += w - radius; + y += h / 2; + g.drawCircle(Utils.scaleMin(1), SettingsScreen.DESC_COLOR, x, y, radius); + if (value.equals(currentValue)) { + g.fillCircle(foreColor, x, y, radius / 2); + } + } + }); + } + + @Override + protected void doLayout(float startY, float width, float height) { + lstOptions.setBounds(0, startY, width, height - startY); + } + } + + @Override + public void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float w, float h) { + g.drawText(FModel.getPreferences().getPref(pref), font, color, x, y, w, h, false, HAlignment.RIGHT, false); + } + } + + private class SettingRenderer extends FList.ListItemRenderer { + @Override + public float getItemHeight() { + return SettingsScreen.SETTING_HEIGHT; + } + + @Override + public boolean tap(Setting value, float x, float y, int count) { + value.select(); + return true; + } + + @Override + public void drawValue(Graphics g, Setting value, FSkinFont font, FSkinColor color, boolean pressed, float x, float y, float w, float h) { + float offset = w * SettingsScreen.INSETS_FACTOR - FList.PADDING; //increase padding for settings items + x += offset; + y += offset; + w -= 2 * offset; + h -= 2 * offset; + + float totalHeight = h; + h = font.getMultiLineBounds(value.label).height + SettingsScreen.SETTING_PADDING; + + g.drawText(value.label, font, color, x, y, w, h, false, HAlignment.LEFT, false); + value.drawPrefValue(g, font, color, x, y, w, h); + h += SettingsScreen.SETTING_PADDING; + g.drawText(value.description, SettingsScreen.DESC_FONT, SettingsScreen.DESC_COLOR, x, y + h, w, totalHeight - h + w * SettingsScreen.INSETS_FACTOR, true, HAlignment.LEFT, false); + } + } +} diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java b/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java index 77fd0345e33..82cb2b93390 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsScreen.java @@ -1,312 +1,28 @@ package forge.screens.settings; -import java.util.ArrayList; -import java.util.List; - -import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; - import forge.Forge; -import forge.Forge.Graphics; -import forge.ai.AiProfileUtil; -import forge.assets.FSkin; import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.FSkinColor.Colors; -import forge.game.GameLogEntryType; -import forge.model.FModel; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; -import forge.screens.FScreen; -import forge.toolbox.FCheckBox; -import forge.toolbox.FGroupList; -import forge.toolbox.FList; +import forge.screens.TabPageScreen; import forge.util.Utils; -public class SettingsScreen extends FScreen { +public class SettingsScreen extends TabPageScreen { public static final float INSETS_FACTOR = 0.025f; public static final FSkinFont DESC_FONT = FSkinFont.get(11); public static final FSkinColor DESC_COLOR = FSkinColor.get(Colors.CLR_TEXT).alphaColor(0.5f); - private static final float SETTING_HEIGHT = Utils.AVG_FINGER_HEIGHT + Utils.scaleY(12); - private static final float SETTING_PADDING = Utils.scaleY(5); - - private final FGroupList lstSettings = add(new FGroupList()); + protected static final float SETTING_HEIGHT = Utils.AVG_FINGER_HEIGHT + Utils.scaleY(12); + protected static final float SETTING_PADDING = Utils.scaleY(5); public SettingsScreen() { - super("Settings"); - lstSettings.setListItemRenderer(new SettingRenderer()); - - lstSettings.addGroup("General Settings"); - lstSettings.addGroup("Gameplay Options"); - lstSettings.addGroup("Random Deck Generation"); - lstSettings.addGroup("Advanced Settings"); - lstSettings.addGroup("Graphic Options"); - //lstSettings.addGroup("Sound Options"); //TODO: Uncomment when sound supported - - //General Settings - lstSettings.addItem(new CustomSelectSetting(FPref.UI_SKIN, "Theme", - "Sets the theme that determines how display components are skinned.", - FSkin.getAllSkins()) { - @Override - public void valueChanged(String newValue) { - FSkin.changeSkin(newValue); - } - }, 0); - - //Gameplay Options - lstSettings.addItem(new CustomSelectSetting(FPref.UI_CURRENT_AI_PROFILE, - "AI Personality", - "Choose your AI opponent.", - AiProfileUtil.getProfilesArray()), - 1); - lstSettings.addItem(new BooleanSetting(FPref.UI_ANTE, - "Play for Ante", - "Determines whether or not the game is played for ante."), - 1); - lstSettings.addItem(new BooleanSetting(FPref.UI_ANTE_MATCH_RARITY, - "Match Ante Rarity", - "Attempts to make antes the same rarity for all players."), - 1); - /*lstSettings.addItem(new BooleanSetting(FPref.UI_UPLOAD_DRAFT, - "Upload Draft Picks", - "Sends draft picks to Forge servers for analysis, to improve draft AI."), - 1);*/ - lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_AI_CHEATS, - "Allow AI Cheating", - "Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."), - 1); - lstSettings.addItem(new BooleanSetting(FPref.UI_MANABURN, - "Mana Burn", - "Play with mana burn (from pre-Magic 2010 rules)."), - 1); - lstSettings.addItem(new BooleanSetting(FPref.ENFORCE_DECK_LEGALITY, - "Deck Conformance", - "Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc)."), - 1); - lstSettings.addItem(new BooleanSetting(FPref.UI_CLONE_MODE_SOURCE, - "Clones Use Original Card Art", - "When enabled clones will use their original art instead of the cloned card's art."), - 1); - lstSettings.addItem(new BooleanSetting(FPref.MATCHPREF_PROMPT_FREE_BLOCKS, - "Free Block Handling", - "When enabled, if you would have to pay 0 to block, pay automatically without prompt."), - 1); - - //Random Deck Generation - lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_NOSMALL, - "Remove Small Creatures", - "Disables 1/1 and 0/X creatures in generated decks."), - 2); - lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_SINGLETONS, - "Singleton Mode", - "Disables non-land duplicates in generated decks."), - 2); - lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_ARTIFACTS, - "Remove Artifacts", - "Disables artifact cards in generated decks."), - 2); - - //Advanced Settings - lstSettings.addItem(new BooleanSetting(FPref.DEV_MODE_ENABLED, - "Developer Mode", - "Enables menu with functions for testing during development.") { - @Override - public void select() { - super.select(); - //update DEV_MODE flag when preference changes - ForgePreferences.DEV_MODE = FModel.getPreferences().getPrefBoolean(FPref.DEV_MODE_ENABLED); - } - }, 3); - lstSettings.addItem(new CustomSelectSetting(FPref.DEV_LOG_ENTRY_TYPE, - "Game Log Verbosity", - "Changes how much information is displayed in the game log. Sorted by least to most verbose.", - GameLogEntryType.class), - 3); - - //Graphic Options - lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT, - "Display Foil Overlay", - "Displays foil cards with the visual foil overlay effect."), - 4); - lstSettings.addItem(new BooleanSetting(FPref.UI_RANDOM_FOIL, - "Random Foil", - "Adds foil effect to random cards."), - 4); - lstSettings.addItem(new BooleanSetting(FPref.UI_RANDOM_ART_IN_POOLS, - "Randomize Card Art", - "Generates cards with random art in generated limited mode card pools."), - 4); - lstSettings.addItem(new BooleanSetting(FPref.UI_HIDE_REMINDER_TEXT, - "Hide Reminder Text", - "Hide reminder text in Card Detail pane."), - 4); - - //Sound Options - /*lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_SOUNDS, - "Enable Sounds", - "Enable sound effects during the game."), - 5); - lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM, - "Use Alternate Sound System", - "Use the alternate sound system (only use if you have issues with sound not playing or disappearing)."), - 5);*/ //TODO: Uncomment when sound supported + super(new TabPage[] { + new SettingsPage() + }); + // TODO Auto-generated constructor stub } @Override public void showMenu() { Forge.back(); //hide settings screen when menu button pressed } - - @Override - protected void doLayout(float startY, float width, float height) { - lstSettings.setBounds(0, startY, width, height - startY); - } - - private abstract class Setting { - protected String label; - protected String description; - protected FPref pref; - - public Setting(FPref pref0, String label0, String description0) { - label = label0; - description = description0; - pref = pref0; - } - - public abstract void select(); - public abstract void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float width, float height); - } - - private class BooleanSetting extends Setting { - public BooleanSetting(FPref pref0, String label0, String description0) { - super(pref0, label0, description0); - } - - @Override - public void select() { - FModel.getPreferences().setPref(pref, !FModel.getPreferences().getPrefBoolean(pref)); - FModel.getPreferences().save(); - } - - @Override - public void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float w, float h) { - x += w - h; - w = h; - FCheckBox.drawCheckBox(g, DESC_COLOR, color, FModel.getPreferences().getPrefBoolean(pref), x, y, w, h); - } - } - - private class CustomSelectSetting extends Setting { - private final List options = new ArrayList(); - - public CustomSelectSetting(FPref pref0, String label0, String description0, String[] options0) { - super(pref0, label0 + ":", description0); - - for (String option : options0) { - options.add(option); - } - } - public CustomSelectSetting(FPref pref0, String label0, String description0, Iterable options0) { - super(pref0, label0 + ":", description0); - - for (String option : options0) { - options.add(option); - } - } - public > CustomSelectSetting(FPref pref0, String label0, String description0, Class enumData) { - super(pref0, label0 + ":", description0); - - for (E option : enumData.getEnumConstants()) { - options.add(option.toString()); - } - } - - public void valueChanged(String newValue) { - FModel.getPreferences().setPref(pref, newValue); - FModel.getPreferences().save(); - } - - @Override - public void select() { - Forge.openScreen(new CustomSelectScreen()); - } - - private class CustomSelectScreen extends FScreen { - private final FList lstOptions; - private final String currentValue = FModel.getPreferences().getPref(pref); - - private CustomSelectScreen() { - super("Select " + label.substring(0, label.length() - 1)); - lstOptions = add(new FList(options)); - lstOptions.setListItemRenderer(new FList.DefaultListItemRenderer() { - @Override - public boolean tap(String value, float x, float y, int count) { - if (!value.equals(currentValue)) { - valueChanged(value); - } - Forge.back(); - return true; - } - - @Override - public void drawValue(Graphics g, String value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { - float offset = w * INSETS_FACTOR - FList.PADDING; //increase padding for settings items - x += offset; - y += offset; - w -= 2 * offset; - h -= 2 * offset; - - g.drawText(value, font, foreColor, x, y, w, h, false, HAlignment.LEFT, true); - - float radius = h / 3; - x += w - radius; - y += h / 2; - g.drawCircle(Utils.scaleMin(1), DESC_COLOR, x, y, radius); - if (value.equals(currentValue)) { - g.fillCircle(foreColor, x, y, radius / 2); - } - } - }); - } - - @Override - protected void doLayout(float startY, float width, float height) { - lstOptions.setBounds(0, startY, width, height - startY); - } - } - - @Override - public void drawPrefValue(Graphics g, FSkinFont font, FSkinColor color, float x, float y, float w, float h) { - g.drawText(FModel.getPreferences().getPref(pref), font, color, x, y, w, h, false, HAlignment.RIGHT, false); - } - } - - private class SettingRenderer extends FList.ListItemRenderer { - @Override - public float getItemHeight() { - return SETTING_HEIGHT; - } - - @Override - public boolean tap(Setting value, float x, float y, int count) { - value.select(); - return true; - } - - @Override - public void drawValue(Graphics g, Setting value, FSkinFont font, FSkinColor color, boolean pressed, float x, float y, float w, float h) { - float offset = w * INSETS_FACTOR - FList.PADDING; //increase padding for settings items - x += offset; - y += offset; - w -= 2 * offset; - h -= 2 * offset; - - float totalHeight = h; - h = font.getMultiLineBounds(value.label).height + SETTING_PADDING; - - g.drawText(value.label, font, color, x, y, w, h, false, HAlignment.LEFT, false); - value.drawPrefValue(g, font, color, x, y, w, h); - h += SETTING_PADDING; - g.drawText(value.description, DESC_FONT, DESC_COLOR, x, y + h, w, totalHeight - h + w * INSETS_FACTOR, true, HAlignment.LEFT, false); - } - } }