mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
Implement AvatarSelector
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1147,6 +1147,7 @@ forge-gui-mobile/src/forge/menu/FTooltip.java -text
|
||||
forge-gui-mobile/src/forge/screens/FScreen.java -text
|
||||
forge-gui-mobile/src/forge/screens/LaunchScreen.java -text
|
||||
forge-gui-mobile/src/forge/screens/SplashScreen.java -text
|
||||
forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java -text
|
||||
forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java -text
|
||||
forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text
|
||||
forge-gui-mobile/src/forge/screens/guantlet/GuantletScreen.java -text
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
package forge.screens.constructed;
|
||||
|
||||
import forge.Forge;
|
||||
import forge.assets.FImage;
|
||||
import forge.assets.FSkin;
|
||||
import forge.assets.FSkinImage;
|
||||
import forge.assets.FTextureRegionImage;
|
||||
import forge.screens.FScreen;
|
||||
import forge.toolbox.FDisplayObject;
|
||||
import forge.toolbox.FEvent;
|
||||
import forge.toolbox.FEvent.FEventHandler;
|
||||
import forge.toolbox.FLabel;
|
||||
import forge.toolbox.FScrollPane;
|
||||
import forge.util.Callback;
|
||||
import forge.util.MyRandom;
|
||||
import forge.util.Utils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.badlogic.gdx.graphics.g2d.TextureRegion;
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||
|
||||
public class AvatarSelector extends FScreen {
|
||||
public static int getRandomAvatar(List<Integer> usedAvatars) {
|
||||
int random = 0;
|
||||
do {
|
||||
random = MyRandom.getRandom().nextInt(FSkin.getAvatars().size());
|
||||
} while (usedAvatars.contains(random));
|
||||
return random;
|
||||
}
|
||||
|
||||
public static void show(final String playerName, final int currentIndex0, final List<Integer> usedAvatars0, final Callback<Integer> callback0) {
|
||||
AvatarSelector selector = new AvatarSelector(playerName, currentIndex0, usedAvatars0, callback0);
|
||||
Forge.openScreen(selector);
|
||||
}
|
||||
|
||||
private static final float PADDING = Utils.scaleMin(5);
|
||||
private static final int COLUMNS = 4;
|
||||
|
||||
private final int currentIndex;
|
||||
private final List<Integer> usedAvatars;
|
||||
private final Callback<Integer> callback;
|
||||
private final FScrollPane scroller = new FScrollPane() {
|
||||
@Override
|
||||
protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) {
|
||||
int rowCount = 0;
|
||||
float x = PADDING;
|
||||
float y = PADDING;
|
||||
float labelSize = (visibleWidth - (COLUMNS + 1) * PADDING) / COLUMNS;
|
||||
for (FDisplayObject lbl : scroller.getChildren()) {
|
||||
if (rowCount == COLUMNS) { //wrap to next line
|
||||
x = PADDING;
|
||||
y += labelSize + PADDING;
|
||||
rowCount = 0;
|
||||
}
|
||||
lbl.setBounds(x, y, labelSize, labelSize);
|
||||
x += labelSize + PADDING;
|
||||
rowCount++;
|
||||
}
|
||||
return new ScrollBounds(visibleWidth, y + labelSize + PADDING);
|
||||
}
|
||||
};
|
||||
|
||||
private AvatarSelector(final String playerName, final int currentIndex0, final List<Integer> usedAvatars0, final Callback<Integer> callback0) {
|
||||
super(true, "Select Avatar for " + playerName);
|
||||
|
||||
currentIndex = currentIndex0;
|
||||
usedAvatars = usedAvatars0;
|
||||
callback = callback0;
|
||||
|
||||
//add label for selecting random avatar first
|
||||
addAvatarLabel(FSkinImage.UNKNOWN, -1);
|
||||
|
||||
//add label for currently selected avatar next
|
||||
final Map<Integer, TextureRegion> avatarMap = FSkin.getAvatars();
|
||||
addAvatarLabel(new FTextureRegionImage(avatarMap.get(currentIndex)), currentIndex);
|
||||
|
||||
//add label for remaining avatars
|
||||
for (final Integer i : avatarMap.keySet()) {
|
||||
if (currentIndex != i) {
|
||||
addAvatarLabel(new FTextureRegionImage(avatarMap.get(i)), i);
|
||||
}
|
||||
}
|
||||
|
||||
add(scroller);
|
||||
}
|
||||
|
||||
private void addAvatarLabel(final FImage img, final int index) {
|
||||
final FLabel lbl = new FLabel.Builder().icon(img).iconScaleFactor(0.95f).align(HAlignment.CENTER)
|
||||
.iconInBackground(true).selectable(true).selected(currentIndex == index)
|
||||
.build();
|
||||
|
||||
if (index == -1) {
|
||||
lbl.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
callback.run(getRandomAvatar(usedAvatars));
|
||||
Forge.back();
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
lbl.setCommand(new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
callback.run(index);
|
||||
Forge.back();
|
||||
}
|
||||
});
|
||||
}
|
||||
scroller.add(lbl);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLayout(float startY, float width, float height) {
|
||||
scroller.setBounds(0, startY, width, height - startY);
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,6 @@ import forge.toolbox.FTextField;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.Callback;
|
||||
import forge.util.Lang;
|
||||
import forge.util.MyRandom;
|
||||
import forge.util.NameGenerator;
|
||||
import forge.util.Utils;
|
||||
import forge.util.storage.IStorage;
|
||||
@@ -662,30 +661,17 @@ public class ConstructedScreen extends LaunchScreen {
|
||||
private FEventHandler avatarCommand = new FEventHandler() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
setRandomAvatar();
|
||||
|
||||
//TODO: Support selecting avatar with option at top or bottom to select a random avatar
|
||||
|
||||
/*final FLabel avatar = (FLabel)e.getSource();
|
||||
|
||||
final AvatarSelector aSel = new AvatarSelector(getPlayerName(), avatarIndex, getUsedAvatars());
|
||||
for (final FLabel lbl : aSel.getSelectables()) {
|
||||
lbl.setCommand(new FEventHandler() {
|
||||
AvatarSelector.show(getPlayerName(), avatarIndex, getUsedAvatars(), new Callback<Integer>() {
|
||||
@Override
|
||||
public void handleEvent(FEvent e) {
|
||||
setAvatar(Integer.valueOf(lbl.getName().substring(11)));
|
||||
aSel.setVisible(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
aSel.setVisible(true);
|
||||
aSel.dispose();*/
|
||||
public void run(Integer result) {
|
||||
setAvatar(result);
|
||||
|
||||
if (index < 2) {
|
||||
updateAvatarPrefs();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
public void updateVariantControlsVisibility() {
|
||||
@@ -807,27 +793,14 @@ public class ConstructedScreen extends LaunchScreen {
|
||||
private void createAvatar() {
|
||||
String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
|
||||
if (index < currentPrefs.length) {
|
||||
avatarIndex = Integer.parseInt(currentPrefs[index]);
|
||||
avatarLabel.setIcon(new FTextureRegionImage(FSkin.getAvatars().get(avatarIndex)));
|
||||
setAvatar(Integer.parseInt(currentPrefs[index]));
|
||||
}
|
||||
else {
|
||||
setRandomAvatar();
|
||||
setAvatar(AvatarSelector.getRandomAvatar(getUsedAvatars()));
|
||||
}
|
||||
|
||||
avatarLabel.setCommand(avatarCommand);
|
||||
}
|
||||
|
||||
//Applies a random avatar, avoiding avatars already used.
|
||||
public void setRandomAvatar() {
|
||||
int random = 0;
|
||||
|
||||
List<Integer> usedAvatars = getUsedAvatars();
|
||||
do {
|
||||
random = MyRandom.getRandom().nextInt(FSkin.getAvatars().size());
|
||||
} while (usedAvatars.contains(random));
|
||||
setAvatar(random);
|
||||
}
|
||||
|
||||
public void setAvatar(int newAvatarIndex) {
|
||||
avatarIndex = newAvatarIndex;
|
||||
avatarLabel.setIcon(new FTextureRegionImage(FSkin.getAvatars().get(newAvatarIndex)));
|
||||
|
||||
Reference in New Issue
Block a user