Add toggle switch for changing between Human and AI

This commit is contained in:
drdev
2014-04-04 22:16:02 +00:00
parent 69d1c2ceea
commit a71f9c46eb
4 changed files with 138 additions and 31 deletions

1
.gitattributes vendored
View File

@@ -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/FScrollPane.java -text
forge-m-base/src/forge/toolbox/FTextArea.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/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/GuiChoose.java -text
forge-m-base/src/forge/toolbox/GuiDialog.java -text forge-m-base/src/forge/toolbox/GuiDialog.java -text
forge-m-base/src/forge/utils/Constants.java -text forge-m-base/src/forge/utils/Constants.java -text

View File

@@ -35,11 +35,10 @@ import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBox; import forge.toolbox.FComboBox;
import forge.toolbox.FContainer; import forge.toolbox.FContainer;
import forge.toolbox.FEvent; import forge.toolbox.FEvent;
import forge.toolbox.FToggleSwitch;
import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.FRadioButton;
import forge.toolbox.FRadioButton.RadioButtonGroup;
import forge.toolbox.FScrollPane; import forge.toolbox.FScrollPane;
import forge.toolbox.FTextField; import forge.toolbox.FTextField;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -235,8 +234,7 @@ public class ConstructedScreen extends LaunchScreen {
private int avatarIndex; private int avatarIndex;
private final FTextField txtPlayerName = new FTextField("Player name"); private final FTextField txtPlayerName = new FTextField("Player name");
private FRadioButton radioHuman; private final FToggleSwitch humanAiSwitch = new FToggleSwitch("Human", "AI");
private FRadioButton radioAi;
private FComboBox<Object> teamComboBox = new FComboBox<Object>(); private FComboBox<Object> teamComboBox = new FComboBox<Object>();
private FComboBox<Object> aeTeamComboBox = new FComboBox<Object>(); private FComboBox<Object> aeTeamComboBox = new FComboBox<Object>();
@@ -281,9 +279,9 @@ public class ConstructedScreen extends LaunchScreen {
nameRandomiser = createNameRandomizer(); nameRandomiser = createNameRandomizer();
add(nameRandomiser); add(nameRandomiser);
createPlayerTypeOptions(); humanAiSwitch.setToggled(index == 0);
add(radioHuman); humanAiSwitch.setChangedHandler(humanAiSwitched);
add(radioAi); add(humanAiSwitch);
add(newLabel("Team:")); add(newLabel("Team:"));
populateTeamsComboBoxes(); populateTeamsComboBoxes();
@@ -331,14 +329,9 @@ public class ConstructedScreen extends LaunchScreen {
nameRandomiser.setBounds(x, y, fieldHeight, fieldHeight); nameRandomiser.setBounds(x, y, fieldHeight, fieldHeight);
y += fieldHeight + PADDING; y += fieldHeight + PADDING;
radioHuman.setHeight(fieldHeight); //must set height before width so icon is correct size humanAiSwitch.setSize(humanAiSwitch.getAutoSizeWidth(), fieldHeight);
radioAi.setHeight(fieldHeight); x = width - humanAiSwitch.getWidth();
radioHuman.setWidth(radioHuman.getAutoSizeBounds().width); humanAiSwitch.setPosition(x, y);
radioAi.setWidth(radioAi.getAutoSizeBounds().width);
x = width - radioAi.getWidth();
radioAi.setPosition(x, y);
x -= radioHuman.getWidth() - PADDING;
radioHuman.setPosition(x, y);
w = x - avatarSize - 2 * PADDING; w = x - avatarSize - 2 * PADDING;
x = avatarSize + 2 * PADDING; x = avatarSize + 2 * PADDING;
teamComboBox.setBounds(x, y, w, fieldHeight); 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); g.drawLine(1, PLAYER_BORDER_COLOR, 0, y, getWidth(), y);
} }
private final FEventHandler radioMouseAdapter = new FEventHandler() { private final FEventHandler humanAiSwitched = new FEventHandler() {
@Override @Override
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
updateVanguardList(index); updateVanguardList(index);
@@ -452,7 +445,7 @@ public class ConstructedScreen extends LaunchScreen {
} }
public PlayerType getPlayerType() { public PlayerType getPlayerType() {
return radioAi.isSelected() ? PlayerType.COMPUTER : PlayerType.HUMAN; return humanAiSwitch.isToggled() ? PlayerType.HUMAN : PlayerType.COMPUTER;
} }
public void setVanguardButtonText(String text) { 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() { private void addHandlersDeckSelector() {
deckBtn.setCommand(new FEventHandler() { deckBtn.setCommand(new FEventHandler() {
@Override @Override

View File

@@ -42,15 +42,19 @@ public class FRadioButton extends FLabel {
@Override @Override
public void setSelected(final boolean b0) { 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 if (b0 && group != null) { //if selecting and in group, unselect all other radio buttons in group
for (FRadioButton button : group.buttons) { for (FRadioButton button : group.buttons) {
if (button != this) { if (button != this) {
button.setSelected(false); button.superSetSelected(false);
} }
} }
} }
superSetSelected(b0);
}
private void superSetSelected(final boolean b0) {
super.setSelected(b0); super.setSelected(b0);
} }

View File

@@ -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();
}
}