using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; using YachtDice.Modifiers.Runtime; namespace YachtDice.Inventory { public class InventoryView : MonoBehaviour { [SerializeField] private Transform slotContainer; [SerializeField] private InventorySlotView slotPrefab; [SerializeField] private TMP_Text slotCountText; [SerializeField] private Button closeButton; private readonly List _spawnedSlots = new(); public event Action OnActivateClicked; public event Action OnDeactivateClicked; public event Action OnSellClicked; private void Awake() { if (closeButton != null) closeButton.onClick.AddListener(Hide); } private void OnDestroy() { if (closeButton != null) closeButton.onClick.RemoveListener(Hide); } public void Show() => gameObject.SetActive(true); public void Hide() => gameObject.SetActive(false); public bool IsVisible => gameObject.activeSelf; public void Refresh(IReadOnlyList owned, int maxSlots) { ClearSlots(); var activeCount = 0; foreach (var inst in owned) { if (inst.IsActive) activeCount++; var slot = Instantiate(slotPrefab, slotContainer); slot.Setup(inst, activeCount <= maxSlots); slot.OnActivateClicked += HandleActivate; slot.OnDeactivateClicked += HandleDeactivate; slot.OnSellClicked += HandleSell; _spawnedSlots.Add(slot); } if (slotCountText != null) slotCountText.text = $"{activeCount}/{maxSlots}"; } private void ClearSlots() { foreach (var t in _spawnedSlots) { t.OnActivateClicked -= HandleActivate; t.OnDeactivateClicked -= HandleDeactivate; t.OnSellClicked -= HandleSell; Destroy(t.gameObject); } _spawnedSlots.Clear(); } private void HandleActivate(ModifierInstance inst) => OnActivateClicked?.Invoke(inst); private void HandleDeactivate(ModifierInstance inst) => OnDeactivateClicked?.Invoke(inst); private void HandleSell(ModifierInstance inst) => OnSellClicked?.Invoke(inst); } }