using System; using System.Collections.Generic; using Robust.Client.State; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Utility; namespace Robust.Client.UserInterface; internal partial class UserInterfaceManager { private readonly Dictionary> _windowsByType = new(); private readonly Dictionary> _popupsByType = new(); public T CreatePopup() where T : Popup, new() { var newPopup = _typeFactory.CreateInstance(); _popupsByType.GetOrNew(typeof(T)).Enqueue(newPopup); ModalRoot.AddChild(newPopup); return newPopup; } public bool RemoveFirstPopup() where T : Popup, new() { if (!_popupsByType.TryGetValue(typeof(T),out var popupQueue)) return false; var oldPopup = popupQueue.Dequeue(); if (popupQueue.Count == 0) { _popupsByType.Remove(typeof(T)); } oldPopup.Close(); oldPopup.Orphan(); return true; } public bool TryGetFirstPopup(out T? popup) where T : Popup, new() { popup = null; var success = _popupsByType.TryGetValue(typeof(T), out var win); if (win is {Count: > 0}) { popup = (T)win.Peek(); } return success; } public bool TryGetFirstPopup(Type type, out Popup? popup) { popup = null; if (!typeof(Popup).IsAssignableFrom(type)) return false; if (!_popupsByType.TryGetValue(type, out var popupQueue) || popupQueue.Count == 0) return false; popup = popupQueue.Peek(); return true; } public bool RemoveFirstWindow() where T : BaseWindow, new() { if (!_windowsByType.TryGetValue(typeof(T),out var windowQueue)) return false; var oldWindow = windowQueue.Dequeue(); if (windowQueue.Count == 0) { _windowsByType.Remove(typeof(T)); } _uiManager.StateRoot.RemoveChild(oldWindow); oldWindow.Close(); return true; } public T GetFirstWindow() where T : BaseWindow, new() { if (!_windowsByType.TryGetValue(typeof(T), out var windowQueue) || windowQueue.Count == 0) throw new Exception("Window of type" + typeof(T) + " not found!"); return (T)windowQueue.Peek(); } public T CreateWindow() where T : BaseWindow, new() { //If we sandbox this we break creating engine windows. The argument is type bounded anyway so it only accepts //public classes that inherit from BaseWindow. var newWindow = _typeFactory.CreateInstanceUnchecked(); _windowsByType.GetOrNew(typeof(T)).Enqueue(newWindow); return newWindow; } private void RegisterWindowOfType(BaseWindow window) { if (_windowsByType.ContainsKey(window.GetType())) return; _windowsByType.GetOrNew(window.GetType()).Enqueue(window); } public bool TryGetFirstWindow(out T? window) where T : BaseWindow, new() { window = null; var success = _windowsByType.TryGetValue(typeof(T), out var win); if (win is {Count: > 0}) { window = (T)win.Peek(); } return success; } public bool TryGetFirstWindow(Type type, out BaseWindow? window) { window = null; if (!typeof(BaseWindow).IsAssignableFrom(type)) return false; if (!_windowsByType.TryGetValue(type, out var winQueue) || winQueue.Count == 0) return false; window = winQueue.Peek(); return true; } public void ClearWindows() { foreach (var data in _windowsByType) { data.Value.Dequeue().Close(); } _windowsByType.Clear(); } }