using Content.Shared.Chemistry.Components; using Robust.Client.AutoGenerated; using Robust.Client.Console; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using System; using System.Collections.Generic; namespace Content.Client.Administration.UI.ManageSolutions { /// /// A simple window that displays solutions and their contained reagents. Allows you to edit the reagent quantities and add new reagents. /// [GenerateTypedNameReferences] public sealed partial class EditSolutionsWindow : SS14Window { [Dependency] private readonly IClientConsoleHost _consoleHost = default!; [Dependency] private readonly IEntityManager _entityManager = default!; private EntityUid _target = EntityUid.Invalid; private string? _selectedSolution; private AddReagentWindow? _addReagentWindow; private Dictionary? _solutions; public EditSolutionsWindow() { IoCManager.InjectDependencies(this); RobustXamlLoader.Load(this); SolutionOption.OnItemSelected += SolutionSelected; AddButton.OnPressed += OpenAddReagentWindow; } public override void Close() { base.Close(); _addReagentWindow?.Close(); _addReagentWindow?.Dispose(); } public void SetTargetEntity(EntityUid target) { _target = target; var targetName = _entityManager.TryGetEntity(target, out var entity) ? IoCManager.Resolve().GetComponent(entity).EntityName : string.Empty; Title = Loc.GetString("admin-solutions-window-title", ("targetName", targetName)); } /// /// Update the capacity label and re-create the reagent list /// public void UpdateReagents() { ReagentList.DisposeAllChildren(); if (_selectedSolution == null || _solutions == null) return; if (!_solutions.TryGetValue(_selectedSolution, out var solution)) return; TotalLabel.Text = Loc.GetString("admin-solutions-window-capacity-label", ("currentVolume", solution.TotalVolume), ("maxVolume",solution.MaxVolume)); foreach (var reagent in solution) { AddReagentEntry(reagent); } } /// /// Add a single reagent entry to the list /// private void AddReagentEntry(Solution.ReagentQuantity reagent) { var box = new BoxContainer(); var spin = new FloatSpinBox(1, 2); spin.Value = reagent.Quantity.Float(); spin.OnValueChanged += (args) => SetReagent(args, reagent.ReagentId); spin.HorizontalExpand = true; box.AddChild(new Label() { Text = reagent.ReagentId , HorizontalExpand = true}); box.AddChild(spin); ReagentList.AddChild(box); } /// /// Execute a command to modify the reagents in the solution. /// private void SetReagent(FloatSpinBox.FloatSpinBoxEventArgs args, string reagentId) { if (_solutions == null || _selectedSolution == null) return; var current = _solutions[_selectedSolution].GetReagentQuantity(reagentId); var delta = args.Value - current.Float(); if (MathF.Abs(delta) < 0.01) return; var command = $"addreagent {_target} {_selectedSolution} {reagentId} {delta}"; _consoleHost.ExecuteCommand(command); } /// /// Open a new window that has options to add new reagents to the solution. /// private void OpenAddReagentWindow(BaseButton.ButtonEventArgs obj) { if (string.IsNullOrEmpty(_selectedSolution)) return; _addReagentWindow?.Close(); _addReagentWindow?.Dispose(); _addReagentWindow = new AddReagentWindow(_target, _selectedSolution); _addReagentWindow.OpenCentered(); } /// /// When a new solution is selected, set _selectedSolution and update the reagent list. /// private void SolutionSelected(OptionButton.ItemSelectedEventArgs args) { SolutionOption.SelectId(args.Id); _selectedSolution = (string?) SolutionOption.SelectedMetadata; _addReagentWindow?.UpdateSolution(_selectedSolution); UpdateReagents(); } /// /// Update the solution options. /// public void UpdateSolutions(Dictionary? solutions) { SolutionOption.Clear(); _solutions = solutions; if (_solutions == null) return; int i = 0; foreach (var solution in _solutions.Keys) { SolutionOption.AddItem(solution, i); SolutionOption.SetItemMetadata(i, solution); if (solution == _selectedSolution) SolutionOption.Select(i); i++; } if (SolutionOption.ItemCount == 0) { // No applicable solutions Close(); Dispose(); } if (_selectedSolution == null || !_solutions.ContainsKey(_selectedSolution)) { // the previously selected solution is no longer valid. SolutionOption.Select(0); _selectedSolution = (string?) SolutionOption.SelectedMetadata; } } } }