From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:40:39 +0000 (+0300) Subject: Make vending machine use EntityPrototypeView (#30064) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=588661465a2ede2610bed4dbb440131122e74a6f;p=space-station-14.git Make vending machine use EntityPrototypeView (#30064) * Make vendor machines use EntityPrototypeView * Update * 1 * Kill me * For the love of god!!! --- diff --git a/Content.Client/VendingMachines/UI/VendingMachineItem.xaml b/Content.Client/VendingMachines/UI/VendingMachineItem.xaml new file mode 100644 index 0000000000..a665b72c73 --- /dev/null +++ b/Content.Client/VendingMachines/UI/VendingMachineItem.xaml @@ -0,0 +1,16 @@ + + + diff --git a/Content.Client/VendingMachines/UI/VendingMachineItem.xaml.cs b/Content.Client/VendingMachines/UI/VendingMachineItem.xaml.cs new file mode 100644 index 0000000000..a7212934fd --- /dev/null +++ b/Content.Client/VendingMachines/UI/VendingMachineItem.xaml.cs @@ -0,0 +1,19 @@ +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.Prototypes; + +namespace Content.Client.VendingMachines.UI; + +[GenerateTypedNameReferences] +public sealed partial class VendingMachineItem : BoxContainer +{ + public VendingMachineItem(EntProtoId entProto, string text) + { + RobustXamlLoader.Load(this); + + ItemPrototype.SetPrototype(entProto); + + NameLabel.Text = text; + } +} diff --git a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml index 1fcb1a7898..f43f4bdc36 100644 --- a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml +++ b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml @@ -2,17 +2,10 @@ xmlns="https://spacestation14.io" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" - xmlns:style="clr-namespace:Content.Client.Stylesheets"> - - - - + xmlns:co="clr-namespace:Content.Client.UserInterface.Controls"> + + + diff --git a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs index ac51cdbac5..efe6ef8e9a 100644 --- a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs +++ b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs @@ -1,14 +1,13 @@ using System.Numerics; using Content.Shared.VendingMachines; using Robust.Client.AutoGenerated; -using Robust.Client.GameObjects; -using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; using FancyWindow = Content.Client.UserInterface.Controls.FancyWindow; -using Content.Shared.IdentityManagement; -using Robust.Shared.Timing; +using Robust.Client.UserInterface; +using Content.Client.UserInterface.Controls; +using Robust.Client.Graphics; namespace Content.Client.VendingMachines.UI { @@ -16,12 +15,10 @@ namespace Content.Client.VendingMachines.UI public sealed partial class VendingMachineMenu : FancyWindow { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; - private readonly Dictionary _dummies = []; + public event Action? OnItemSelected; - public event Action? OnItemSelected; - public event Action? OnSearchChanged; + private readonly StyleBoxFlat _styleBox = new() { BackgroundColor = new Color(70, 73, 102) }; public VendingMachineMenu() { @@ -29,106 +26,90 @@ namespace Content.Client.VendingMachines.UI RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - SearchBar.OnTextChanged += _ => - { - OnSearchChanged?.Invoke(SearchBar.Text); - }; - - VendingContents.OnItemSelected += args => - { - OnItemSelected?.Invoke(args); - }; + VendingContents.SearchBar = SearchBar; + VendingContents.DataFilterCondition += DataFilterCondition; + VendingContents.GenerateItem += GenerateButton; + VendingContents.ItemKeyBindDown += (args, data) => OnItemSelected?.Invoke(args, data); } - protected override void Dispose(bool disposing) + private bool DataFilterCondition(string filter, ListData data) { - base.Dispose(disposing); + if (data is not VendorItemsListData { ItemText: var text }) + return false; + + if (string.IsNullOrEmpty(filter)) + return true; + + return text.Contains(filter, StringComparison.CurrentCultureIgnoreCase); + } - // Don't clean up dummies during disposal or we'll just have to spawn them again - if (!disposing) + private void GenerateButton(ListData data, ListContainerButton button) + { + if (data is not VendorItemsListData { ItemProtoID: var protoID, ItemText: var text }) return; - // Delete any dummy items we spawned - foreach (var entity in _dummies.Values) - { - _entityManager.QueueDeleteEntity(entity); - } - _dummies.Clear(); + button.AddChild(new VendingMachineItem(protoID, text)); + + button.ToolTip = text; + button.StyleBoxOverride = _styleBox; } /// /// Populates the list of available items on the vending machine interface /// and sets icons based on their prototypes /// - public void Populate(List inventory, out List filteredInventory, string? filter = null) + public void Populate(List inventory) { - filteredInventory = new(); - - if (inventory.Count == 0) + if (inventory.Count == 0 && VendingContents.Visible) { - VendingContents.Clear(); - var outOfStockText = Loc.GetString("vending-machine-component-try-eject-out-of-stock"); - VendingContents.AddItem(outOfStockText); - SetSizeAfterUpdate(outOfStockText.Length, VendingContents.Count); - return; - } + SearchBar.Visible = false; + VendingContents.Visible = false; - while (inventory.Count != VendingContents.Count) - { - if (inventory.Count > VendingContents.Count) - VendingContents.AddItem(string.Empty); - else - VendingContents.RemoveAt(VendingContents.Count - 1); + var outOfStockLabel = new Label() + { + Text = Loc.GetString("vending-machine-component-try-eject-out-of-stock"), + Margin = new Thickness(4, 4), + HorizontalExpand = true, + VerticalAlignment = VAlignment.Stretch, + HorizontalAlignment = HAlignment.Center + }; + + MainContainer.AddChild(outOfStockLabel); + + SetSizeAfterUpdate(outOfStockLabel.Text.Length, 0); + + return; } var longestEntry = string.Empty; - var spriteSystem = IoCManager.Resolve().GetEntitySystem(); + var listData = new List(); - var filterCount = 0; for (var i = 0; i < inventory.Count; i++) { var entry = inventory[i]; - var vendingItem = VendingContents[i - filterCount]; - vendingItem.Text = string.Empty; - vendingItem.Icon = null; - - if (!_dummies.TryGetValue(entry.ID, out var dummy)) - { - dummy = _entityManager.Spawn(entry.ID); - _dummies.Add(entry.ID, dummy); - } - - var itemName = Identity.Name(dummy, _entityManager); - Texture? icon = null; - if (_prototypeManager.TryIndex(entry.ID, out var prototype)) - { - icon = spriteSystem.GetPrototypeIcon(prototype).Default; - } - // search filter - if (!string.IsNullOrEmpty(filter) && - !itemName.ToLowerInvariant().Contains(filter.Trim().ToLowerInvariant())) - { - VendingContents.Remove(vendingItem); - filterCount++; + if (!_prototypeManager.TryIndex(entry.ID, out var prototype)) continue; - } - if (itemName.Length > longestEntry.Length) - longestEntry = itemName; + var itemText = $"{prototype.Name} [{entry.Amount}]"; - vendingItem.Text = $"{itemName} [{entry.Amount}]"; - vendingItem.Icon = icon; - filteredInventory.Add(i); + if (itemText.Length > longestEntry.Length) + longestEntry = itemText; + + listData.Add(new VendorItemsListData(prototype.ID, itemText, i)); } + VendingContents.PopulateList(listData); + SetSizeAfterUpdate(longestEntry.Length, inventory.Count); } private void SetSizeAfterUpdate(int longestEntryLength, int contentCount) { - SetSize = new Vector2(Math.Clamp((longestEntryLength + 2) * 12, 250, 300), + SetSize = new Vector2(Math.Clamp((longestEntryLength + 2) * 12, 250, 400), Math.Clamp(contentCount * 50, 150, 350)); } } } + +public record VendorItemsListData(EntProtoId ItemProtoID, string ItemText, int ItemIndex) : ListData; diff --git a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs index eafab84ed6..797360d171 100644 --- a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs +++ b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs @@ -1,6 +1,9 @@ +using Content.Client.UserInterface.Controls; using Content.Client.VendingMachines.UI; using Content.Shared.VendingMachines; +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Shared.Input; using System.Linq; using Robust.Client.UserInterface; @@ -14,9 +17,6 @@ namespace Content.Client.VendingMachines [ViewVariables] private List _cachedInventory = new(); - [ViewVariables] - private List _cachedFilteredIndex = new(); - public VendingMachineBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } @@ -34,9 +34,10 @@ namespace Content.Client.VendingMachines _menu.Title = EntMan.GetComponent(Owner).EntityName; _menu.OnItemSelected += OnItemSelected; - _menu.OnSearchChanged += OnSearchChanged; - _menu.Populate(_cachedInventory, out _cachedFilteredIndex); + _menu.Populate(_cachedInventory); + + _menu.OpenCenteredLeft(); } protected override void UpdateState(BoundUserInterfaceState state) @@ -48,15 +49,21 @@ namespace Content.Client.VendingMachines _cachedInventory = newState.Inventory; - _menu?.Populate(_cachedInventory, out _cachedFilteredIndex, _menu.SearchBar.Text); + _menu?.Populate(_cachedInventory); } - private void OnItemSelected(ItemList.ItemListSelectedEventArgs args) + private void OnItemSelected(GUIBoundKeyEventArgs args, ListData data) { + if (args.Function != EngineKeyFunctions.UIClick) + return; + + if (data is not VendorItemsListData { ItemIndex: var itemIndex }) + return; + if (_cachedInventory.Count == 0) return; - var selectedItem = _cachedInventory.ElementAtOrDefault(_cachedFilteredIndex.ElementAtOrDefault(args.ItemIndex)); + var selectedItem = _cachedInventory.ElementAtOrDefault(itemIndex); if (selectedItem == null) return; @@ -77,10 +84,5 @@ namespace Content.Client.VendingMachines _menu.OnClose -= Close; _menu.Dispose(); } - - private void OnSearchChanged(string? filter) - { - _menu?.Populate(_cachedInventory, out _cachedFilteredIndex, filter); - } } }