using Content.Client.VendingMachines.UI; using Content.Shared.VendingMachines; using Robust.Client.UserInterface.Controls; using System.Linq; using Robust.Client.UserInterface; namespace Content.Client.VendingMachines { public sealed class VendingMachineBoundUserInterface : BoundUserInterface { [ViewVariables] private VendingMachineMenu? _menu; [ViewVariables] private List _cachedInventory = new(); [ViewVariables] private List _cachedFilteredIndex = new(); public VendingMachineBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } protected override void Open() { base.Open(); var vendingMachineSys = EntMan.System(); _cachedInventory = vendingMachineSys.GetAllInventory(Owner); _menu = this.CreateWindow(); _menu.OpenCenteredLeft(); _menu.Title = EntMan.GetComponent(Owner).EntityName; _menu.OnItemSelected += OnItemSelected; _menu.OnSearchChanged += OnSearchChanged; _menu.Populate(_cachedInventory, out _cachedFilteredIndex); } protected override void UpdateState(BoundUserInterfaceState state) { base.UpdateState(state); if (state is not VendingMachineInterfaceState newState) return; _cachedInventory = newState.Inventory; _menu?.Populate(_cachedInventory, out _cachedFilteredIndex, _menu.SearchBar.Text); } private void OnItemSelected(ItemList.ItemListSelectedEventArgs args) { if (_cachedInventory.Count == 0) return; var selectedItem = _cachedInventory.ElementAtOrDefault(_cachedFilteredIndex.ElementAtOrDefault(args.ItemIndex)); if (selectedItem == null) return; SendMessage(new VendingMachineEjectMessage(selectedItem.Type, selectedItem.ID)); } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (!disposing) return; if (_menu == null) return; _menu.OnItemSelected -= OnItemSelected; _menu.OnClose -= Close; _menu.Dispose(); } private void OnSearchChanged(string? filter) { _menu?.Populate(_cachedInventory, out _cachedFilteredIndex, filter); } } }