using System.Collections.Generic; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using MonoGameLibrary.Input; namespace FNAF_Clone.GUI; public class Screen { public static Dictionary Screens = new(); public static Screen CurrentScreen{ get; private set; } = Empty; public static void AddScreens(Screen[] screens) { foreach (var screen in screens){ Screens.Add(screen.Label, screen); } } public static void AddScreen(string id, Screen screen, bool activate = false) { Screens.Add(id, screen); if (activate) SetScreen(id); } public static void SetScreen(string id) { if (CurrentScreen != null){ CurrentScreen.Active = false; } CurrentScreen = Screens[id]; CurrentScreen.Active = true; } public static void RemoveScreen(string id) { Screens.Remove(id); } public static Screen Empty => new(""); public string Label; private Dictionary elements = new(); public bool Active { get; private set; } = false; private InputListenerHook mouseInputHook = new(true); public Screen(string label) { Label = label; InputManager.AddListener(InputManager.MouseButton.LEFT, () => ProcessMouseInput(InputManager.MouseState), InputTiming.PRESS, mouseInputHook); } public Screen(string label, Dictionary elements) { this.elements = elements; Label = label; } public UIElement this[string id] => elements[id]; public void AddElement(string id, UIElement element) { elements.Add(id, element); } public void SetActive(bool active) { Active = active; if (Active == active) return; foreach (var keyValuePair in elements){ keyValuePair.Value.Active = Active; } } private void ProcessMouseInput(MouseState mouseState) { if (!Active){ return; } foreach (var element in elements.Values){ if (!element.Pressable) continue; if (element.IsWithinBounds(mouseState.Position)){ element.OnMousePress(); // TODO: differentiate between press, hold and release events } } } public void Update() { foreach (var keyValuePair in elements){ keyValuePair.Value.Update(); } } public void Draw(SpriteBatch spriteBatch) { foreach (var val in elements.Values){ val.Draw(spriteBatch); } } }