using Content.Shared.GameObjects.Components.Disposal; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; using Robust.Shared.Maths; using System.Collections.Generic; using Robust.Client.Graphics; using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalMailingUnitComponent; namespace Content.Client.GameObjects.Components.Disposal { /// /// Client-side UI used to control a /// public class DisposalMailingUnitWindow : SS14Window { private readonly Label _unitState; private readonly ProgressBar _pressureBar; private readonly Label _pressurePercentage; public readonly Button Engage; public readonly Button Eject; public readonly Button Power; public readonly ItemList TargetListContainer; public List TargetList; private readonly Label _tagLabel; public DisposalMailingUnitWindow() { MinSize = SetSize = (460, 220); TargetList = new List(); Contents.AddChild(new HBoxContainer { Children = { new VBoxContainer { HorizontalExpand = true, Margin = new Thickness(8, 0), Children = { new HBoxContainer { Children = { new Label {Text = Loc.GetString("State: ")}, new Control {MinSize = (4, 0)}, (_unitState = new Label {Text = Loc.GetString("Ready")}) } }, new Control {MinSize = (0, 10)}, new HBoxContainer { HorizontalExpand = true, Children = { new Label {Text = Loc.GetString("Pressure:")}, new Control {MinSize = (4, 0)}, (_pressureBar = new ProgressBar { MinSize = (100, 20), HorizontalExpand = true, MinValue = 0, MaxValue = 1, Page = 0, Value = 0.5f, Children = { (_pressurePercentage = new Label()) } }) } }, new Control {MinSize = (0, 10)}, new HBoxContainer { HorizontalExpand = true, Children = { new Label {Text = Loc.GetString("Handle:")}, new Control { MinSize = (4, 0), HorizontalExpand = true }, (Engage = new Button { MinSize = (16, 0), Text = Loc.GetString("Engage"), ToggleMode = true, Disabled = true }) } }, new Control {MinSize = (0, 10)}, new HBoxContainer { HorizontalExpand = true, Children = { new Label {Text = Loc.GetString("Eject:")}, new Control { MinSize = (4, 0), HorizontalExpand = true }, (Eject = new Button { MinSize = (16, 0), Text = Loc.GetString("Eject Contents"), //HorizontalAlignment = HAlignment.Right }) } }, new Control {MinSize = (0, 10)}, new HBoxContainer { Children = { (Power = new CheckButton {Text = Loc.GetString("Power")}), } } } }, new VBoxContainer { Margin = new Thickness(12, 0, 8, 0), Children = { new HBoxContainer { Children = { new Label { Text = Loc.GetString("Select a destination:") } } }, new Control {MinSize = new Vector2(0, 8)}, new HBoxContainer { VerticalExpand = true, Children = { (TargetListContainer = new ItemList { SelectMode = ItemList.ItemListSelectMode.Single, HorizontalExpand = true, VerticalExpand = true }) } }, new PanelContainer { PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex("#ACBDBA") }, HorizontalExpand = true, MinSize = new Vector2(0, 1), }, new HBoxContainer { Children = { new VBoxContainer { Children = { new HBoxContainer { Margin = new Thickness(4, 0, 0, 0), Children = { new Label { Text = Loc.GetString("This unit:") }, new Control { MinSize = new Vector2(4, 0) }, (_tagLabel = new Label { Text = "-", VerticalAlignment = VAlignment.Bottom }) } } } } } } } } } }); } private void UpdatePressureBar(float pressure) { _pressureBar.Value = pressure; var normalized = pressure / _pressureBar.MaxValue; const float leftHue = 0.0f; // Red const float middleHue = 0.066f; // Orange const float rightHue = 0.33f; // Green const float saturation = 1.0f; // Uniform saturation const float value = 0.8f; // Uniform value / brightness const float alpha = 1.0f; // Uniform alpha // These should add up to 1.0 or your transition won't be smooth const float leftSideSize = 0.5f; // Fraction of _chargeBar lerped from leftHue to middleHue const float rightSideSize = 0.5f; // Fraction of _chargeBar lerped from middleHue to rightHue float finalHue; if (normalized <= leftSideSize) { normalized /= leftSideSize; // Adjust range to 0.0 to 1.0 finalHue = MathHelper.Lerp(leftHue, middleHue, normalized); } else { normalized = (normalized - leftSideSize) / rightSideSize; // Adjust range to 0.0 to 1.0. finalHue = MathHelper.Lerp(middleHue, rightHue, normalized); } // Check if null first to avoid repeatedly creating this. _pressureBar.ForegroundStyleBoxOverride ??= new StyleBoxFlat(); var foregroundStyleBoxOverride = (StyleBoxFlat) _pressureBar.ForegroundStyleBoxOverride; foregroundStyleBoxOverride.BackgroundColor = Color.FromHsv(new Vector4(finalHue, saturation, value, alpha)); var percentage = pressure / _pressureBar.MaxValue * 100; _pressurePercentage.Text = $" {percentage:0}%"; } public void UpdateState(DisposalMailingUnitBoundUserInterfaceState state) { Title = state.UnitName; _unitState.Text = state.UnitState; UpdatePressureBar(state.Pressure); Power.Pressed = state.Powered; Engage.Pressed = state.Engaged; PopulateTargetList(state.Tags); _tagLabel.Text = state.Tag; TargetList = state.Tags; } private void PopulateTargetList(List tags) { TargetListContainer.Clear(); foreach (var target in tags) { TargetListContainer.AddItem(target); } } } }