Files
tbd-station-14/Content.Client/Forensics/ForensicScannerBoundUserInterface.cs
Vordenburg ed8141d333 Fix forensic scanner UI. (#12398)
* Add missing Dispose method to ForensicScannerBoundUserInterface.

* Remove old code from ForensicScanner.

* Prevent forensic scanner from being used on the floor and allow its window to stay open when active hand is swapped.

* Use more standardized UI code for ForensicScanner.

* Add a delay to ForensicScanner printing.

* Show name of what was scanned on ForensicScanner UI.

* Add a print sound for ForensicScanner.

* Add more error reporting for ForensicScanner.

* Centralize common logic in ForensicScannerSystem.

* Allow ForensicScanner blank printouts.

* Tweak ForensicScanner audio parameters.
2022-11-08 15:06:09 -06:00

83 lines
2.3 KiB
C#

using Robust.Client.GameObjects;
using Robust.Shared.Timing;
using Content.Shared.Forensics;
namespace Content.Client.Forensics
{
public sealed class ForensicScannerBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
private ForensicScannerMenu? _window;
private TimeSpan _printCooldown;
public ForensicScannerBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
_window = new ForensicScannerMenu();
_window.OnClose += Close;
_window.Print.OnPressed += _ => Print();
_window.Clear.OnPressed += _ => Clear();
_window.OpenCentered();
}
private void Print()
{
SendMessage(new ForensicScannerPrintMessage());
if (_window != null)
_window.UpdatePrinterState(true);
// This UI does not require pinpoint accuracy as to when the Print
// button is available again, so spawning client-side timers is
// fine. The server will make sure the cooldown is honored.
Timer.Spawn(_printCooldown, () =>
{
if (_window != null)
_window.UpdatePrinterState(false);
});
}
private void Clear()
{
SendMessage(new ForensicScannerClearMessage());
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (_window == null)
return;
if (state is not ForensicScannerBoundUserInterfaceState cast)
return;
_printCooldown = cast.PrintCooldown;
if (cast.PrintReadyAt > _gameTiming.CurTime)
Timer.Spawn(cast.PrintReadyAt - _gameTiming.CurTime, () =>
{
if (_window != null)
_window.UpdatePrinterState(false);
});
_window.UpdateState(cast);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!disposing)
return;
_window?.Dispose();
}
}
}