Implement AvatarSelector

This commit is contained in:
drdev
2014-05-23 12:20:36 +00:00
parent 5bf3759d16
commit bad48d173d
3 changed files with 130 additions and 37 deletions

1
.gitattributes vendored
View File

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

View File

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

View File

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