using Robust.Client.GameObjects; using Robust.Client.UserInterface.CustomControls; 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. /// [Virtual] public class ComputerBoundUserInterface : ComputerBoundUserInterfaceBase where TWindow : BaseWindow, IComputerWindow, new() where TState : BoundUserInterfaceState { [Dependency] private readonly IDynamicTypeFactory _dynamicTypeFactory = default!; [ViewVariables] 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(EntityUid owner, Enum 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(); } } protected override void ReceiveMessage(BoundUserInterfaceMessage message) { _window?.ReceiveMessage(message); } } /// /// 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. /// [Virtual] public class ComputerBoundUserInterfaceBase : BoundUserInterface { public ComputerBoundUserInterfaceBase(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } public new void SendMessage(BoundUserInterfaceMessage msg) { base.SendMessage(msg); } } public interface IComputerWindow { void SetupComputerWindow(ComputerBoundUserInterfaceBase cb) { } void UpdateState(TState state) { } void ReceiveMessage(BoundUserInterfaceMessage message) { } } }