6
StarHorizon_Public/Content.Client/_NF/Power/AdjustablePowerDrawMenu.xaml.cs
2026-01-05 11:43:53 +03:00

131 lines
3.7 KiB
C#

using Content.Client.UserInterface.Controls;
using Content.Shared._NF.Power;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._NF.Power;
/// <summary>
/// Interface control for items with adjustable power draw.
/// </summary>
/// <seealso cref="AdjustablePowerDrawBoundUserInterface"/>
[GenerateTypedNameReferences]
public sealed partial class AdjustablePowerDrawMenu : FancyWindow
{
// Dependencies
[Dependency] private readonly IEntityManager _entityManager = null!;
// The entity that this UI is for.
private EntityUid _entity;
// True if there are unsaved changes that should be maintained.
private bool _unsavedChanges;
// Events for the BUI to subscribe to.
public event Action<float>? OnSetLoad;
public event Action<bool>? OnSetPowered;
// Public state.
public bool On;
public AdjustablePowerDrawMenu()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
PowerDropDown.AddItem("W", 0);
PowerDropDown.AddItem("kW", 1);
PowerDropDown.AddItem("MW", 2);
PowerDropDown.AddItem("GW", 3);
PowerDropDown.OnItemSelected += x => PowerDropDown.SelectId(x.Id);
PowerDropDown.OnItemSelected += _ => SetUnsavedChanges();
Load.OnTextChanged += _ => SetUnsavedChanges();
SubmitButton.OnPressed += _ => CheckAndInvokeLoad();
TogglePowerButton.OnPressed += _ => SetPowered(!On);
TogglePowerButton.OnPressed += _ => OnSetPowered?.Invoke(TogglePowerButton.Pressed);
}
public void SetEntity(EntityUid entity)
{
_entity = entity;
this.SetInfoFromEntity(_entityManager, _entity);
}
public void Update(AdjustablePowerDrawBuiState msg)
{
SetPowered(msg.On);
if (string.IsNullOrEmpty(msg.Text))
{
ArbitraryText.Text = "";
ArbitraryText.Visible = false;
}
else
{
ArbitraryText.Text = msg.Text;
ArbitraryText.Visible = true;
}
// Set power text to current value in proper units
// unless user has pending changes
if (!_unsavedChanges && msg.Load >= 0)
{
if (msg.Load >= 1_000_000_000)
{
Load.Text = $"{msg.Load / 1_000_000_000:G3}";
PowerDropDown.TrySelect(3);
}
else if (msg.Load >= 1_000_000)
{
Load.Text = $"{msg.Load / 1_000_000:G3}";
PowerDropDown.TrySelect(2);
}
else if (msg.Load >= 1_000)
{
Load.Text = $"{msg.Load / 1_000:G3}";
PowerDropDown.TrySelect(1);
}
else
{
Load.Text = $"{msg.Load:G3}";
PowerDropDown.TrySelect(0);
}
}
}
private void CheckAndInvokeLoad()
{
_unsavedChanges = false;
UnsavedChanges.Visible = false;
if (!float.TryParse(Load.Text, out var result))
return;
if (!float.IsFinite(result) || !float.IsPositive(result))
return;
if (PowerDropDown.SelectedId > 0)
result *= MathF.Pow(1000.0f, PowerDropDown.SelectedId);
OnSetLoad?.Invoke(result);
}
private void SetUnsavedChanges()
{
_unsavedChanges = true;
UnsavedChanges.Visible = true;
}
public void SetPowered(bool on)
{
On = on;
TogglePowerButton.Pressed = on;
TogglePowerButton.Text = Loc.GetString(
on ? "comp-gas-pump-ui-status-enabled" : "comp-gas-pump-ui-status-disabled");
}
}