using Robust.Client.GameObjects; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.GameObjects; using Robust.Shared.IoC; namespace Content.Client.Computer { /// /// ComputerBoundUserInterface shunts all sorts of responsibilities that are in the BoundUserInterface for architectural reasons into the Window. /// NOTE: Despite the name, ComputerBoundUserInterface does not and will not care about things like power. /// public class ComputerBoundUserInterface : ComputerBoundUserInterfaceBase where TWindow : BaseWindow, IComputerWindow, new() where TState : BoundUserInterfaceState { [Dependency] private readonly IDynamicTypeFactory _dynamicTypeFactory = default!; private TWindow? _window; protected override void Open() { base.Open(); _window = (TWindow) _dynamicTypeFactory.CreateInstance(typeof(TWindow)); _window.SetupComputerWindow(this); _window.OnClose += Close; _window.OpenCentered(); } // Alas, this constructor has to be copied to the subclass. :( public ComputerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {} protected override void UpdateState(BoundUserInterfaceState state) { base.UpdateState(state); if (_window == null) { return; } _window.UpdateState((TState) state); } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { _window?.Dispose(); } } } /// /// This class is to avoid a lot of <> being written when we just want to refer to SendMessage. /// We could instead qualify a lot of generics even further, but that is a waste of time. /// public class ComputerBoundUserInterfaceBase : BoundUserInterface { public ComputerBoundUserInterfaceBase(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) {} public new void SendMessage(BoundUserInterfaceMessage msg) { base.SendMessage(msg); } } public interface IComputerWindow { void SetupComputerWindow(ComputerBoundUserInterfaceBase cb) {} void UpdateState(TState state) {} } }