From b742d07341c1fe80f264c48f7aaff86797a5fd70 Mon Sep 17 00:00:00 2001 From: drdev Date: Sat, 3 May 2014 21:17:39 +0000 Subject: [PATCH] Add check box menu items and support for tapping stack item to zoom or select options --- .gitattributes | 1 + .../forge/game/player/PlayerController.java | 3 +- .../forge/screens/match/views/VStack.java | 4 +- .../src/forge/menu/FCheckBoxMenuItem.java | 55 +++++++++++++++++ .../forge/screens/match/views/VDevMenu.java | 5 +- .../src/forge/screens/match/views/VStack.java | 60 ++++++++++++++++++- 6 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 forge-gui-mobile/src/forge/menu/FCheckBoxMenuItem.java diff --git a/.gitattributes b/.gitattributes index 9c3b7aacba2..e65149e00d0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1130,6 +1130,7 @@ forge-gui-mobile/src/forge/itemmanager/filters/ValueRangeFilter.java -text forge-gui-mobile/src/forge/itemmanager/views/ImageView.java -text forge-gui-mobile/src/forge/itemmanager/views/ItemListView.java -text forge-gui-mobile/src/forge/itemmanager/views/ItemView.java -text +forge-gui-mobile/src/forge/menu/FCheckBoxMenuItem.java -text forge-gui-mobile/src/forge/menu/FDropDown.java -text forge-gui-mobile/src/forge/menu/FDropDownMenu.java -text forge-gui-mobile/src/forge/menu/FMenuBar.java -text diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 3f56d286501..5b180580133 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -102,8 +102,9 @@ public abstract class PlayerController { // Triggers preliminary choice: ask, decline or play private Map triggersAlwaysAccept = new HashMap(); - public final boolean shouldAlwaysAcceptTrigger(Integer trigger) { return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); } + public final boolean shouldAlwaysAcceptTrigger(Integer trigger) { return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); } public final boolean shouldAlwaysDeclineTrigger(Integer trigger) { return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); } + public final boolean shouldAlwaysAskTrigger(Integer trigger) { return !triggersAlwaysAccept.containsKey(trigger); } public final void setShouldAlwaysAcceptTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, true); } public final void setShouldAlwaysDeclineTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, false); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index eaa18855993..66b643a8a4d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -236,8 +236,8 @@ public enum VStack implements IVDoc { private Integer triggerID = 0; public OptionalTriggerMenu(){ - jmiAccept = new JCheckBoxMenuItem("Always Accept"); - jmiDecline = new JCheckBoxMenuItem("Always Decline"); + jmiAccept = new JCheckBoxMenuItem("Always Yes"); + jmiDecline = new JCheckBoxMenuItem("Always No"); jmiAsk = new JCheckBoxMenuItem("Always Ask"); jmiAccept.addActionListener(new ActionListener() { diff --git a/forge-gui-mobile/src/forge/menu/FCheckBoxMenuItem.java b/forge-gui-mobile/src/forge/menu/FCheckBoxMenuItem.java new file mode 100644 index 00000000000..0710178aad8 --- /dev/null +++ b/forge-gui-mobile/src/forge/menu/FCheckBoxMenuItem.java @@ -0,0 +1,55 @@ +package forge.menu; + +import forge.Forge.Graphics; +import forge.assets.FImage; +import forge.assets.FSkinColor; +import forge.assets.FSkinColor.Colors; +import forge.toolbox.FEvent.FEventHandler; + +public class FCheckBoxMenuItem extends FMenuItem { + public static final float CHECKBOX_SIZE = HEIGHT * 0.45f; + public static final float PADDING = (HEIGHT - CHECKBOX_SIZE) / 3; + public static final FSkinColor FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); + public static final FSkinColor CHECKBOX_COLOR = FORE_COLOR.alphaColor(0.5f); + + private final boolean checked; + + public FCheckBoxMenuItem(String text0, boolean checked0, FEventHandler handler0) { + this(text0, checked0, null, handler0, true); + } + public FCheckBoxMenuItem(String text0, boolean checked0, FEventHandler handler0, boolean enabled0) { + this(text0, checked0, null, handler0, enabled0); + } + public FCheckBoxMenuItem(String text0, boolean checked0, FImage icon0, FEventHandler handler0) { + this(text0, checked0, icon0, handler0, true); + } + public FCheckBoxMenuItem(String text0, boolean checked0, FImage icon0, FEventHandler handler0, boolean enabled0) { + super(text0, icon0, handler0, enabled0); + checked = checked0; + } + + @Override + public float getMinWidth() { + return super.getMinWidth() + CHECKBOX_SIZE + 2 * PADDING - GAP_X; + } + + @Override + public void draw(Graphics g) { + super.draw(g); + + float w = CHECKBOX_SIZE; + float h = CHECKBOX_SIZE; + float x = getWidth() - PADDING - w; + float y = (getHeight() - h) / 2; + g.drawRect(1, CHECKBOX_COLOR, x, y, w, h); + if (checked) { + //draw check mark + x += 3; + y++; + w -= 6; + h -= 3; + g.drawLine(2, FORE_COLOR, x, y + h / 2, x + w / 2, y + h); + g.drawLine(2, FORE_COLOR, x + w / 2, y + h, x + w, y); + } + } +} diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index 002e4d65273..68d3f641487 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -2,6 +2,7 @@ package forge.screens.match.views; import forge.GuiBase; import forge.game.player.Player; +import forge.menu.FCheckBoxMenuItem; import forge.menu.FDropDownMenu; import forge.menu.FMenuItem; import forge.model.FModel; @@ -84,7 +85,9 @@ public class VDevMenu extends FDropDownMenu { })); final ForgePreferences prefs = FModel.getPreferences(); - addItem(new FMenuItem("Play Unlimited Lands", new FEventHandler() { + addItem(new FCheckBoxMenuItem("Play Unlimited Lands", + prefs.getPrefBoolean(FPref.DEV_UNLIMITED_LAND), + new FEventHandler() { @Override public void handleEvent(FEvent e) { boolean unlimitedLands = !prefs.getPrefBoolean(FPref.DEV_UNLIMITED_LAND); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index ec5517f651c..a6476698e9e 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -9,13 +9,21 @@ import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.ImageCache; import forge.card.CardDetailUtil; +import forge.card.CardZoom; import forge.card.CardDetailUtil.DetailColors; import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.player.PlayerController; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.MagicStack; +import forge.menu.FCheckBoxMenuItem; import forge.menu.FDropDown; +import forge.menu.FMenuItem; +import forge.menu.FPopupMenu; import forge.toolbox.FCardPanel; import forge.toolbox.FDisplayObject; +import forge.toolbox.FEvent; +import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; import forge.util.Utils; @@ -110,7 +118,7 @@ public class VStack extends FDropDown { private StackInstanceDisplay(SpellAbilityStackInstance stackInstance0, boolean isTop0) { stackInstance = stackInstance0; isTop = isTop0; - Card card = stackInstance0.getSourceCard(); + Card card = stackInstance.getSourceCard(); text = stackInstance.getStackDescription(); if (stackInstance.getSpellAbility().isOptionalTrigger() && @@ -131,6 +139,56 @@ public class VStack extends FDropDown { return Math.round(height); } + @Override + public boolean tap(float x, float y, int count) { + final Player player = stackInstance.getSpellAbility().getActivatingPlayer(); + final PlayerController controller = player.getController(); + if (stackInstance.getSpellAbility().isOptionalTrigger() && player.getLobbyPlayer() == localPlayer && controller != null) { + FPopupMenu menu = new FPopupMenu() { + @Override + protected void buildMenu() { + final int triggerID = stackInstance.getSpellAbility().getSourceTrigger(); + addItem(new FCheckBoxMenuItem("Always Yes", + controller.shouldAlwaysAcceptTrigger(triggerID), + new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + controller.setShouldAlwaysAcceptTrigger(triggerID); + } + })); + addItem(new FCheckBoxMenuItem("Always No", + controller.shouldAlwaysDeclineTrigger(triggerID), + new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + controller.setShouldAlwaysDeclineTrigger(triggerID); + } + })); + addItem(new FCheckBoxMenuItem("Always Ask", + controller.shouldAlwaysAskTrigger(triggerID), + new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + controller.setShouldAlwaysAskTrigger(triggerID); + } + })); + addItem(new FMenuItem("Zoom/Details", new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + CardZoom.show(stackInstance.getSourceCard()); + } + })); + } + }; + + menu.show(this, x, y); + } + else { + CardZoom.show(stackInstance.getSourceCard()); + } + return true; + } + @Override public void draw(Graphics g) { float w = getWidth();