diff --git a/Content.Client/Atmos/UI/SpaceHeaterBoundUserInterface.cs b/Content.Client/Atmos/UI/SpaceHeaterBoundUserInterface.cs new file mode 100644 index 00000000000000..4d8d1191e912c1 --- /dev/null +++ b/Content.Client/Atmos/UI/SpaceHeaterBoundUserInterface.cs @@ -0,0 +1,90 @@ +using Content.Shared.Atmos.Piping.Portable.Components; +using JetBrains.Annotations; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.Atmos.UI; + +/// +/// Initializes a and updates it when new server messages are received. +/// +[UsedImplicitly] +public sealed class SpaceHeaterBoundUserInterface : BoundUserInterface +{ + [ViewVariables] + private SpaceHeaterWindow? _window; + + public SpaceHeaterBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = new SpaceHeaterWindow(); + + if (State != null) + UpdateState(State); + + _window.OpenCentered(); + + _window.OnClose += Close; + + _window.ToggleStatusButton.OnPressed += _ => OnToggleStatusButtonPressed(); + _window.IncreaseTempRange.OnPressed += _ => OnTemperatureRangeChanged(_window.TemperatureChangeDelta); + _window.DecreaseTempRange.OnPressed += _ => OnTemperatureRangeChanged(-_window.TemperatureChangeDelta); + _window.ModeSelector.OnItemSelected += OnModeChanged; + + _window.PowerLevelSelector.OnItemSelected += OnPowerLevelChange; + } + + private void OnToggleStatusButtonPressed() + { + _window?.SetActive(!_window.Active); + SendMessage(new SpaceHeaterToggleMessage()); + } + + private void OnTemperatureRangeChanged(float changeAmount) + { + SendMessage(new SpaceHeaterChangeTemperatureMessage(changeAmount)); + } + + private void OnModeChanged(OptionButton.ItemSelectedEventArgs args) + { + _window?.ModeSelector.SelectId(args.Id); + SendMessage(new SpaceHeaterChangeModeMessage((SpaceHeaterMode)args.Id)); + } + + private void OnPowerLevelChange(RadioOptionItemSelectedEventArgs args) + { + _window?.PowerLevelSelector.Select(args.Id); + SendMessage(new SpaceHeaterChangePowerLevelMessage((SpaceHeaterPowerLevel)args.Id)); + } + + /// + /// Update the UI state based on server-sent info + /// + /// + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (_window == null || state is not SpaceHeaterBoundUserInterfaceState cast) + return; + + _window.SetActive(cast.Enabled); + _window.ModeSelector.SelectId((int)cast.Mode); + _window.PowerLevelSelector.Select((int)cast.PowerLevel); + + _window.MinTemp = cast.MinTemperature; + _window.MaxTemp = cast.MaxTemperature; + _window.SetTemperature(cast.TargetTemperature); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + _window?.Dispose(); + } +} diff --git a/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml new file mode 100644 index 00000000000000..1b7bd490b85dfb --- /dev/null +++ b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml @@ -0,0 +1,34 @@ + + + + + + +