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/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

View File

@@ -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<Object> teamComboBox = new FComboBox<Object>();
private FComboBox<Object> aeTeamComboBox = new FComboBox<Object>();
@@ -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

View File

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

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