mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Add toggle switch for changing between Human and AI
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
121
forge-m-base/src/forge/toolbox/FToggleSwitch.java
Normal file
121
forge-m-base/src/forge/toolbox/FToggleSwitch.java
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user