diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml index b78c3c6a56..670140f0a0 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml @@ -1,33 +1,26 @@ - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 36f7a08b96..2e07120827 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -1,189 +1,67 @@ -using System.Linq; using System.Numerics; +using System.Text; +using System.Linq; +using Content.Client.UserInterface.Controls; +using Content.Client.White.Medical.BodyScanner; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; using Content.Shared.MedicalScanner; +using Content.Shared.Mobs.Components; using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; -using Robust.Client.UserInterface.Controls; -using Robust.Client.ResourceManagement; using Robust.Shared.Prototypes; -using Robust.Shared.Utility; namespace Content.Client.HealthAnalyzer.UI { + // WD start [GenerateTypedNameReferences] - public sealed partial class HealthAnalyzerWindow : DefaultWindow + public sealed partial class HealthAnalyzerWindow : FancyWindow { - private readonly IEntityManager _entityManager; - private readonly SpriteSystem _spriteSystem; - private readonly IPrototypeManager _prototypes; - private readonly IResourceCache _cache; - - private const int AnalyzerHeight = 430; - private const int AnalyzerWidth = 300; - public HealthAnalyzerWindow() { RobustXamlLoader.Load(this); - - var dependencies = IoCManager.Instance!; - _entityManager = dependencies.Resolve(); - _spriteSystem = _entityManager.System(); - _prototypes = dependencies.Resolve(); - _cache = dependencies.Resolve(); } public void Populate(HealthAnalyzerScannedUserMessage msg) { - GroupsContainer.RemoveAllChildren(); + var entities = IoCManager.Resolve(); - var target = _entityManager.GetEntity(msg.TargetEntity); - - if (target == null - || !_entityManager.TryGetComponent(target, out var damageable)) + if (msg.TargetEntity != null && + entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), out var damageable)) { - NoPatientDataText.Visible = true; - return; - } + EntityNameLabel.Text = Identity.Name(entities.GetEntity(msg.TargetEntity.Value), entities); + TemperatureLabel.Text = float.IsNaN(msg.Temperature) ? Loc.GetString("health-analyzer-window-no-data") : $"{msg.Temperature - 273f:F1} \u00B0C"; + BloodLevelLabel.Text = float.IsNaN(msg.BloodLevel) ? Loc.GetString("health-analyzer-window-no-data") : $"{msg.BloodLevel * 100:F1} %"; + TotalDamageLabel.Text = damageable.TotalDamage.ToString(); - NoPatientDataText.Visible = false; + entities.TryGetComponent(entities.GetEntity(msg.TargetEntity), out var mobStateComponent); - string entityName = Loc.GetString("health-analyzer-window-entity-unknown-text"); - if (_entityManager.HasComponent(target.Value)) - { - entityName = Identity.Name(target.Value, _entityManager); - } - - PatientName.Text = Loc.GetString( - "health-analyzer-window-entity-health-text", - ("entityName", entityName) - ); - - Temperature.Text = Loc.GetString("health-analyzer-window-entity-temperature-text", - ("temperature", float.IsNaN(msg.Temperature) ? "N/A" : $"{msg.Temperature - 273f:F1} °C") - ); - - BloodLevel.Text = Loc.GetString("health-analyzer-window-entity-blood-level-text", - ("bloodLevel", float.IsNaN(msg.BloodLevel) ? "N/A" : $"{msg.BloodLevel * 100:F1} %") - ); - - patientDamageAmount.Text = Loc.GetString( - "health-analyzer-window-entity-damage-total-text", - ("amount", damageable.TotalDamage) - ); - - var damageSortedGroups = - damageable.DamagePerGroup.OrderBy(damage => damage.Value) - .ToDictionary(x => x.Key, x => x.Value); - IReadOnlyDictionary damagePerType = damageable.Damage.DamageDict; - - DrawDiagnosticGroups(damageSortedGroups, damagePerType); - - SetHeight = AnalyzerHeight; - SetWidth = AnalyzerWidth; - } - - private void DrawDiagnosticGroups( - Dictionary groups, IReadOnlyDictionary damageDict) - { - HashSet shownTypes = new(); - - // Show the total damage and type breakdown for each damage group. - foreach (var (damageGroupId, damageAmount) in groups.Reverse()) - { - if (damageAmount == 0) - continue; - - var groupTitleText = $"{Loc.GetString( - "health-analyzer-window-damage-group-text", - ("damageGroup", Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId)), - ("amount", damageAmount) - )}"; - - var groupContainer = new BoxContainer + AliveStatusLabel.Text = mobStateComponent?.CurrentState switch { - Margin = new Thickness(0, 0, 0, 15), - Align = BoxContainer.AlignMode.Begin, - Orientation = BoxContainer.LayoutOrientation.Vertical, + Shared.Mobs.MobState.Alive => Loc.GetString("health-analyzer-window-entity-current-alive-status-alive-text"), + Shared.Mobs.MobState.Critical => Loc.GetString("health-analyzer-window-entity-current-alive-status-critical-text"), + Shared.Mobs.MobState.Dead => Loc.GetString("health-analyzer-window-entity-current-alive-status-dead-text"), + _ => Loc.GetString("health-analyzer-window-no-data"), }; - groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId, damageAmount.Int())); + IReadOnlyDictionary damagePerGroup = damageable.DamagePerGroup; + IReadOnlyDictionary damagePerType = damageable.Damage.DamageDict; - GroupsContainer.AddChild(groupContainer); + DamageGroupsContainer.RemoveAllChildren(); - // Show the damage for each type in that group. - var group = _prototypes.Index(damageGroupId); - - foreach (var type in group.DamageTypes) + // Show the total damage and type breakdown for each damage group. + foreach (var (damageGroupId, damageAmount) in damagePerGroup) { - if (damageDict.TryGetValue(type, out var typeAmount) && typeAmount > 0) - { - // If damage types are allowed to belong to more than one damage group, - // they may appear twice here. Mark them as duplicate. - if (shownTypes.Contains(type)) - continue; + var damageGroupTitle = Loc.GetString("health-analyzer-window-damage-group-" + damageGroupId, ("amount", damageAmount)); - shownTypes.Add(type); - - var damageString = Loc.GetString( - "health-analyzer-window-damage-type-text", - ("damageType", Loc.GetString("health-analyzer-window-damage-type-" + type)), - ("amount", typeAmount) - ); - - groupContainer.AddChild(CreateDiagnosticItemLabel(damageString.Insert(0, "- "))); - } + DamageGroupsContainer.AddChild(new GroupDamageCardComponent(damageGroupTitle, damageGroupId, damagePerType)); } } } - - private Texture GetTexture(string texture) - { - var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi"); - var rsiSprite = new SpriteSpecifier.Rsi(rsiPath, texture); - - var rsi = _cache.GetResource(rsiSprite.RsiPath).RSI; - if (!rsi.TryGetState(rsiSprite.RsiState, out var state)) - { - rsiSprite = new SpriteSpecifier.Rsi(rsiPath, "unknown"); - } - - return _spriteSystem.Frame0(rsiSprite); - } - - private static Label CreateDiagnosticItemLabel(string text) - { - return new Label - { - Margin = new Thickness(2, 2), - Text = text, - }; - } - - private BoxContainer CreateDiagnosticGroupTitle(string text, string id, int damageAmount) - { - var rootContainer = new BoxContainer - { - VerticalAlignment = VAlignment.Bottom, - Orientation = BoxContainer.LayoutOrientation.Horizontal - }; - - rootContainer.AddChild(new TextureRect - { - Margin = new Thickness(0, 3), - SetSize = new Vector2(30, 30), - Texture = GetTexture(id.ToLower()) - }); - - rootContainer.AddChild(CreateDiagnosticItemLabel(text)); - - return rootContainer; - } } + // WD end } diff --git a/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleBoundUserInterface.cs b/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleBoundUserInterface.cs new file mode 100644 index 0000000000..012777362b --- /dev/null +++ b/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleBoundUserInterface.cs @@ -0,0 +1,64 @@ +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Content.Shared.White.Medical.BodyScanner; + +namespace Content.Client.White.Medical.BodyScanner +{ + [UsedImplicitly] + public sealed class BodyScannerConsoleBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private BodyScannerConsoleWindow? _window; + + public BodyScannerConsoleBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + _window = new BodyScannerConsoleWindow(); + + _window.OnClose += Close; + _window.OpenCentered(); + + _window.OnScanButtonPressed += () => StartScanning(); + _window.OnPrintButtonPressed += () => StartPrinting(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + switch(state) + { + case BodyScannerConsoleBoundUserInterfaceState msg: + _window?.UpdateUserInterface(msg); + break; + } + } + + public void StartScanning() + { + SendMessage(new BodyScannerStartScanningMessage()); + } + + public void StartPrinting() + { + SendMessage(new BodyScannerStartPrintingMessage()); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (!disposing) + return; + + if (_window != null) + _window.OnClose -= Close; + + _window?.Dispose(); + } + } +} diff --git a/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleWindow.xaml b/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleWindow.xaml new file mode 100644 index 0000000000..da4b96f1cb --- /dev/null +++ b/Content.Client/White/Medical/BodyScanner/BodyScannerConsoleWindow.xaml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +