From 5a991b24abfe0aa84b4b257c9d0b7fc3fe006a49 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Tue, 17 Mar 2015 10:22:04 +0100
Subject: [PATCH] #19 Pause/Resume in reaction to main menu state

---
 .../event/MainMenuPositionChangedEvent.java   |  16 ++
 core/src/cz/nic/tablexia/menu/MainMenu.java   | 272 ++++++++++--------
 .../screen/AbstractTablexiaScreen.java        |  30 +-
 3 files changed, 186 insertions(+), 132 deletions(-)
 create mode 100644 core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java

diff --git a/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java b/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java
new file mode 100644
index 000000000..a2024d071
--- /dev/null
+++ b/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java
@@ -0,0 +1,16 @@
+package cz.nic.tablexia.bus.event;
+
+import cz.nic.tablexia.bus.ApplicationBus;
+
+public class MainMenuPositionChangedEvent implements ApplicationBus.ApplicationEvent {
+
+    private boolean isMenuOpen;
+
+    public MainMenuPositionChangedEvent(boolean isMenuOpen) {
+        this.isMenuOpen = isMenuOpen;
+    }
+
+    public boolean isMenuOpen() {
+        return isMenuOpen;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/menu/MainMenu.java b/core/src/cz/nic/tablexia/menu/MainMenu.java
index 72d7a11c5..7d44b7f16 100644
--- a/core/src/cz/nic/tablexia/menu/MainMenu.java
+++ b/core/src/cz/nic/tablexia/menu/MainMenu.java
@@ -3,7 +3,6 @@ package cz.nic.tablexia.menu;
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.Texture.TextureFilter;
-import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.graphics.g2d.TextureRegion;
 import com.badlogic.gdx.math.Interpolation;
 import com.badlogic.gdx.math.Interpolation.PowOut;
@@ -19,6 +18,8 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 
 import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.bus.ApplicationBus;
+import cz.nic.tablexia.bus.event.MainMenuPositionChangedEvent;
 import cz.nic.tablexia.graphics.ColorTexture;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.loader.application.ApplicationSoundManager;
@@ -26,138 +27,155 @@ import cz.nic.tablexia.loader.application.ApplicationTextureManager;
 
 /**
  * MainMenu container
- * 
- * @author Matyáš Latner
  *
+ * @author Matyáš Latner
  */
 public class MainMenu extends Stack {
-	
-	private static final float 	MENU_MOVE_DURATION 			= 1f;
-	private static final PowOut MENU_MOVE_INTERPOLATION 	= Interpolation.pow4Out;
-	private static final float 	MENU_CONTROLLER_SIZE_RATIO	= (1f/7);
-	private static final Color 	MENU_TEXT_COLOR 			= Color.BLACK;
-	private static final int 	OPEN_MENU_BUTTON_WIDTH 		= 55;
-	private static final int 	OPEN_MENU_BUTTON_HEIGHT 	= 75;
-	private static final int 	OPEN_MENU_BUTTON_TOP_OFFSET = 60;
-	
-	private Table 			menuTableLayout;
-	private TextButtonStyle menuButtonStyle;
-	private boolean 		isMenuOpen;
-	private Button 			openCloseButton;
-	private float 			menuClosePositionX;
-	private int             menuOpenPositionX;
-	private int             menuPositionY;
-
-	public MainMenu(float width, float height) {
-		setBounds(0, 0, width, height);
-		setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
-		Texture background = ApplicationTextureManager.getInstance().getTexture(ApplicationTextureManager.MAINMENU_BACKGROUND);
-		background.setFilter(TextureFilter.Linear, TextureFilter.Linear);
-		
-		// menu layout
-		menuTableLayout = new Table();
-		menuTableLayout.setFillParent(true);
-		menuTableLayout.setBackground(new TextureRegionDrawable(new TextureRegion(background)));
-		addActor(menuTableLayout);
-		
-		// menu button style
-		menuButtonStyle = new TextButtonStyle();
-		menuButtonStyle.font = ApplicationFontManager.getInstance().getFont(ApplicationFontManager.FONT_ROBOTO_REGULAR);
-		menuButtonStyle.fontColor = MENU_TEXT_COLOR;
-		menuButtonStyle.up = new TextureRegionDrawable(new TextureRegion(new ColorTexture(50, 50, Color.BLUE)));
-		
-		// open close button
-		openCloseButton = new Button(new TextureRegionDrawable(new TextureRegion(new ColorTexture(OPEN_MENU_BUTTON_WIDTH, OPEN_MENU_BUTTON_HEIGHT, Color.RED))));
-		openCloseButton.addAction(Actions.alpha(0));
-		openCloseButton.align(Align.topRight);
-		openCloseButton.addListener(new ClickListener() {
-			
-			@Override
-			public void clicked(InputEvent event, float x, float y) {
-				toggleMenu();
-			}	
-		});
-		Table openCloseButtonContainer = new Table();
-		openCloseButtonContainer.add(openCloseButton).expandX().padTop(OPEN_MENU_BUTTON_TOP_OFFSET).right();
-		openCloseButtonContainer.row();
-		openCloseButtonContainer.add().expandY();
-		addActor(openCloseButtonContainer);
-		
-		prepareMenuPositions();
-		closeMenu(false);
-	}
-	
-	
+
+    private static final float MENU_MOVE_DURATION = 1f;
+    private static final PowOut MENU_MOVE_INTERPOLATION = Interpolation.pow4Out;
+    private static final float MENU_CONTROLLER_SIZE_RATIO = (1f / 7);
+    private static final Color MENU_TEXT_COLOR = Color.BLACK;
+    private static final int OPEN_MENU_BUTTON_WIDTH = 55;
+    private static final int OPEN_MENU_BUTTON_HEIGHT = 75;
+    private static final int OPEN_MENU_BUTTON_TOP_OFFSET = 60;
+
+    private Table menuTableLayout;
+    private TextButtonStyle menuButtonStyle;
+    private boolean isMenuOpen;
+    private Button openCloseButton;
+    private float menuClosePositionX;
+    private int menuOpenPositionX;
+    private int menuPositionY;
+
+    public MainMenu(float width, float height) {
+        setBounds(0, 0, width, height);
+        setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
+        Texture background = ApplicationTextureManager.getInstance().getTexture(ApplicationTextureManager.MAINMENU_BACKGROUND);
+        background.setFilter(TextureFilter.Linear, TextureFilter.Linear);
+
+        // menu layout
+        menuTableLayout = new Table();
+        menuTableLayout.setFillParent(true);
+        menuTableLayout.setBackground(new TextureRegionDrawable(new TextureRegion(background)));
+        addActor(menuTableLayout);
+
+        // menu button style
+        menuButtonStyle = new TextButtonStyle();
+        menuButtonStyle.font = ApplicationFontManager.getInstance().getFont(ApplicationFontManager.FONT_ROBOTO_REGULAR);
+        menuButtonStyle.fontColor = MENU_TEXT_COLOR;
+        menuButtonStyle.up = new TextureRegionDrawable(new TextureRegion(new ColorTexture(50, 50, Color.BLUE)));
+
+        // open close button
+        openCloseButton = new Button(new TextureRegionDrawable(new TextureRegion(new ColorTexture(OPEN_MENU_BUTTON_WIDTH, OPEN_MENU_BUTTON_HEIGHT, Color.RED))));
+        openCloseButton.addAction(Actions.alpha(0));
+        openCloseButton.align(Align.topRight);
+        openCloseButton.addListener(new ClickListener() {
+
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                toggleMenu();
+            }
+        });
+        Table openCloseButtonContainer = new Table();
+        openCloseButtonContainer.add(openCloseButton).expandX().padTop(OPEN_MENU_BUTTON_TOP_OFFSET).right();
+        openCloseButtonContainer.row();
+        openCloseButtonContainer.add().expandY();
+        addActor(openCloseButtonContainer);
+
+        prepareMenuPositions();
+        closeMenu(false);
+    }
+
+
 //////////////////////////// MENU ITEMS
-	
-	public void initMenuItems() {
-		menuTableLayout.reset();
-		menuTableLayout.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
-		
-		for (final MainMenuDefinition menuItem : MainMenuDefinition.values()) {
-			addMenuItem(menuItem);
-			IMenuItem[] subMenu = menuItem.getSubmenu();
-			if (subMenu != null) {
-				for (IMenuItem submenuItem : subMenu) {
-					addMenuItem(submenuItem);
-				}
-			}
-		}
-	}
-	
-	private void addMenuItem(final IMenuItem menuItem) {
-		TextButton subMenuButton = new TextButton(menuItem.getTitle(), menuButtonStyle);
-		subMenuButton.addListener(new ClickListener() {
-			
-			@Override
-			public void clicked(InputEvent event, float x, float y) {
-				menuItem.performAction();
-				if (menuItem.isCloseMenu()) {					
-					closeMenu(true);
-				}
-			}
-			
-		});
-		menuTableLayout.add(subMenuButton).expandX();
-		menuTableLayout.row();
-	}
-	
-	
+
+    public void initMenuItems() {
+        menuTableLayout.reset();
+        menuTableLayout.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes());
+
+        for (final MainMenuDefinition menuItem : MainMenuDefinition.values()) {
+            addMenuItem(menuItem);
+            IMenuItem[] subMenu = menuItem.getSubmenu();
+            if (subMenu != null) {
+                for (IMenuItem submenuItem : subMenu) {
+                    addMenuItem(submenuItem);
+                }
+            }
+        }
+    }
+
+    private void addMenuItem(final IMenuItem menuItem) {
+        TextButton subMenuButton = new TextButton(menuItem.getTitle(), menuButtonStyle);
+        subMenuButton.addListener(new ClickListener() {
+
+            @Override
+            public void clicked(InputEvent event, float x, float y) {
+                menuItem.performAction();
+                if (menuItem.isCloseMenu()) {
+                    closeMenu(true);
+                }
+            }
+
+        });
+        menuTableLayout.add(subMenuButton).expandX();
+        menuTableLayout.row();
+    }
+
+
 //////////////////////////// MENU MOVEMENT
-	
-	private void prepareMenuPositions() {
-		isMenuOpen = false;
-		menuClosePositionX = -(getWidth() - (getWidth() * MENU_CONTROLLER_SIZE_RATIO));
-		menuOpenPositionX = 0;
-		menuPositionY = 0;
-	}
-	
-	private void toggleMenu() {
-		if (isMenuOpen) {
-			closeMenu(true);
-		} else {
-			openMenu(true);
-		}
-	}
-	
-	private void closeMenu(boolean animated) {
-		isMenuOpen = false;
-		if (animated) {
-			addAction(Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION));
+
+    private void prepareMenuPositions() {
+        isMenuOpen = false;
+        menuClosePositionX = -(getWidth() - (getWidth() * MENU_CONTROLLER_SIZE_RATIO));
+        menuOpenPositionX = 0;
+        menuPositionY = 0;
+    }
+
+    private void toggleMenu() {
+        if (isMenuOpen) {
+            closeMenu(true);
+        } else {
+            openMenu(true);
+        }
+    }
+
+    private void closeMenu(boolean animated) {
+        isMenuOpen = false;
+        if (animated) {
+            addAction(Actions.sequence(Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION),
+                    Actions.run(new Runnable() {
+
+                        @Override
+                        public void run() {
+                            if (!isMenuOpen) {
+                                sendMenuPositionChangedEvent();
+                            }
+                        }
+                    })));
             ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_CLOSE).play();
-		} else {
-			setPosition(menuClosePositionX, menuPositionY);
-		}
-	}
-	
-	private void openMenu(boolean animated) {
-		isMenuOpen = true;
-		if (animated) {
-			addAction(Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION));
+        } else {
+            setPosition(menuClosePositionX, menuPositionY);
+            sendMenuPositionChangedEvent();
+        }
+    }
+
+    private void openMenu(boolean animated) {
+        isMenuOpen = true;
+        sendMenuPositionChangedEvent();
+        if (animated) {
+            addAction(Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION));
             ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_OPEN).play();
-		} else {
-			setPosition(menuOpenPositionX, menuPositionY);
-		}
-	}
+        } else {
+            setPosition(menuOpenPositionX, menuPositionY);
+        }
+    }
+
+
+//////////////////////////// POSITION CHANGED EVENT
+
+    private void sendMenuPositionChangedEvent() {
+        ApplicationBus.getInstance().post(new MainMenuPositionChangedEvent(isMenuOpen)).asynchronously();
+    }
 
 }
diff --git a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
index 2d4938990..31f3aec1f 100644
--- a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
+++ b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
@@ -12,6 +12,8 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.utils.I18NBundle;
 import com.badlogic.gdx.utils.async.AsyncTask;
 
+import net.engio.mbassy.listener.Handler;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -19,6 +21,7 @@ import java.util.Locale;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.bus.ApplicationBus.ApplicationEvent;
+import cz.nic.tablexia.bus.event.MainMenuPositionChangedEvent;
 import cz.nic.tablexia.loader.TablexiaAssetManager;
 import cz.nic.tablexia.loader.TablexiaDataManager;
 import cz.nic.tablexia.loader.TablexiaSoundManager;
@@ -40,6 +43,7 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter {
     private boolean					loadingComplete;
     private boolean					loadingStarted;
     private boolean                 loadAsync;
+    private boolean                 paused;
 
     private static class TextManager extends TablexiaDataManager<I18NBundle> {
 
@@ -166,10 +170,19 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter {
     }
 
 
+//////////////////////////// MAIN MENU POSITION CHANGE HANDLER
+
+    @Handler
+    public void handleMainMenuPositionChangedEvent(MainMenuPositionChangedEvent mainMenuPositionChangedEvent) {
+        paused = mainMenuPositionChangedEvent.isMenuOpen();
+    }
+
+
 //////////////////////////// LIBGDX LIFECYCLE
 	
 	@Override
 	public final void show() {
+        ApplicationBus.getInstance().subscribe(this);
 		if (!loadingComplete) {
 			startTextureLoader();
 			startSoundLoader();
@@ -178,8 +191,13 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter {
 			loadingStarted = true;
 		}
 	}
-	
-	@Override
+
+    @Override
+    public void hide() {
+        ApplicationBus.getInstance().unsubscribe(this);
+    }
+
+    @Override
 	public final void resize(int width, int height) {
 		stage.getViewport().update(width, height, true);
 		if (loadingComplete) {
@@ -210,10 +228,12 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter {
 				notifyLoadingCompleteListeners();
 			}
 		} else {
-			screenRender(delta);
-			stage.act(delta);
+            screenRender(delta);
+            if (!paused) {
+                stage.act(delta);
+            }
 			stage.draw();
-		}
+        }
 	}
 	
 	@Override
-- 
GitLab