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/FScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/LaunchScreen.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/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/constructed/ConstructedScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text
|
forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/guantlet/GuantletScreen.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.Aggregates;
|
||||||
import forge.util.Callback;
|
import forge.util.Callback;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
import forge.util.MyRandom;
|
|
||||||
import forge.util.NameGenerator;
|
import forge.util.NameGenerator;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
import forge.util.storage.IStorage;
|
import forge.util.storage.IStorage;
|
||||||
@@ -662,29 +661,16 @@ public class ConstructedScreen extends LaunchScreen {
|
|||||||
private FEventHandler avatarCommand = new FEventHandler() {
|
private FEventHandler avatarCommand = new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
setRandomAvatar();
|
AvatarSelector.show(getPlayerName(), avatarIndex, getUsedAvatars(), new Callback<Integer>() {
|
||||||
|
@Override
|
||||||
|
public void run(Integer result) {
|
||||||
|
setAvatar(result);
|
||||||
|
|
||||||
//TODO: Support selecting avatar with option at top or bottom to select a random avatar
|
if (index < 2) {
|
||||||
|
updateAvatarPrefs();
|
||||||
/*final FLabel avatar = (FLabel)e.getSource();
|
|
||||||
|
|
||||||
final AvatarSelector aSel = new AvatarSelector(getPlayerName(), avatarIndex, getUsedAvatars());
|
|
||||||
for (final FLabel lbl : aSel.getSelectables()) {
|
|
||||||
lbl.setCommand(new FEventHandler() {
|
|
||||||
@Override
|
|
||||||
public void handleEvent(FEvent e) {
|
|
||||||
setAvatar(Integer.valueOf(lbl.getName().substring(11)));
|
|
||||||
aSel.setVisible(false);
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
aSel.setVisible(true);
|
|
||||||
aSel.dispose();*/
|
|
||||||
|
|
||||||
if (index < 2) {
|
|
||||||
updateAvatarPrefs();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -807,27 +793,14 @@ public class ConstructedScreen extends LaunchScreen {
|
|||||||
private void createAvatar() {
|
private void createAvatar() {
|
||||||
String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
|
String[] currentPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
|
||||||
if (index < currentPrefs.length) {
|
if (index < currentPrefs.length) {
|
||||||
avatarIndex = Integer.parseInt(currentPrefs[index]);
|
setAvatar(Integer.parseInt(currentPrefs[index]));
|
||||||
avatarLabel.setIcon(new FTextureRegionImage(FSkin.getAvatars().get(avatarIndex)));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setRandomAvatar();
|
setAvatar(AvatarSelector.getRandomAvatar(getUsedAvatars()));
|
||||||
}
|
}
|
||||||
|
|
||||||
avatarLabel.setCommand(avatarCommand);
|
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) {
|
public void setAvatar(int newAvatarIndex) {
|
||||||
avatarIndex = newAvatarIndex;
|
avatarIndex = newAvatarIndex;
|
||||||
avatarLabel.setIcon(new FTextureRegionImage(FSkin.getAvatars().get(newAvatarIndex)));
|
avatarLabel.setIcon(new FTextureRegionImage(FSkin.getAvatars().get(newAvatarIndex)));
|
||||||
|
|||||||
Reference in New Issue
Block a user