Adds a search bar to vending machines (#20326)
* Adds a search bar to vending machines * fix indentation * whitespace again --------- Co-authored-by: ike709 <ike709@github.com>
This commit is contained in:
@@ -17,6 +17,7 @@ namespace Content.Client.VendingMachines.UI
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
public event Action<ItemList.ItemListSelectedEventArgs>? OnItemSelected;
|
||||
public event Action<string>? 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
|
||||
/// </summary>
|
||||
public void Populate(List<VendingMachineInventoryEntry> inventory)
|
||||
public void Populate(List<VendingMachineInventoryEntry> 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<IEntitySystemManager>().GetEntitySystem<SpriteSystem>();
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user