package mightypork.gamecore.gui.screens; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.TreeSet; import mightypork.gamecore.core.App; import mightypork.gamecore.gui.events.LayoutChangeEvent; import mightypork.gamecore.gui.events.ScreenRequestListener; import mightypork.gamecore.gui.events.ViewportChangeEvent; import mightypork.gamecore.gui.events.ViewportChangeListener; import mightypork.gamecore.render.Renderable; import mightypork.utils.eventbus.clients.BusNode; import mightypork.utils.logging.Log; /** * Game screens holder; Takes care of rendering and screen requests. * * @author Ondřej Hruška (MightyPork) */ public class ScreenRegistry extends BusNode implements ScreenRequestListener, ViewportChangeListener, Renderable { private final Map screens = new HashMap<>(); private final Collection overlays = new TreeSet<>(); private volatile Screen active = null; /** * Add a screen * * @param name screen key for calling * @param screen added screen */ public void addScreen(String name, Screen screen) { screens.put(name, screen); addChildClient(screen); } /** * Add an overlay * * @param overlay added overlay */ public void addOverlay(Overlay overlay) { overlays.add(overlay); addChildClient(overlay); } @Override public void showScreen(String key) { Log.f3("Request to show screen \"" + key + "\""); // find screen to show final Screen toShow = screens.get(key); if (toShow == null) { throw new RuntimeException("Screen " + key + " not defined."); } // deactivate last screen if (active != null) { active.setActive(false); } // activate new screen toShow.setActive(true); active = toShow; fireLayoutUpdateEvent(); } @Override public void render() { if (active != null) { active.render(); for (final Overlay overlay : overlays) { if (overlay.isVisible()) overlay.render(); } } } @Override public void onViewportChanged(ViewportChangeEvent event) { if (active != null) fireLayoutUpdateEvent(); } private void fireLayoutUpdateEvent() { App.bus().sendDirectToChildren(this, new LayoutChangeEvent()); } }