From 588661465a2ede2610bed4dbb440131122e74a6f Mon Sep 17 00:00:00 2001
From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com>
Date: Thu, 22 Aug 2024 17:40:39 +0300
Subject: [PATCH] Make vending machine use EntityPrototypeView (#30064)
* Make vendor machines use EntityPrototypeView
* Update
* 1
* Kill me
* For the love of god!!!
---
.../UI/VendingMachineItem.xaml | 16 +++
.../UI/VendingMachineItem.xaml.cs | 19 +++
.../UI/VendingMachineMenu.xaml | 15 +-
.../UI/VendingMachineMenu.xaml.cs | 129 ++++++++----------
.../VendingMachineBoundUserInterface.cs | 28 ++--
5 files changed, 109 insertions(+), 98 deletions(-)
create mode 100644 Content.Client/VendingMachines/UI/VendingMachineItem.xaml
create mode 100644 Content.Client/VendingMachines/UI/VendingMachineItem.xaml.cs
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);
- }
}
}
--
2.51.2