From a71f9c46eb924c23aa85f2be58f70797fecffe84 Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 4 Apr 2014 22:16:02 +0000 Subject: [PATCH] Add toggle switch for changing between Human and AI --- .gitattributes | 1 + .../constructed/ConstructedScreen.java | 39 ++---- .../src/forge/toolbox/FRadioButton.java | 8 +- .../src/forge/toolbox/FToggleSwitch.java | 121 ++++++++++++++++++ 4 files changed, 138 insertions(+), 31 deletions(-) create mode 100644 forge-m-base/src/forge/toolbox/FToggleSwitch.java diff --git a/.gitattributes b/.gitattributes index 26e4c3f658b..b73af860f7e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16251,6 +16251,7 @@ forge-m-base/src/forge/toolbox/FRadioButton.java -text forge-m-base/src/forge/toolbox/FScrollPane.java -text forge-m-base/src/forge/toolbox/FTextArea.java -text forge-m-base/src/forge/toolbox/FTextField.java -text +forge-m-base/src/forge/toolbox/FToggleSwitch.java -text forge-m-base/src/forge/toolbox/GuiChoose.java -text forge-m-base/src/forge/toolbox/GuiDialog.java -text forge-m-base/src/forge/utils/Constants.java -text diff --git a/forge-m-base/src/forge/screens/constructed/ConstructedScreen.java b/forge-m-base/src/forge/screens/constructed/ConstructedScreen.java index d5f1f0f5509..3af824a0aa5 100644 --- a/forge-m-base/src/forge/screens/constructed/ConstructedScreen.java +++ b/forge-m-base/src/forge/screens/constructed/ConstructedScreen.java @@ -35,11 +35,10 @@ import forge.toolbox.FCheckBox; import forge.toolbox.FComboBox; import forge.toolbox.FContainer; import forge.toolbox.FEvent; +import forge.toolbox.FToggleSwitch; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; -import forge.toolbox.FRadioButton; -import forge.toolbox.FRadioButton.RadioButtonGroup; import forge.toolbox.FScrollPane; import forge.toolbox.FTextField; import forge.util.MyRandom; @@ -235,8 +234,7 @@ public class ConstructedScreen extends LaunchScreen { private int avatarIndex; private final FTextField txtPlayerName = new FTextField("Player name"); - private FRadioButton radioHuman; - private FRadioButton radioAi; + private final FToggleSwitch humanAiSwitch = new FToggleSwitch("Human", "AI"); private FComboBox teamComboBox = new FComboBox(); private FComboBox aeTeamComboBox = new FComboBox(); @@ -281,9 +279,9 @@ public class ConstructedScreen extends LaunchScreen { nameRandomiser = createNameRandomizer(); add(nameRandomiser); - createPlayerTypeOptions(); - add(radioHuman); - add(radioAi); + humanAiSwitch.setToggled(index == 0); + humanAiSwitch.setChangedHandler(humanAiSwitched); + add(humanAiSwitch); add(newLabel("Team:")); populateTeamsComboBoxes(); @@ -331,14 +329,9 @@ public class ConstructedScreen extends LaunchScreen { nameRandomiser.setBounds(x, y, fieldHeight, fieldHeight); y += fieldHeight + PADDING; - radioHuman.setHeight(fieldHeight); //must set height before width so icon is correct size - radioAi.setHeight(fieldHeight); - radioHuman.setWidth(radioHuman.getAutoSizeBounds().width); - radioAi.setWidth(radioAi.getAutoSizeBounds().width); - x = width - radioAi.getWidth(); - radioAi.setPosition(x, y); - x -= radioHuman.getWidth() - PADDING; - radioHuman.setPosition(x, y); + humanAiSwitch.setSize(humanAiSwitch.getAutoSizeWidth(), fieldHeight); + x = width - humanAiSwitch.getWidth(); + humanAiSwitch.setPosition(x, y); w = x - avatarSize - 2 * PADDING; x = avatarSize + 2 * PADDING; teamComboBox.setBounds(x, y, w, fieldHeight); @@ -371,7 +364,7 @@ public class ConstructedScreen extends LaunchScreen { g.drawLine(1, PLAYER_BORDER_COLOR, 0, y, getWidth(), y); } - private final FEventHandler radioMouseAdapter = new FEventHandler() { + private final FEventHandler humanAiSwitched = new FEventHandler() { @Override public void handleEvent(FEvent e) { updateVanguardList(index); @@ -452,7 +445,7 @@ public class ConstructedScreen extends LaunchScreen { } public PlayerType getPlayerType() { - return radioAi.isSelected() ? PlayerType.COMPUTER : PlayerType.HUMAN; + return humanAiSwitch.isToggled() ? PlayerType.HUMAN : PlayerType.COMPUTER; } public void setVanguardButtonText(String text) { @@ -590,18 +583,6 @@ public class ConstructedScreen extends LaunchScreen { }); } - private void createPlayerTypeOptions() { - radioHuman = new FRadioButton("Human", index == 0); - radioAi = new FRadioButton("AI", index != 0); - - radioHuman.setCommand(radioMouseAdapter); - radioAi.setCommand(radioMouseAdapter); - - RadioButtonGroup radioButtonGroup = new RadioButtonGroup(); - radioHuman.setGroup(radioButtonGroup); - radioAi.setGroup(radioButtonGroup); - } - private void addHandlersDeckSelector() { deckBtn.setCommand(new FEventHandler() { @Override diff --git a/forge-m-base/src/forge/toolbox/FRadioButton.java b/forge-m-base/src/forge/toolbox/FRadioButton.java index d566ca43ea1..a7170cd7392 100644 --- a/forge-m-base/src/forge/toolbox/FRadioButton.java +++ b/forge-m-base/src/forge/toolbox/FRadioButton.java @@ -42,15 +42,19 @@ public class FRadioButton extends FLabel { @Override public void setSelected(final boolean b0) { - if (isSelected() == b0) { return; } + if (isSelected() == b0 || !b0) { return; } //don't support unselecting radio button if (b0 && group != null) { //if selecting and in group, unselect all other radio buttons in group for (FRadioButton button : group.buttons) { if (button != this) { - button.setSelected(false); + button.superSetSelected(false); } } } + superSetSelected(b0); + } + + private void superSetSelected(final boolean b0) { super.setSelected(b0); } diff --git a/forge-m-base/src/forge/toolbox/FToggleSwitch.java b/forge-m-base/src/forge/toolbox/FToggleSwitch.java new file mode 100644 index 00000000000..94fd41ce3b7 --- /dev/null +++ b/forge-m-base/src/forge/toolbox/FToggleSwitch.java @@ -0,0 +1,121 @@ +package forge.toolbox; + +import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.Forge.Graphics; +import forge.assets.FSkinColor; +import forge.assets.FSkinColor.Colors; +import forge.assets.FSkinFont; +import forge.toolbox.FEvent.FEventHandler; +import forge.toolbox.FEvent.FEventType; +import forge.utils.Utils; + +public class FToggleSwitch extends FDisplayObject { + private static final FSkinColor ACTIVE_COLOR = FSkinColor.get(Colors.CLR_ACTIVE); + private static final FSkinColor INACTIVE_COLOR = FSkinColor.get(Colors.CLR_INACTIVE); + private static final FSkinColor FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); + private static final FSkinColor BORDER_COLOR = INACTIVE_COLOR.stepColor(-30); + private static float MIN_PAN_DELTA = Utils.AVG_FINGER_WIDTH / 2f; + private static final float PADDING = 5; + + private FSkinFont font; + private final String onText, offText; + private boolean toggled = false; + private FEventHandler changedHandler; + + public FToggleSwitch() { + this("On", "Off"); + } + + public FToggleSwitch(final String onText0, final String offText0) { + onText = onText0; + offText = offText0; + font = FSkinFont.get(14); + } + + public void setFontSize(int fontSize0) { + font = FSkinFont.get(fontSize0); + } + + public boolean isToggled() { + return toggled; + } + public void setToggled(boolean b0) { + setToggled(b0, false); + } + private void setToggled(boolean b0, boolean raiseChangedEvent) { + if (toggled == b0) { return; } + toggled = b0; + + if (raiseChangedEvent && changedHandler != null) { + changedHandler.handleEvent(new FEvent(this, FEventType.CHANGE, b0)); + } + } + + public FEventHandler getChangedHandler() { + return changedHandler; + } + public void setChangedHandler(FEventHandler changedHandler0) { + changedHandler = changedHandler0; + } + + public float getAutoSizeWidth() { + float width; + float onTextWidth = font.getFont().getBounds(onText).width; + float offTextWidth = font.getFont().getBounds(offText).width; + if (onTextWidth > offTextWidth) { + width = onTextWidth; + } + else { + width = offTextWidth; + } + width += 2 * PADDING; + width *= 1.5f; //leave room for switch to move + return width; + } + + @Override + public final boolean tap(float x, float y, int count) { + setToggled(!toggled, true); + return true; + } + + //support dragging finger left or right to toggle on/off + @Override + public final boolean pan(float x, float y, float deltaX, float deltaY) { + if (deltaX < -MIN_PAN_DELTA && x < getWidth() / 2) { + setToggled(true, true); + return true; + } + if (deltaX > MIN_PAN_DELTA && x > getWidth() / 2) { + setToggled(false, true); + return true; + } + return false; + } + + @Override + public void draw(Graphics g) { + float w = getWidth(); + float h = getHeight(); + + g.startClip(0, 0, w, h); //start clip to ensure nothing escapes bounds + g.fillRect(INACTIVE_COLOR, 0, 0, w, h); + + final float x; + final String text; + float switchWidth = w * 0.66f; + if (toggled) { + x = 0; + text = onText; + } + else { + x = w - switchWidth; + text = offText; + } + g.fillRect(ACTIVE_COLOR, x, 0, switchWidth, h); + g.drawText(text, font, FORE_COLOR, x + PADDING, 0, switchWidth - 2 * PADDING, h, false, HAlignment.CENTER, true); + + g.drawRect(1, BORDER_COLOR, 0, 0, w, h); + g.endClip(); + } +}