From 1a92d0a31a0d6a1b2d020faa67cda63c7426878f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Wed, 18 Mar 2015 17:01:56 +0100
Subject: [PATCH] #19 Improved menu move behavior

---
 core/src/cz/nic/tablexia/Tablexia.java      |  2 +-
 core/src/cz/nic/tablexia/menu/MainMenu.java | 92 +++++++++++----------
 2 files changed, 50 insertions(+), 44 deletions(-)

diff --git a/core/src/cz/nic/tablexia/Tablexia.java b/core/src/cz/nic/tablexia/Tablexia.java
index f8a58a9c1..c46f08ef1 100644
--- a/core/src/cz/nic/tablexia/Tablexia.java
+++ b/core/src/cz/nic/tablexia/Tablexia.java
@@ -128,11 +128,11 @@ public class Tablexia extends TablexiaApplication {
 
     @Override
     public void pause() {
-        super.pause();
         if (mainMenuContainer != null) {
             // don't use menu open animation for android pause event (animation is run after resume on android)
             mainMenuContainer.openMainMenu(!Gdx.app.getType().equals(Application.ApplicationType.Android));
         }
+        super.pause();
     }
 
     @Override
diff --git a/core/src/cz/nic/tablexia/menu/MainMenu.java b/core/src/cz/nic/tablexia/menu/MainMenu.java
index 2308ad9d2..9f5b5234b 100644
--- a/core/src/cz/nic/tablexia/menu/MainMenu.java
+++ b/core/src/cz/nic/tablexia/menu/MainMenu.java
@@ -6,9 +6,9 @@ import com.badlogic.gdx.graphics.Texture.TextureFilter;
 import com.badlogic.gdx.graphics.g2d.TextureRegion;
 import com.badlogic.gdx.math.Interpolation;
 import com.badlogic.gdx.math.Interpolation.PowOut;
+import com.badlogic.gdx.scenes.scene2d.Action;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.actions.Actions;
-import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction;
 import com.badlogic.gdx.scenes.scene2d.ui.Button;
 import com.badlogic.gdx.scenes.scene2d.ui.Stack;
 import com.badlogic.gdx.scenes.scene2d.ui.Table;
@@ -47,7 +47,8 @@ public class MainMenu extends Stack {
     private float               menuClosePositionX;
     private int                 menuOpenPositionX;
     private int                 menuPositionY;
-    private MoveToAction        moveAction;
+    private Action              moveAction;
+    private boolean             isMenuClose;
     private boolean             isMenuOpen;
     private boolean             isClosing;
     private boolean             isOpening;
@@ -134,13 +135,16 @@ public class MainMenu extends Stack {
 
     private void prepareMenuPositions() {
         isMenuOpen = false;
+        isMenuClose = false;
+        isOpening = false;
+        isClosing = false;
         menuClosePositionX = -(getWidth() - (getWidth() * MENU_CONTROLLER_SIZE_RATIO));
         menuOpenPositionX = 0;
         menuPositionY = 0;
     }
 
     private void toggleMenu() {
-        if (isMenuOpen) {
+        if (isOpening || isMenuOpen) {
             closeMenu(true);
         } else {
             openMenu(true);
@@ -148,75 +152,77 @@ public class MainMenu extends Stack {
     }
 
     public void closeMenu(boolean animated) {
-        isMenuOpen = false;
-        if (animated) {
-            if (!isClosing) {
-                isClosing = true;
-                isOpening = false;
-                moveAction = Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION);
-                addAction(Actions.sequence(
-                        moveAction,
+        if (!isMenuClose && !isClosing) {
+            removeAction(moveAction);
+            isMenuOpen = false;
+            isOpening = false;
+            isClosing = true;
+            if (animated) {
+                moveAction = Actions.sequence(
+                        Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION),
                         Actions.run(new Runnable() {
 
                             @Override
                             public void run() {
-                                if (!isMenuOpen) {
-                                    moveAction = null;
-                                    isClosing = false;
-                                    sendMenuPositionChangedEvent();
-                                }
+                                moveAction = null;
+                                isClosing = false;
+                                isMenuClose = true;
+                                sendMenuPositionChangedEvent();
                             }
-                        })));
+                        }));
+                addAction(moveAction);
                 ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_CLOSE).play();
+            } else {
+                moveAction = null;
+                isClosing = false;
+                isMenuClose = true;
+                setPosition(menuClosePositionX, menuPositionY);
+                sendMenuPositionChangedEvent();
             }
-        } else {
-            setPosition(menuClosePositionX, menuPositionY);
-            sendMenuPositionChangedEvent();
         }
     }
 
     public void openMenu(boolean animated) {
-        isMenuOpen = true;
-        sendMenuPositionChangedEvent();
-        if (animated) {
-            if (!isOpening) {
-                isOpening = true;
-                isClosing = false;
-                moveAction = Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION);
-                addAction(Actions.sequence(moveAction,
+        if (!isMenuOpen && !isOpening) {
+            removeAction(moveAction);
+            isMenuClose = false;
+            isClosing = false;
+            isOpening = true;
+            sendMenuPositionChangedEvent();
+            if (animated) {
+                moveAction = Actions.sequence(
+                        Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION),
                         Actions.run(new Runnable() {
 
                             @Override
                             public void run() {
-                                if (isMenuOpen) {
-                                    moveAction = null;
-                                    isOpening = false;
-                                }
+                                moveAction = null;
+                                isMenuOpen = true;
+                                isOpening = false;
                             }
-                        })));
+                        }));
+                addAction(moveAction);
                 ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_OPEN).play();
+            } else {
+                moveAction = null;
+                isMenuOpen = true;
+                isOpening = false;
+                setPosition(menuOpenPositionX, menuPositionY);
             }
-        } else {
-            setPosition(menuOpenPositionX, menuPositionY);
         }
     }
 
-
-//////////////////////////// POSITION CHANGED EVENT
+    //////////////////////////// POSITION CHANGED EVENT
 
     private void sendMenuPositionChangedEvent() {
-        ApplicationBus.getInstance().post(new MainMenuPositionChangedEvent(isMenuOpen)).asynchronously();
+        ApplicationBus.getInstance().post(new MainMenuPositionChangedEvent(!isMenuClose)).asynchronously();
     }
 
 
 //////////////////////////// MENU MOVE PROGRESS
 
     public float getMenuOpenPercentage() {
-        if (moveAction != null) {
-            return 1 - Math.abs(getX() / menuClosePositionX);
-        } else {
-            return isMenuOpen ? 1 : 0;
-        }
+        return 1 - Math.abs(getX() / menuClosePositionX);
     }
 
 }
-- 
GitLab