6
StarHorizon_Public/Content.Client/_NF/Kitchen/UI/AssemblerBoundUserInterface.cs
2026-01-24 12:49:55 +03:00

126 lines
4.7 KiB
C#

using Content.Shared._NF.Kitchen.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Kitchen.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
namespace Content.Client._NF.Kitchen.UI
{
[UsedImplicitly]
public sealed class AssemblerBoundUserInterface : BoundUserInterface
{
[ViewVariables]
private AssemblerMenu? _menu;
[ViewVariables]
private readonly Dictionary<int, EntityUid> _solids = new();
[ViewVariables]
private readonly Dictionary<int, ReagentQuantity> _reagents = new();
private readonly string _menuTitle;
private readonly string _leftFlavorText;
public AssemblerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
if ((MicrowaveUiKey)uiKey == MicrowaveUiKey.MedicalAssemblerKey)
{
_menuTitle = "assembler-menu-medical-title";
_leftFlavorText = "assembler-menu-medical-footer-flavor-left";
}
else
{
_menuTitle = "assembler-menu-title";
_leftFlavorText = "assembler-menu-footer-flavor-left";
}
}
protected override void Open()
{
base.Open();
_menu = this.CreateWindow<AssemblerMenu>();
_menu.StartButton.OnPressed += _ => SendPredictedMessage(new AssemblerStartCookMessage());
_menu.EjectButton.OnPressed += _ => SendPredictedMessage(new MicrowaveEjectMessage());
_menu.IngredientsList.OnItemSelected += args =>
{
SendPredictedMessage(new MicrowaveEjectSolidIndexedMessage(EntMan.GetNetEntity(_solids[args.ItemIndex])));
};
_menu.Title = Loc.GetString(_menuTitle);
_menu.LeftFooter.Text = Loc.GetString(_leftFlavorText);
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not MicrowaveUpdateUserInterfaceState cState || _menu == null)
{
return;
}
_menu.IsBusy = cState.IsMicrowaveBusy;
_menu.CurrentCooktimeEnd = cState.CurrentCookTimeEnd;
_menu.ToggleBusyDisableOverlayPanel(cState.IsMicrowaveBusy || cState.ContainedSolids.Length == 0);
// TODO move this to a component state and ensure the net ids.
RefreshContentsDisplay(EntMan.GetEntityArray(cState.ContainedSolids));
//Set the cook time info label
var cookTime = cState.CurrentCookTime.ToString();
_menu.CookTimeInfoLabel.Text = Loc.GetString("assembler-bound-user-interface-insert-ingredients");
_menu.StartButton.Disabled = cState.IsMicrowaveBusy || cState.ContainedSolids.Length == 0;
_menu.EjectButton.Disabled = cState.IsMicrowaveBusy || cState.ContainedSolids.Length == 0;
//Set the "micowave light" ui color to indicate if the microwave is busy or not
if (cState.IsMicrowaveBusy && cState.ContainedSolids.Length > 0)
{
_menu.IngredientsPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex("#947300") };
}
else
{
_menu.IngredientsPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex("#1B1B1E") };
}
}
private void RefreshContentsDisplay(EntityUid[] containedSolids)
{
_reagents.Clear();
if (_menu == null) return;
_solids.Clear();
_menu.IngredientsList.Clear();
foreach (var entity in containedSolids)
{
if (EntMan.Deleted(entity))
{
return;
}
// TODO just use sprite view
Texture? texture;
if (EntMan.TryGetComponent<IconComponent>(entity, out var iconComponent))
{
texture = EntMan.System<SpriteSystem>().GetIcon(iconComponent);
}
else if (EntMan.TryGetComponent<SpriteComponent>(entity, out var spriteComponent))
{
texture = spriteComponent.Icon?.Default;
}
else
{
continue;
}
var solidItem = _menu.IngredientsList.AddItem(EntMan.GetComponent<MetaDataComponent>(entity).EntityName, texture);
var solidIndex = _menu.IngredientsList.IndexOf(solidItem);
_solids.Add(solidIndex, entity);
}
}
}
}