From 81bd83a6e69ee068774c5a0ab41e0b0fac148044 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Wed, 14 Oct 2015 08:53:57 +0200
Subject: [PATCH] #58 Arrow icon change to restart icon for active games

---
 .../tablexia/game/AbstractTablexiaGame.java   |  2 +-
 .../cz/nic/tablexia/game/GameDefinition.java  |  4 ++
 .../in_the_darkness/InTheDarknessGame.java    |  8 +---
 .../tablexia/loader/TablexiaAtlasManager.java | 34 ++++++++-----
 .../application/ApplicationAtlasManager.java  |  4 ++
 .../cz/nic/tablexia/menu/main/MainMenu.java   | 48 ++++++++++++++++---
 .../menu/main/MainMenuDefinition.java         |  4 +-
 .../screen/gamemenu/pages/GameMenuPage.java   |  6 ++-
 8 files changed, 81 insertions(+), 29 deletions(-)

diff --git a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
index 544e8284d..959993784 100644
--- a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
+++ b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
@@ -175,7 +175,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
 
         gamePhase = GamePhase.STARTED;
         // if game is restored -> open menu and pause game
-        if (screenState != null) {
+        if (screenState.size() > 0) {
             ApplicationBus.getInstance().publishAsync(new MenuControlEvent(true, true));
         }
     }
diff --git a/core/src/cz/nic/tablexia/game/GameDefinition.java b/core/src/cz/nic/tablexia/game/GameDefinition.java
index 64817c6b6..7156751c1 100644
--- a/core/src/cz/nic/tablexia/game/GameDefinition.java
+++ b/core/src/cz/nic/tablexia/game/GameDefinition.java
@@ -71,6 +71,10 @@ public enum GameDefinition implements ApplicationEvent, IMenuItem {
 		return ApplicationTextManager.getInstance().getResult().get(descriptionResource);
 	}
 
+	public Class<? extends AbstractTablexiaGame<?>> getScreenClass() {
+		return screenClass;
+	}
+
 	public boolean hasTutorial() {
 		return hasTutorial;
 	}
diff --git a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
index a25d9049a..552fc0a47 100644
--- a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
+++ b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
@@ -545,12 +545,8 @@ public class InTheDarknessGame extends AbstractTablexiaGame<List<MapWidget>> imp
     private ActionsStripWidget showActionsStripWidget(Map<String, String> gameState) {
 //        Sprite actionStripBackground = new Sprite(displaySize.x - (actionStripWidgetWidth / 2), displaySize.y - (displaySize.y / 2), actionStripWidgetWidth, displaySize.y, ResourceManager.getInstance().getTexture(ResourceManager.BACKGROUND_ACTIONSTRIP_TEXTURE), getVertexBufferObjectManager());
 //        GameLayer.BACKGROUND_TEXTURE_LAYER.getLayerEntity().attachChild(actionStripBackground);
-        Float scrollPanePosition = null;
-        String selectedActionsString = null;
-        if (gameState != null) {
-            scrollPanePosition = Float.valueOf(gameState.get(GAME_STATE_KEY_SCROLL_PANE_POSITION));
-            selectedActionsString = gameState.get(GAME_STATE_KEY_SELECTED_ACTIONS);
-        }
+        Float scrollPanePosition = gameState.containsKey(GAME_STATE_KEY_SCROLL_PANE_POSITION) ? Float.valueOf(gameState.get(GAME_STATE_KEY_SCROLL_PANE_POSITION)) : null;
+        String selectedActionsString = gameState.containsKey(GAME_STATE_KEY_SELECTED_ACTIONS) ? gameState.get(GAME_STATE_KEY_SELECTED_ACTIONS) : null;
 
         ActionsStripWidget actionStripWidget = new ActionsStripWidget(ACTION_STRIP_WIDGET_WIDTH, contentGroup.getHeight(), scrollPanePosition, selectedActionsString, this);
         actionStripWidget.setPosition(getStage().getWidth() - actionStripWidget.getWidth(), -SCREEN_Y_CORRECTION_OFFSET);
diff --git a/core/src/cz/nic/tablexia/loader/TablexiaAtlasManager.java b/core/src/cz/nic/tablexia/loader/TablexiaAtlasManager.java
index 9fa277df7..65eb3e964 100644
--- a/core/src/cz/nic/tablexia/loader/TablexiaAtlasManager.java
+++ b/core/src/cz/nic/tablexia/loader/TablexiaAtlasManager.java
@@ -44,6 +44,10 @@ public class TablexiaAtlasManager extends TablexiaAbstractFileManager {
     }
 
     public TextureRegion getTextureRegionFromAtlas(String atlasName, String regionName, Integer index) {
+        return getTextureRegionFromAtlas(atlasName, regionName, index, true);
+    }
+
+    public TextureRegion getTextureRegionFromAtlas(String atlasName, String regionName, Integer index, boolean useBleedingFix) {
         TextureAtlas atlas = getAsset(atlasName, TextureAtlas.class);
         if (atlas == null) {
             Log.err(getClass(), "Cannot get region: " + regionName + " -> Atlas with name: " + atlasName + " not found!");
@@ -61,19 +65,23 @@ public class TablexiaAtlasManager extends TablexiaAbstractFileManager {
             return null;
         }
 
-        // create new smaller region -> fix texture bleeding
-        float x = region.getRegionX();
-        float y = region.getRegionY();
-        float width = region.getRegionWidth();
-        float height = region.getRegionHeight();
-        float invTexWidth = 1f / region.getTexture().getWidth();
-        float invTexHeight = 1f / region.getTexture().getHeight();
-
-        return new TextureRegion(region.getTexture(),
-                (x + BLEEDING_EDGE_OFFSET) * invTexWidth,
-                (y + BLEEDING_EDGE_OFFSET) * invTexHeight,
-                (x + width - BLEEDING_EDGE_OFFSET) * invTexWidth,
-                (y + height - BLEEDING_EDGE_OFFSET) * invTexHeight);
+        if (useBleedingFix) {
+            // create new smaller region -> fix texture bleeding
+            float x = region.getRegionX();
+            float y = region.getRegionY();
+            float width = region.getRegionWidth();
+            float height = region.getRegionHeight();
+            float invTexWidth = 1f / region.getTexture().getWidth();
+            float invTexHeight = 1f / region.getTexture().getHeight();
+
+            return new TextureRegion(region.getTexture(),
+                    (x + BLEEDING_EDGE_OFFSET) * invTexWidth,
+                    (y + BLEEDING_EDGE_OFFSET) * invTexHeight,
+                    (x + width - BLEEDING_EDGE_OFFSET) * invTexWidth,
+                    (y + height - BLEEDING_EDGE_OFFSET) * invTexHeight);
+        } else {
+            return region;
+        }
     }
 
     public NinePatch getPatchFromAtlas(String atlasName, String patchName) {
diff --git a/core/src/cz/nic/tablexia/loader/application/ApplicationAtlasManager.java b/core/src/cz/nic/tablexia/loader/application/ApplicationAtlasManager.java
index 88b194b04..90d2c8cf4 100644
--- a/core/src/cz/nic/tablexia/loader/application/ApplicationAtlasManager.java
+++ b/core/src/cz/nic/tablexia/loader/application/ApplicationAtlasManager.java
@@ -90,6 +90,10 @@ public class ApplicationAtlasManager extends TablexiaAtlasManager implements IAp
         return getTextureRegionFromAtlas(APPLICATION_ATLAS, textureName, null);
     }
 
+    public TextureRegion getTextureRegion(String textureName, boolean useBleedingFix) {
+        return getTextureRegionFromAtlas(APPLICATION_ATLAS, textureName, null, useBleedingFix);
+    }
+
     public NinePatch getPatch(String patchName) {
         return getPatchFromAtlas(APPLICATION_ATLAS, patchName);
     }
diff --git a/core/src/cz/nic/tablexia/menu/main/MainMenu.java b/core/src/cz/nic/tablexia/menu/main/MainMenu.java
index 3133681e5..d0b29e9e3 100644
--- a/core/src/cz/nic/tablexia/menu/main/MainMenu.java
+++ b/core/src/cz/nic/tablexia/menu/main/MainMenu.java
@@ -1,12 +1,11 @@
 package cz.nic.tablexia.menu.main;
 
 import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.Group;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.Touchable;
+import com.badlogic.gdx.scenes.scene2d.ui.Cell;
 import com.badlogic.gdx.scenes.scene2d.ui.Container;
-import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
 import com.badlogic.gdx.scenes.scene2d.ui.Stack;
@@ -16,8 +15,14 @@ import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable;
 import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 import com.badlogic.gdx.utils.Align;
 
+import net.engio.mbassy.listener.Handler;
+
 import java.util.List;
 
+import cz.nic.tablexia.TablexiaApplication;
+import cz.nic.tablexia.bus.ApplicationBus;
+import cz.nic.tablexia.game.AbstractTablexiaGame;
+import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.menu.AbstractMenu;
@@ -146,10 +151,17 @@ public class MainMenu extends AbstractMenu {
         private static final float  CONTAINER_BOTTOM_PADDING    = 4f;
 
         private final Table             layoutContainer;
+        private final Image             arrowIcon;
+        private final Image             restartIcon;
+        private final Cell<Image>       iconCell;
         private NinePatchDrawable       background;
         private TextureRegionDrawable   highlitedBackground;
 
-        public SubMenuItemGroup(String title, String description) {
+        private Class<? extends AbstractTablexiaGame> abstractTablexiaGameClass;
+
+        public SubMenuItemGroup(String title, String description, Class<? extends AbstractTablexiaGame> abstractTablexiaGameClass) {
+            this.abstractTablexiaGameClass = abstractTablexiaGameClass;
+
             layoutContainer = new Table();
             layoutContainer.pad(LAYOUT_PADDING);
             layoutContainer.setTouchable(Touchable.enabled);
@@ -194,14 +206,28 @@ public class MainMenu extends AbstractMenu {
             layoutContainer.add(labelsContainer);
 
             // arrow
-            Image arrow = new Image(ApplicationAtlasManager.getInstance().getTextureRegion(ApplicationAtlasManager.MAINMENU_CHILDITEM_ARROW));
-            layoutContainer.add(arrow).expandX().align(Align.right).padRight(ARROW_PADING_RIGHT);
+            arrowIcon = new Image(ApplicationAtlasManager.getInstance().getTextureRegion(ApplicationAtlasManager.MAINMENU_CHILDITEM_ARROW, false));
+            restartIcon = new Image(ApplicationAtlasManager.getInstance().getTextureRegion(ApplicationAtlasManager.MAINMENU_CHILDITEM_RESTART, false));
+            iconCell = layoutContainer.add();
+            iconCell.expandX().align(Align.right).padRight(ARROW_PADING_RIGHT);
+            changeIconToArrow();
 
             // highliter size
             highliter.getDrawable().setMinWidth(5);
             highliter.getDrawable().setMinHeight(layoutContainer.getMinHeight());
 
             setUnpressed();
+            ApplicationBus.getInstance().subscribe(this);
+        }
+
+        private void changeIconToArrow() {
+            restartIcon.remove();
+            iconCell.setActor(arrowIcon);
+        }
+
+        private void changeIconToRestart() {
+            arrowIcon.remove();
+            iconCell.setActor(restartIcon);
         }
 
         private void setUnpressed() {
@@ -211,6 +237,15 @@ public class MainMenu extends AbstractMenu {
         private void setPressed() {
             layoutContainer.setBackground(highlitedBackground);
         }
+
+        @Handler
+        public void onScreenChangedEvent(TablexiaApplication.ScreenChangedEvent screenChangedEvent) {
+            if (screenChangedEvent.getScreenClass() == abstractTablexiaGameClass) {
+                changeIconToRestart();
+            } else {
+                changeIconToArrow();
+            }
+        }
     }
 
     public MainMenu(Float width, Float height) {
@@ -225,7 +260,8 @@ public class MainMenu extends AbstractMenu {
 
     @Override
     protected Group createSubMenuItem(IMenuItem menuItem) {
-        return new SubMenuItemGroup(menuItem.getTitle(), menuItem.getDescription());
+        GameDefinition gameDefinition = ((GameDefinition) menuItem);
+        return new SubMenuItemGroup(gameDefinition.getTitle(), gameDefinition.getDescription(), gameDefinition.getScreenClass());
     }
 
     @Override
diff --git a/core/src/cz/nic/tablexia/menu/main/MainMenuDefinition.java b/core/src/cz/nic/tablexia/menu/main/MainMenuDefinition.java
index 9d23d49c3..2e218dc7b 100644
--- a/core/src/cz/nic/tablexia/menu/main/MainMenuDefinition.java
+++ b/core/src/cz/nic/tablexia/menu/main/MainMenuDefinition.java
@@ -35,8 +35,8 @@ public enum MainMenuDefinition implements IMenuItem {
 			TablexiaSettings.getInstance().setSelectedUser(null);
 		}
 	},
-	PREFERENCES	        (false, null, null, "mainmenu_preferences",	null, AbstractMenu.MenuAction.CLOSE, new Tablexia.ChangeScreenEvent(PreferencesScreen.class, TablexiaApplication.ScreenTransaction.FADE)),
-    SCREEN_DEBUG    	(true, null, null, "mainmenu_screendebug", null, AbstractMenu.MenuAction.CLOSE, new Tablexia.ChangeScreenEvent(ViewportDebugScreen.class, TablexiaApplication.ScreenTransaction.FADE));
+	PREFERENCES	        (false, ApplicationAtlasManager.MAINMENU_ICON_ABOUT_UNPRESSED, ApplicationAtlasManager.MAINMENU_ICON_ABOUT_PRESSED, "mainmenu_preferences",	null, AbstractMenu.MenuAction.CLOSE, new Tablexia.ChangeScreenEvent(PreferencesScreen.class, TablexiaApplication.ScreenTransaction.FADE)),
+    SCREEN_DEBUG    	(true, ApplicationAtlasManager.MAINMENU_ICON_ABOUT_UNPRESSED, ApplicationAtlasManager.MAINMENU_ICON_ABOUT_PRESSED, "mainmenu_screendebug", null, AbstractMenu.MenuAction.CLOSE, new Tablexia.ChangeScreenEvent(ViewportDebugScreen.class, TablexiaApplication.ScreenTransaction.FADE));
 
     private boolean debug;
 	private String iconUnpressed;
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
index a5160c811..4f1a0fa5e 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
@@ -12,7 +12,10 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label;
 import com.badlogic.gdx.scenes.scene2d.ui.Stack;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 
+import cz.nic.tablexia.Tablexia;
+import cz.nic.tablexia.TablexiaApplication;
 import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
@@ -93,7 +96,8 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
             @Override
             public void clicked(InputEvent event, float x, float y) {
                 super.clicked(event, x, y);
-                GameMenuPage.this.game.performAction(); // TODO launch game using events
+                ApplicationBus.getInstance().publishAsync(new Tablexia.ChangeScreenEvent(GameMenuPage.this.game.getScreenClass(),
+                                                          TablexiaApplication.ScreenTransaction.FADE));
             }
         });
 
-- 
GitLab