using BriarQueen.Data.Identifiers; using BriarQueen.Framework.Coordinators.Events; using BriarQueen.Framework.Events.UI; using BriarQueen.Framework.Managers.Interaction.Data; using BriarQueen.Framework.Managers.Player; using BriarQueen.Framework.Managers.Player.Data; using BriarQueen.Framework.Managers.UI; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UI; using VContainer; namespace BriarQueen.UI.HUD { /// /// UI slot is now an IInteractable so InteractManager (UI raycast path) can drive hover + click. /// No IPointerEnter/Exit, no OnClickEvent subscription. /// public class UIInventorySlot : MonoBehaviour, IInteractable { [SerializeField] private Image _slotBase; [SerializeField] private Image _selectedVisual; [SerializeField] private Image _icon; public ItemDataSo Item; private EventCoordinator _eventCoordinator; private InventoryBar _owner; private PlayerManager _playerManager; // Cursor while hovering inventory slots (tweak if you have a “hand” cursor etc.) public UICursorService.CursorStyle ApplicableCursorStyle => UICursorService.CursorStyle.UseItem; public string InteractableName => Item.ItemName; public UniTask EnterHover() { return UniTask.CompletedTask; } public UniTask ExitHover() { return UniTask.CompletedTask; } public async UniTask OnInteract(ItemDataSo selectedItem = null) { Debug.Log("[UI Inventory Slot] Interacted"); if (Item == null) { _eventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(UIInteractKey.EmptySlot))); return; } // normal click: selection if (selectedItem == null) { _owner?.OnSlotInteracted(this); return; } // use selected item on this item (prefer selected item's logic) if (selectedItem.Interaction != null) { var handled = await selectedItem.Interaction.TryUseWith( selectedItem, Item, _playerManager, _eventCoordinator); if (handled) return; } // fallback: allow target to handle it if (Item.Interaction != null) { var handled = await Item.Interaction.TryUseWith( Item, selectedItem, _playerManager, _eventCoordinator); if (handled) return; } } [Inject] public void Construct(PlayerManager playerManager, EventCoordinator eventCoordinator) { _playerManager = playerManager; _eventCoordinator = eventCoordinator; } public void Initialize(InventoryBar owner, ItemDataSo item) { Debug.Log("Initializing Slot"); _owner = owner; Item = item; if (_icon != null && Item != null) _icon.sprite = Item.Icon; SetSelected(false); Debug.Log($"Set Slot to {Item}"); } public void SetSelected(bool selected) { if (_selectedVisual != null) _selectedVisual.gameObject.SetActive(selected); } } }