From 85a561e1527a8eb444f0e684d6be9fa7522dad4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Thu, 29 Oct 2015 10:05:34 +0100
Subject: [PATCH] #58 New user item in user menu, refactor of menu control

---
 .../tablexia/bus/event/MenuControlEvent.java  | 12 ++++++--
 .../tablexia/game/AbstractTablexiaGame.java   |  5 ++--
 .../cz/nic/tablexia/menu/MenuController.java  |  6 ++--
 .../menu/main/user/UserSelectBox.java         | 11 +++++++-
 .../cz/nic/tablexia/menu/user/UserMenu.java   | 28 ++++++++++++++++---
 .../user/UserMenuNewSelectBoxItemGroup.java   | 18 ++++--------
 core/src/cz/nic/tablexia/model/User.java      |  2 +-
 7 files changed, 54 insertions(+), 28 deletions(-)

diff --git a/core/src/cz/nic/tablexia/bus/event/MenuControlEvent.java b/core/src/cz/nic/tablexia/bus/event/MenuControlEvent.java
index 866c3dd82..f31fcea9c 100644
--- a/core/src/cz/nic/tablexia/bus/event/MenuControlEvent.java
+++ b/core/src/cz/nic/tablexia/bus/event/MenuControlEvent.java
@@ -5,14 +5,20 @@ import cz.nic.tablexia.menu.AbstractMenu;
 
 public class MenuControlEvent implements ApplicationBus.ApplicationEvent {
 
-    private AbstractMenu.MenuAction menuAction;
-    private boolean                 animated;
+    private Class<? extends AbstractMenu>   menu;
+    private AbstractMenu.MenuAction         menuAction;
+    private boolean                         animated;
 
-    public MenuControlEvent(AbstractMenu.MenuAction menuAction, boolean animated) {
+    public MenuControlEvent(Class<? extends AbstractMenu> menu, AbstractMenu.MenuAction menuAction, boolean animated) {
+        this.menu = menu;
         this.menuAction = menuAction;
         this.animated = animated;
     }
 
+    public Class<? extends AbstractMenu> getMenu() {
+        return menu;
+    }
+
     public AbstractMenu.MenuAction getMenuAction() {
         return menuAction;
     }
diff --git a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
index 17add5da3..6d7d5319d 100644
--- a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
+++ b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
@@ -37,6 +37,7 @@ import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.menu.AbstractMenu;
+import cz.nic.tablexia.menu.main.MainMenu;
 import cz.nic.tablexia.model.game.Game;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
@@ -194,7 +195,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
         gamePhase = GamePhase.STARTED;
         // if game is restored -> open menu and pause game
         if (screenState.size() > 0) {
-            ApplicationBus.getInstance().publishAsync(new MenuControlEvent(AbstractMenu.MenuAction.OPEN, true));
+            ApplicationBus.getInstance().publishAsync(new MenuControlEvent(MainMenu.class, AbstractMenu.MenuAction.OPEN, true));
         }
     }
 
@@ -225,7 +226,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
     @Override
     protected final void screenPaused(Map<String, String> screenState) {
         if (gamePhase == GamePhase.STARTED) {
-            ApplicationBus.getInstance().post(new MenuControlEvent(AbstractMenu.MenuAction.OPEN, true)).asynchronously();
+            ApplicationBus.getInstance().post(new MenuControlEvent(MainMenu.class, AbstractMenu.MenuAction.OPEN, true)).asynchronously();
             performGamePaused(screenState);
             screenState.put(GAME_STATE_GAME_ID, String.valueOf(game.getId()));
             Log.info(getClass(), "[DB] Stored game object to screen state: " + game);
diff --git a/core/src/cz/nic/tablexia/menu/MenuController.java b/core/src/cz/nic/tablexia/menu/MenuController.java
index d2fb85858..4528b02a8 100644
--- a/core/src/cz/nic/tablexia/menu/MenuController.java
+++ b/core/src/cz/nic/tablexia/menu/MenuController.java
@@ -142,7 +142,7 @@ public class MenuController extends Group implements Disposable {
 
     @Handler
     public void handleMenuControlEvent(MenuControlEvent menuControlEvent) {
-        doMenuAction(MainMenu.class, menuControlEvent.getMenuAction(), menuControlEvent.isAnimated(), false);
+        doMenuAction(menuControlEvent.getMenu(), menuControlEvent.getMenuAction(), menuControlEvent.isAnimated(), false);
     }
 
 
@@ -156,9 +156,7 @@ public class MenuController extends Group implements Disposable {
 
     @Handler
     public void handleSelectedUserEvent(TablexiaSettings.SelectedUserEvent selectedUserEvent) {
-        if (selectedUserEvent.isUserSelected()) {
-            doMenuAction(UserMenu.class, AbstractMenu.MenuAction.HIDE, true, true);
-        } else {
+        if (!selectedUserEvent.isUserSelected()) {
             doMenuAction(MainMenu.class, AbstractMenu.MenuAction.HIDE, true, true);
         }
     }
diff --git a/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java b/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
index 1d420c069..422edd306 100644
--- a/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
+++ b/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
@@ -11,12 +11,15 @@ import net.engio.mbassy.listener.Handler;
 import java.util.ArrayList;
 import java.util.List;
 
+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.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.menu.user.UserMenuNewSelectBoxItemGroup;
 import cz.nic.tablexia.menu.user.UserMenuSelectBoxItemGroup;
 import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.screen.createuser.PanoramaScreen;
 import cz.nic.tablexia.util.ui.AbstractTablexiaSelectBox;
 
 /**
@@ -74,7 +77,13 @@ public class UserSelectBox extends AbstractTablexiaSelectBox<UserSelectBox.UserS
                 selectedUserItem = userItem;
             }
         }
-        userItems.add(new UserMenuNewSelectBoxItemGroup());
+        userItems.add(new UserMenuNewSelectBoxItemGroup() {
+            @Override
+            public void performAction() {
+                TablexiaSettings.getInstance().setSelectedUser(null);
+                ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(PanoramaScreen.class, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
+            }
+        });
         setItems(userItems.toArray(new UserSelectBoxItem[]{}));
         if (selectedUserItem != null) {
             setSelected(selectedUserItem);
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenu.java b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
index 53227bb94..c2ea07d37 100644
--- a/core/src/cz/nic/tablexia/menu/user/UserMenu.java
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
@@ -6,14 +6,17 @@ import com.badlogic.gdx.scenes.scene2d.ui.Container;
 import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
 import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
-import com.badlogic.gdx.utils.Align;
 
 import net.engio.mbassy.listener.Handler;
 
+import cz.nic.tablexia.Tablexia;
+import cz.nic.tablexia.TablexiaApplication;
 import cz.nic.tablexia.bus.ApplicationBus;
+import cz.nic.tablexia.bus.event.MenuControlEvent;
 import cz.nic.tablexia.menu.AbstractMenu;
 import cz.nic.tablexia.menu.IMenuItem;
 import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.screen.createuser.PanoramaScreen;
 
 /**
  * UserMenu container
@@ -22,8 +25,9 @@ import cz.nic.tablexia.model.User;
  */
 public class UserMenu extends AbstractMenu {
 
-    private static final MenuControlType    MENU_CONTROL_TYPE = MenuControlType.AUTOMATIC;
-    private static final boolean            MENU_SCREEN_PAUSE = false;
+    private static final MenuControlType    MENU_CONTROL_TYPE   = MenuControlType.AUTOMATIC;
+    private static final boolean            MENU_SCREEN_PAUSE   = false;
+    private static final int                USER_ITEM_HEIGHT    = 80;
 
     public UserMenu(Float width, Float height) {
         super(width, height);
@@ -48,9 +52,10 @@ public class UserMenu extends AbstractMenu {
         Container<ScrollPane> container = new Container<ScrollPane>(scrollPane);
         container.setFillParent(true);
 
+        final float userMenuItemWidth = getBackground().getWidth();
         for (final IMenuItem menuItem : User.selectActiveUsers()) {
             Group userItemGroup = getGroupForMenuItem(menuItem);
-            userItemGroup.setSize(getBackground().getWidth(), 100);
+            userItemGroup.setSize(userMenuItemWidth, USER_ITEM_HEIGHT);
             userItemGroup.addListener(new ClickListener() {
                 @Override
                 public void clicked(InputEvent event, float x, float y) {
@@ -60,6 +65,21 @@ public class UserMenu extends AbstractMenu {
             });
             menuItemsLayout.addActor(userItemGroup);
         }
+        final UserMenuNewSelectBoxItemGroup userMenuNewSelectBoxItemGroup = new UserMenuNewSelectBoxItemGroup() {
+            @Override
+            public void performAction() {
+                ApplicationBus.getInstance().post(new MenuControlEvent(UserMenu.class, MenuAction.HIDE, true)).asynchronously();
+                ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(PanoramaScreen.class, TablexiaApplication.ScreenTransaction.MOVE_UP)).asynchronously();
+            }
+        };
+        userMenuNewSelectBoxItemGroup.setSize(userMenuItemWidth, USER_ITEM_HEIGHT);
+        userMenuNewSelectBoxItemGroup.addListener(new ClickListener() {
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                userMenuNewSelectBoxItemGroup.performAction();
+            }
+        });
+        menuItemsLayout.addActor(userMenuNewSelectBoxItemGroup);
 
         layoutContainer.setActor(container);
     }
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenuNewSelectBoxItemGroup.java b/core/src/cz/nic/tablexia/menu/user/UserMenuNewSelectBoxItemGroup.java
index 120d621ee..5c396afb2 100644
--- a/core/src/cz/nic/tablexia/menu/user/UserMenuNewSelectBoxItemGroup.java
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenuNewSelectBoxItemGroup.java
@@ -8,28 +8,23 @@ import com.badlogic.gdx.graphics.g2d.NinePatch;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.utils.Align;
 
-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.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.menu.main.user.UserSelectBox;
-import cz.nic.tablexia.screen.createuser.PanoramaScreen;
 
 /**
  * Created by Matyáš Latner.
  */
-public class UserMenuNewSelectBoxItemGroup extends Actor implements UserSelectBox.UserSelectBoxItem {
+public abstract class UserMenuNewSelectBoxItemGroup extends Actor implements UserSelectBox.UserSelectBoxItem {
 
     private static final Color  NEWUSER_TEXT_COLOR  = new Color(0.098f, 0.086f, 0.075f, 1f);
     private static final int    NEWUSER_TEXT_ALIGN  = Align.center;
 
-    private final NinePatch background;
-    private final BitmapFont font;
+    private final NinePatch     background;
+    private final BitmapFont    font;
     private final String        text;
-    private final GlyphLayout glyphLayout;
+    private final GlyphLayout   glyphLayout;
 
     public UserMenuNewSelectBoxItemGroup() {
         background = ApplicationAtlasManager.getInstance().getPatch(ApplicationAtlasManager.USERMENU_MENUBUTTON_BACKGROUND);
@@ -38,10 +33,7 @@ public class UserMenuNewSelectBoxItemGroup extends Actor implements UserSelectBo
         glyphLayout = new GlyphLayout();
     }
 
-    public void performAction() {
-        TablexiaSettings.getInstance().setSelectedUser(null);
-        ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(PanoramaScreen.class, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
-    }
+    public abstract void performAction();
 
     @Override
     public void draw(Batch batch, float parentAlpha) {
diff --git a/core/src/cz/nic/tablexia/model/User.java b/core/src/cz/nic/tablexia/model/User.java
index 8751e88c1..4cc28cb88 100644
--- a/core/src/cz/nic/tablexia/model/User.java
+++ b/core/src/cz/nic/tablexia/model/User.java
@@ -139,7 +139,7 @@ public class User implements IMenuItem {
 
     @Override
     public AbstractMenu.MenuAction getMenuAction() {
-        return null;
+        return AbstractMenu.MenuAction.HIDE;
     }
 
     @Override
-- 
GitLab