diff --git a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml index 221baa36bb..dcd6ed91a7 100644 --- a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml +++ b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml @@ -1,6 +1,9 @@  - - + + + + + diff --git a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs index 3f878d1383..b436a9d234 100644 --- a/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs +++ b/Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs @@ -17,6 +17,7 @@ namespace Content.Client.VendingMachines.UI [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public event Action? OnItemSelected; + public event Action? OnSearchChanged; public VendingMachineMenu() { @@ -24,8 +25,14 @@ namespace Content.Client.VendingMachines.UI RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); + SearchBar.OnTextChanged += _ => + { + OnSearchChanged?.Invoke(SearchBar.Text); + }; + VendingContents.OnItemSelected += args => { + SearchBar.Text = string.Empty; OnItemSelected?.Invoke(args); }; } @@ -34,14 +41,14 @@ namespace Content.Client.VendingMachines.UI /// Populates the list of available items on the vending machine interface /// and sets icons based on their prototypes /// - public void Populate(List inventory) + public void Populate(List inventory, string? filter = null) { if (inventory.Count == 0) { VendingContents.Clear(); var outOfStockText = Loc.GetString("vending-machine-component-try-eject-out-of-stock"); VendingContents.AddItem(outOfStockText); - SetSizeAfterUpdate(outOfStockText.Length); + SetSizeAfterUpdate(outOfStockText.Length, VendingContents.Count); return; } @@ -56,10 +63,11 @@ namespace Content.Client.VendingMachines.UI var longestEntry = string.Empty; var spriteSystem = IoCManager.Resolve().GetEntitySystem(); + var filterCount = 0; for (var i = 0; i < inventory.Count; i++) { var entry = inventory[i]; - var vendingItem = VendingContents[i]; + var vendingItem = VendingContents[i - filterCount]; vendingItem.Text = string.Empty; vendingItem.Icon = null; @@ -71,6 +79,15 @@ namespace Content.Client.VendingMachines.UI icon = spriteSystem.GetPrototypeIcon(prototype).Default; } + // search filter + if (!string.IsNullOrEmpty(filter) && + !itemName.ToLowerInvariant().Contains(filter.Trim().ToLowerInvariant())) + { + VendingContents.Remove(vendingItem); + filterCount++; + continue; + } + if (itemName.Length > longestEntry.Length) longestEntry = itemName; @@ -78,13 +95,13 @@ namespace Content.Client.VendingMachines.UI vendingItem.Icon = icon; } - SetSizeAfterUpdate(longestEntry.Length); + SetSizeAfterUpdate(longestEntry.Length, inventory.Count); } - private void SetSizeAfterUpdate(int longestEntryLength) + private void SetSizeAfterUpdate(int longestEntryLength, int contentCount) { SetSize = new Vector2(Math.Clamp((longestEntryLength + 2) * 12, 250, 300), - Math.Clamp(VendingContents.Count * 50, 150, 350)); + Math.Clamp(contentCount * 50, 150, 350)); } } } diff --git a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs index 7a68907871..ab310144d5 100644 --- a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs +++ b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs @@ -30,6 +30,7 @@ namespace Content.Client.VendingMachines _menu.OnClose += Close; _menu.OnItemSelected += OnItemSelected; + _menu.OnSearchChanged += OnSearchChanged; _menu.Populate(_cachedInventory); @@ -74,5 +75,10 @@ namespace Content.Client.VendingMachines _menu.OnClose -= Close; _menu.Dispose(); } + + private void OnSearchChanged(string? filter) + { + _menu?.Populate(_cachedInventory, filter); + } } } diff --git a/Resources/Locale/en-US/vending-machines/vending-machine-component.ftl b/Resources/Locale/en-US/vending-machines/vending-machine-component.ftl index 855becf16f..c00586a920 100644 --- a/Resources/Locale/en-US/vending-machines/vending-machine-component.ftl +++ b/Resources/Locale/en-US/vending-machines/vending-machine-component.ftl @@ -3,3 +3,4 @@ vending-machine-component-try-eject-invalid-item = Invalid item vending-machine-component-try-eject-out-of-stock = Out of stock vending-machine-component-try-eject-access-denied = Access denied +vending-machine-component-search-filter = Search...