package org.ege.widget; import okj.easy.core.eAdmin; import org.ege.utils.Pauseable; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Scaling; /** * Layout is more flexible by using multi panel to present final UI * * @author Trung * */ public class Layout extends Stage implements Pauseable { private static int LAYOUT_ID = 999; // ================================================ // Panel manage private final Panel mDefaultPanel = new Panel(); // for safemode enable private Panel mSafeModePanel = null; /** * We only use this in safemode to save the last UI when pause and resume */ private final Array<Actor> mCurrentVisiblePanel = new Array<Actor>(6); private boolean isSafeModeEnable = false; // ================================================== public final int ID; public float alpha = 1f; final Image mBackground; public Layout(boolean strecth) { super(eAdmin.uiWidth(), eAdmin.uiHeight(), strecth); addPanelToRoot(mDefaultPanel); mCurPanel = mDefaultPanel; mDefaultPanel.setBounds(0, 0, eAdmin.uiWidth(), eAdmin.uiHeight()); ID = LAYOUT_ID++; mBackground = new Image(); mBackground.setBounds(0, 0, eAdmin.uiWidth(), eAdmin.uiHeight()); mBackground.setTouchable(Touchable.disabled); mBackground.setScaling(Scaling.stretch); mBackground.setZIndex(0); eAdmin.einput.addProcessor(ID, this); } /******************************************************* * *******************************************************/ public void setBackground (Drawable drawable) { if (mBackground.getParent() == null) mDefaultPanel.addActorAt(0, mBackground); mBackground.setDrawable(drawable); } public void setBackground (TextureRegion region) { if (mBackground.getParent() == null) mDefaultPanel.addActorAt(0, mBackground); mBackground.setDrawable(new TextureRegionDrawable(region)); } public Image getBackground () { return mBackground; } /******************************************************* * *******************************************************/ public void addAction (Action action) { mBackground.addAction(action); getRoot().addAction(action); } public Layout setEnable (boolean enable) { mBackground.setTouchable(Touchable.enabled); return this; } /******************************************************* * Panel Manage *******************************************************/ /** * Add track to new panel * * @param panel */ public void addPanel (Panel panel) { addPanelToRoot(panel); } /** * Create new panel track to it and set it as current for add function * * @return */ public Panel createPanel () { Panel panel = new Panel(); mCurPanel = panel; addPanelToRoot(panel); return panel; } /** * Turn this panel into safe mode, only use a backup panel (mSafeModePanel) * * @return */ public Panel createSafeModePanel () { // save visible list mCurrentVisiblePanel.clear(); Array<Actor> list = getActors(); for (Actor a : list) if (a.isVisible()) mCurrentVisiblePanel.add(a); // create safe panel if (mSafeModePanel == null) mSafeModePanel = new Panel(); mSafeModePanel.setVisible(true); mCurPanel = mSafeModePanel; addPanelToRoot(mSafeModePanel); isSafeModeEnable = true; return mSafeModePanel; } /** * Restore the panel state to the before enable safe mode */ public void restore () { if (isSafeModeEnable) { mSafeModePanel.clear(); getRoot().removeActor(mSafeModePanel); for (Actor a : mCurrentVisiblePanel) a.setVisible(true); mCurPanel = mDefaultPanel; isSafeModeEnable = false; } } public void removePanel (Panel panel) { getRoot().removeActor(panel); } public void setVisiblePanel (Panel... list) { Array<Actor> root = getActors(); for (Actor a : root) a.setVisible(false); for (Panel panel : list) panel.setVisible(true); } public void setToDefault () { mCurPanel = mDefaultPanel; Array<Actor> root = getActors(); for (Actor a : root) a.setVisible(false); mDefaultPanel.setVisible(true); } public void setToCurrent () { Array<Actor> root = getActors(); for (Actor a : root) a.setVisible(false); mCurPanel.setVisible(true); } private void addPanelToRoot (Panel panel) { getRoot().addActor(panel); } // ========================================== // getter method public Panel getCurrentPanel () { return mCurPanel; } public Panel getDefaultPanel () { return mDefaultPanel; } /******************************************************* * Actor manage *******************************************************/ private Panel mCurPanel = mDefaultPanel; @Override public void addActor (Actor actor) { mCurPanel.addActor(actor); } public void setCurrentPanel (Panel panel) { if (getActors().contains(panel, true)) mCurPanel = panel; } /******************************************************* * *******************************************************/ @Override public void Pause () { eAdmin.einput.removeProcessor(ID); } @Override public void Resume () { eAdmin.einput.addProcessor(ID, this); } /******************************************************* * *******************************************************/ /** * This method will remove all panel (just keep default panel ) and then * reset the default panel */ public void clear () { super.clear(); mDefaultPanel.clear(); mDefaultPanel.setVisible(true); mCurPanel = mDefaultPanel; addPanelToRoot(mDefaultPanel); eAdmin.einput.removeProcessor(ID); } @Override public void dispose () { super.dispose(); clear(); eAdmin.einput.removeProcessor(ID); } }