From bad48d173d9c43f1e86cad3889ba9c68bbcd5641 Mon Sep 17 00:00:00 2001 From: drdev Date: Fri, 23 May 2014 12:20:36 +0000 Subject: [PATCH] Implement AvatarSelector --- .gitattributes | 1 + .../screens/constructed/AvatarSelector.java | 119 ++++++++++++++++++ .../constructed/ConstructedScreen.java | 47 ++----- 3 files changed, 130 insertions(+), 37 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java diff --git a/.gitattributes b/.gitattributes index 1073316afec..19ff6854b60 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java b/forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java new file mode 100644 index 00000000000..995eb1e4fbf --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/constructed/AvatarSelector.java @@ -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 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 usedAvatars0, final Callback 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 usedAvatars; + private final Callback 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 usedAvatars0, final Callback 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 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); + } +} diff --git a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java index eb7193c55ed..d1f9858bb8d 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java @@ -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,29 +661,16 @@ public class ConstructedScreen extends LaunchScreen { private FEventHandler avatarCommand = new FEventHandler() { @Override public void handleEvent(FEvent e) { - setRandomAvatar(); + AvatarSelector.show(getPlayerName(), avatarIndex, getUsedAvatars(), new Callback() { + @Override + public void run(Integer result) { + setAvatar(result); - //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() { - @Override - public void handleEvent(FEvent e) { - setAvatar(Integer.valueOf(lbl.getName().substring(11))); - aSel.setVisible(false); + if (index < 2) { + updateAvatarPrefs(); } - }); - } - - aSel.setVisible(true); - aSel.dispose();*/ - - if (index < 2) { - updateAvatarPrefs(); - } + } + }); } }; @@ -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 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)));