using System.Collections.Generic; using System.Linq; using KitsuneCafe.ItemSystem; using KitsuneCafe.SOAP; using KitsuneCafe.UI.MVVM; using ObservableCollections; using R3; using UnityEngine; using UnityEngine.UIElements; namespace KitsuneCafe.UI { public class InventoryScreen : MonoBehaviour { public const string ItemListIndicatorsName = "item-list-indicator-container"; public const string ItemListName = "item-list"; public const string ItemPreviewName = "item-preview"; public const string ItemDetailsTitleName = "item-details-title-label"; public const string ItemDetailsContentName = "item-details-content-label"; [SerializeField] private UIDocument doc; [SerializeField] private Inventory inventory; [SerializeField] private VisualTreeAsset template; [SerializeField] private int displayCount = 5; [SerializeField] private ItemValue selectedItem; [SerializeField] private FloatEvent inventoryInput; [SerializeField] private Vector2Value itemPreviewDelta; [SerializeField] private FloatValue itemZoom; [SerializeField] private ActionMapValue actionMap; private VisualElement root => doc.rootVisualElement; private List indicators; private RecyclerView itemList; private VisualElement itemPreview; private void OnValidate() { if (doc == null) { doc = GetComponent(); } } private void Reset() { OnValidate(); } private void Start() { root.visible = false; inventoryInput.AsObservable() .Subscribe(_ => { root.visible = !root.visible; actionMap.Value = root.visible ? Input.ActionMap.UI : Input.ActionMap.Player; }); CreateItemList(); var preview = root.Q(); preview.RegisterCallback(evt => { itemPreviewDelta.Value = evt.Delta; }); preview.RegisterCallback(evt => { itemZoom.Value += evt.Amount; }); } private void CreateItemList() { var indicatorContainer = root.Q(ItemListIndicatorsName); indicators = indicatorContainer.Children().ToList(); itemList = root.Q(); itemList.ItemSource = inventory; itemList.RegisterCallback(evt => { if (evt.SelectedItem == null) { selectedItem.Value = null; } else { selectedItem.Value = ((InventoryItem)evt.SelectedItem).Item; } }); inventory.CollectionChanged += RebindItems; } private void RebindItems(in NotifyCollectionChangedEventArgs e) { itemList.Rebind(); } } }