using Content.Client.UserInterface.Controls;
using Content.Shared.Disposal.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
namespace Content.Client.Disposal.Unit
{
///
/// Client-side UI used to control a
///
[GenerateTypedNameReferences]
public sealed partial class DisposalUnitWindow : FancyWindow
{
// Values for managing the pressure bar
private TimeSpan _fullPressure;
private float _pressurePerSecond;
public event Action? OnTogglePower;
public event Action? OnEject;
public event Action? OnEngage;
public event Action? OnChangeRouting;
public DisposalUnitWindow()
{
RobustXamlLoader.Load(this);
Power.OnPressed += args => TogglePower(args.Button.Pressed);
Eject.OnPressed += _ => BeginEject();
Engage.OnPressed += _ => BeginEngage();
Routing.OnPressed += _ => ChangeRouting();
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
PressureBar.UpdatePressure(_fullPressure, _pressurePerSecond);
}
public void Populate(bool powered, bool engaged, DisposalsPressureState disposalState, TimeSpan fullPressure, float pressurePerSecond)
{
ToggleUnitStateText(powered);
UnitState.Text = Loc.GetString($"disposal-unit-state-{disposalState}");
_fullPressure = fullPressure;
_pressurePerSecond = pressurePerSecond;
Power.Pressed = powered;
Engage.Pressed = engaged;
}
public void PopulateRouting(bool editable, bool accessible)
{
Routing.Visible = editable;
Routing.Disabled = !accessible;
Routing.ToolTip = accessible ? null : Loc.GetString("generic-no-access");
}
///
/// This trick is used to hide power being unpredicted so the UI feels responsive.
///
private void ToggleUnitStateText(bool powered)
{
UnitState.Visible = powered;
UnitStateUnpowered.Visible = !powered;
}
private void TogglePower(bool powered)
{
ToggleUnitStateText(powered);
OnTogglePower?.Invoke(DisposalUnitUiButton.Power);
}
private void BeginEject()
{
OnEject?.Invoke(DisposalUnitUiButton.Eject);
}
private void BeginEngage()
{
OnEngage?.Invoke(DisposalUnitUiButton.Engage);
}
private void ChangeRouting()
{
OnChangeRouting?.Invoke();
}
}
}