From 1d9e73b0f2cc9e08f5fd2ec3c14f71e695d1b78c Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 27 Jul 2014 00:06:30 +0000 Subject: [PATCH] Implement quest preferences screen --- .gitattributes | 1 + .../src/forge/screens/quest/QuestMenu.java | 4 +- .../forge/screens/quest/QuestPrefsScreen.java | 176 +++++++++++++++++- .../src/forge/toolbox/FNumericTextField.java | 23 +++ .../src/forge/toolbox/FTextField.java | 26 ++- 5 files changed, 222 insertions(+), 8 deletions(-) create mode 100644 forge-gui-mobile/src/forge/toolbox/FNumericTextField.java diff --git a/.gitattributes b/.gitattributes index 190ff3efb58..3180d168bfc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1233,6 +1233,7 @@ forge-gui-mobile/src/forge/toolbox/FGestureAdapter.java -text forge-gui-mobile/src/forge/toolbox/FGroupList.java -text forge-gui-mobile/src/forge/toolbox/FLabel.java -text forge-gui-mobile/src/forge/toolbox/FList.java -text +forge-gui-mobile/src/forge/toolbox/FNumericTextField.java -text forge-gui-mobile/src/forge/toolbox/FOptionPane.java -text forge-gui-mobile/src/forge/toolbox/FOverlay.java -text forge-gui-mobile/src/forge/toolbox/FPanel.java -text diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java index ccc8495da19..dca827335a1 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestMenu.java @@ -213,12 +213,12 @@ public class QuestMenu extends FPopupMenu implements IVQuestStats { Forge.openScreen(new LoadQuestScreen()); } })); - /*addItem(new FMenuItem("Preferences", FSkinImage.SETTINGS, new FEventHandler() { + addItem(new FMenuItem("Preferences", FSkinImage.SETTINGS, new FEventHandler() { @Override public void handleEvent(FEvent e) { Forge.openScreen(prefsScreen); } - }));*/ + })); } @Override diff --git a/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java b/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java index dcdfd29052a..121aea882f9 100644 --- a/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/QuestPrefsScreen.java @@ -1,15 +1,187 @@ package forge.screens.quest; +import forge.assets.FImage; +import forge.assets.FSkinFont; +import forge.assets.FSkinImage; +import forge.model.FModel; +import forge.quest.data.QuestPreferences.QPref; import forge.screens.FScreen; +import forge.toolbox.FContainer; +import forge.toolbox.FDisplayObject; +import forge.toolbox.FEvent; +import forge.toolbox.FEvent.FEventHandler; +import forge.toolbox.FLabel; +import forge.toolbox.FNumericTextField; +import forge.toolbox.FScrollPane; +import forge.toolbox.FTextField; +import forge.util.Utils; public class QuestPrefsScreen extends FScreen { + private static final float PADDING = Utils.scaleMin(5); + + private enum PrefsGroup { + REWARDS, + BOOSTER, + SHOP, + DIFFICULTY_ALL, + DIFFICULTY_EASY, + DIFFICULTY_MEDIUM, + DIFFICULTY_HARD, + DIFFICULTY_EXPERT + } + + private FScrollPane scroller = add(new FScrollPane() { + @Override + protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { + float x = PADDING; + float y = PADDING; + float w = visibleWidth - 2 * PADDING; + float fieldHeight = FTextField.getDefaultHeight(); + float dy = fieldHeight + PADDING; + + for (FDisplayObject child : getChildren()) { + if (child.isVisible()) { + child.setBounds(x, y, w, fieldHeight); + y += dy; + } + } + + return new ScrollBounds(visibleWidth, y); + } + }); + public QuestPrefsScreen() { super("Quest Preferences", QuestMenu.getMenu()); + + //Rewards + scroller.add(new PrefsHeader("Rewards", FSkinImage.QUEST_COIN, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Base winnings", QPref.REWARDS_BASE, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("No losses", QPref.REWARDS_UNDEFEATED, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Poison win", QPref.REWARDS_POISON, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Milling win", QPref.REWARDS_MILLED, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Mulligan 0 win", QPref.REWARDS_MULLIGAN0, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Alternative win", QPref.REWARDS_ALTERNATIVE, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Win by turn 15", QPref.REWARDS_TURN15, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Win by turn 10", QPref.REWARDS_TURN10, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("Win by turn 5", QPref.REWARDS_TURN5, PrefsGroup.REWARDS)); + scroller.add(new PrefsOption("First turn win", QPref.REWARDS_TURN1, PrefsGroup.REWARDS)); + + //Booster Pack Ratios + scroller.add(new PrefsHeader("Booster Pack Ratios", FSkinImage.QUEST_BOOK, PrefsGroup.BOOSTER)); + scroller.add(new PrefsOption("Common", QPref.BOOSTER_COMMONS, PrefsGroup.BOOSTER)); + scroller.add(new PrefsOption("Uncommon", QPref.BOOSTER_UNCOMMONS, PrefsGroup.BOOSTER)); + scroller.add(new PrefsOption("Rare", QPref.BOOSTER_RARES, PrefsGroup.BOOSTER)); + + //Shop Preferences + scroller.add(new PrefsHeader("Shop Preferences", FSkinImage.QUEST_COIN, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Maximum Packs", QPref.SHOP_MAX_PACKS, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Starting Packs", QPref.SHOP_STARTING_PACKS, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Wins for Pack", QPref.SHOP_WINS_FOR_ADDITIONAL_PACK, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Wins per Set Unlock", QPref.WINS_UNLOCK_SET, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Common Singles", QPref.SHOP_SINGLES_COMMON, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Uncommon Singles", QPref.SHOP_SINGLES_UNCOMMON, PrefsGroup.SHOP)); + scroller.add(new PrefsOption("Rare Singles", QPref.SHOP_SINGLES_RARE, PrefsGroup.SHOP)); + + //Difficulty Adjustments (All) + scroller.add(new PrefsHeader("Difficulty Adjustments (All)", FSkinImage.QUEST_NOTES, PrefsGroup.DIFFICULTY_ALL)); + scroller.add(new PrefsOption("Starting basic lands", QPref.STARTING_BASIC_LANDS, PrefsGroup.DIFFICULTY_ALL)); + scroller.add(new PrefsOption("Starting snow lands", QPref.STARTING_SNOW_LANDS, PrefsGroup.DIFFICULTY_ALL)); + scroller.add(new PrefsOption("Color bias (1-10)", QPref.STARTING_POOL_COLOR_BIAS, PrefsGroup.DIFFICULTY_ALL)); + scroller.add(new PrefsOption("Penalty for loss", QPref.PENALTY_LOSS, PrefsGroup.DIFFICULTY_ALL)); + + //Difficult Adjustments (Easy) + scroller.add(new PrefsHeader("Difficulty Adjustments (Easy)", FSkinImage.QUEST_NOTES, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Wins For Booster", QPref.WINS_BOOSTER_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Wins For Rank Increase", QPref.WINS_RANKUP_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Wins For Medium AI", QPref.WINS_MEDIUMAI_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Wins For Hard AI", QPref.WINS_HARDAI_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Wins For Expert AI", QPref.WINS_EXPERTAI_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Starting commons", QPref.STARTING_COMMONS_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Starting uncommons", QPref.STARTING_UNCOMMONS_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Starting rares", QPref.STARTING_RARES_EASY, PrefsGroup.DIFFICULTY_EASY)); + scroller.add(new PrefsOption("Starting credits", QPref.STARTING_CREDITS_EASY, PrefsGroup.DIFFICULTY_EASY)); + + //Difficult Adjustments (Medium) + scroller.add(new PrefsHeader("Difficulty Adjustments (Medium)", FSkinImage.QUEST_NOTES, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Wins For Booster", QPref.WINS_BOOSTER_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Wins For Rank Increase", QPref.WINS_RANKUP_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Wins For Medium AI", QPref.WINS_MEDIUMAI_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Wins For Hard AI", QPref.WINS_HARDAI_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Wins For Expert AI", QPref.WINS_EXPERTAI_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Starting commons", QPref.STARTING_COMMONS_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Starting uncommons", QPref.STARTING_UNCOMMONS_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Starting rares", QPref.STARTING_RARES_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + scroller.add(new PrefsOption("Starting credits", QPref.STARTING_CREDITS_MEDIUM, PrefsGroup.DIFFICULTY_MEDIUM)); + + //Difficult Adjustments (Hard) + scroller.add(new PrefsHeader("Difficulty Adjustments (Hard)", FSkinImage.QUEST_NOTES, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Wins For Booster", QPref.WINS_BOOSTER_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Wins For Rank Increase", QPref.WINS_RANKUP_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Wins For Medium AI", QPref.WINS_MEDIUMAI_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Wins For Hard AI", QPref.WINS_HARDAI_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Wins For Expert AI", QPref.WINS_EXPERTAI_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Starting commons", QPref.STARTING_COMMONS_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Starting uncommons", QPref.STARTING_UNCOMMONS_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Starting rares", QPref.STARTING_RARES_HARD, PrefsGroup.DIFFICULTY_HARD)); + scroller.add(new PrefsOption("Starting credits", QPref.STARTING_CREDITS_HARD, PrefsGroup.DIFFICULTY_HARD)); + + //Difficult Adjustments (Expert) + scroller.add(new PrefsHeader("Difficulty Adjustments (Expert)", FSkinImage.QUEST_NOTES, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Wins For Booster", QPref.WINS_BOOSTER_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Wins For Rank Increase", QPref.WINS_RANKUP_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Wins For Medium AI", QPref.WINS_MEDIUMAI_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Wins For Hard AI", QPref.WINS_HARDAI_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Wins For Expert AI", QPref.WINS_EXPERTAI_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Starting commons", QPref.STARTING_COMMONS_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Starting uncommons", QPref.STARTING_UNCOMMONS_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Starting rares", QPref.STARTING_RARES_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); + scroller.add(new PrefsOption("Starting credits", QPref.STARTING_CREDITS_EXPERT, PrefsGroup.DIFFICULTY_EXPERT)); } @Override protected void doLayout(float startY, float width, float height) { - // TODO Auto-generated method stub - + scroller.setBounds(0, startY, width, height - startY); + } + + private class PrefsHeader extends FLabel { + private PrefsHeader(String title, FImage icon, final PrefsGroup group) { + super(new ButtonBuilder().text(title).font(FSkinFont.get(16)).icon(icon).iconScaleFactor(1f) + .command(new FEventHandler() { + private boolean showOptions = true; + + @Override + public void handleEvent(FEvent e) { + showOptions = !showOptions; + for (FDisplayObject child : scroller.getChildren()) { + if (child instanceof PrefsOption && ((PrefsOption)child).group == group) { + child.setVisible(showOptions); + } + } + scroller.revalidate(); + } + })); + } + } + + private static class PrefsOption extends FContainer { + private static final float FIELD_WIDTH = new FTextField("99999").getAutoSizeWidth(); //base width on 5 digit number + + private final FLabel label = add(new FLabel.Builder().build()); + private final FNumericTextField field = add(new FNumericTextField()); + private final QPref pref; + private final PrefsGroup group; + + private PrefsOption(String label0, QPref pref0, PrefsGroup group0) { + label.setText(label0); + pref = pref0; + group = group0; + field.setText(FModel.getQuestPreferences().getPref(pref0)); + } + + @Override + protected void doLayout(float width, float height) { + label.setBounds(0, 0, width - FIELD_WIDTH - PADDING, height); + field.setBounds(width - FIELD_WIDTH, 0, FIELD_WIDTH, height); + } } } diff --git a/forge-gui-mobile/src/forge/toolbox/FNumericTextField.java b/forge-gui-mobile/src/forge/toolbox/FNumericTextField.java new file mode 100644 index 00000000000..598a7cdea8f --- /dev/null +++ b/forge-gui-mobile/src/forge/toolbox/FNumericTextField.java @@ -0,0 +1,23 @@ +package forge.toolbox; + +import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; + +public class FNumericTextField extends FTextField { + private int value; + + public FNumericTextField() { + setAlignment(HAlignment.RIGHT); + } + + public int getValue() { + return value; + } + public void setValue(int value0) { + if (value0 < 0) { + value0 = 0; + } + if (value == value0) { return; } + value = value0; + setText(String.valueOf(value)); + } +} diff --git a/forge-gui-mobile/src/forge/toolbox/FTextField.java b/forge-gui-mobile/src/forge/toolbox/FTextField.java index 931f5b7c01d..7108bca6d63 100644 --- a/forge-gui-mobile/src/forge/toolbox/FTextField.java +++ b/forge-gui-mobile/src/forge/toolbox/FTextField.java @@ -18,7 +18,7 @@ import forge.util.Utils; public class FTextField extends FDisplayObject implements ITextField { private static final FSkinFont DEFAULT_FONT = FSkinFont.get(14); private static final float BORDER_THICKNESS = Utils.scaleX(1); - protected static final float PADDING = Utils.scaleX(5); + public static final float PADDING = Utils.scaleX(5); protected static final FSkinColor FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); protected static final FSkinColor BACK_COLOR = FSkinColor.get(Colors.CLR_THEME2); protected static final FSkinColor GHOST_TEXT_COLOR = FORE_COLOR.alphaColor(0.7f); @@ -126,11 +126,11 @@ public class FTextField extends FDisplayObject implements ITextField { } public float getAutoSizeWidth() { - return PADDING + font.getBounds(text).width + getRightPadding(); + return getLeftPadding() + font.getBounds(text).width + getRightPadding(); } private int getCharIndexAtPoint(float x, float y) { - float charLeft = getLeftPadding(); + float charLeft = getTextLeft(); if (x < charLeft) { return 0; } @@ -320,7 +320,13 @@ public class FTextField extends FDisplayObject implements ITextField { //draw selection if key input is active if (isEditing) { - float selLeft = getLeftPadding(); + float selLeft = getTextLeft(); + if (alignment == HAlignment.CENTER) { + + } + else if (alignment == HAlignment.RIGHT) { + + } if (selStart > 0) { selLeft += renderedFont.getBounds(text.substring(0, selStart)).width; } @@ -358,6 +364,18 @@ public class FTextField extends FDisplayObject implements ITextField { } } + protected float getTextLeft() { + switch (alignment) { + case LEFT: + default: + return getLeftPadding(); + case CENTER: + return getLeftPadding() + (getWidth() - getRightPadding() - getLeftPadding() - renderedFont.getBounds(text).width) / 2; + case RIGHT: + return getWidth() - getRightPadding() - renderedFont.getBounds(text).width; + } + } + protected float getLeftPadding() { return PADDING; }