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...