using UnityEngine; using UnityEngine.EventSystems; public class InventoryButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { [SerializeField] private GameObject buttonOptions; public int slotIndex; private float pressStartTime; private bool isHolding, isBeingDragged, isOverlapping; private float pressDuration; private InventoryManager inventoryManager; [SerializeField] private float holdThreshold = 0.01f; private Vector3 originalPosition; private InventoryButton overlappingButton; [SerializeField] private InventorySlot data; private void Start() { originalPosition = transform.position; } public void ButtonInit(InventoryManager inventoryManager, int slotIndex, InventorySlot data) { this.slotIndex = slotIndex; this.inventoryManager = inventoryManager; this.data = data; } public void OnPointerDown(PointerEventData eventData) { if (eventData.button == PointerEventData.InputButton.Left) { Debug.Log($"IsEmpty: {data.IsEmpty()}"); if (!data.IsEmpty()) { pressStartTime = Time.time; isHolding = false; isBeingDragged = false; } } } public void OnPointerUp(PointerEventData eventData) { if (eventData.button == PointerEventData.InputButton.Left) { if (isHolding) { OnHoldRelease(); } else { OnSingleClick(); } isHolding = false; isBeingDragged = false; transform.position = originalPosition; // Keep original position } } private void Update() { if (Input.GetMouseButton(0) && !isBeingDragged) { if (!data.IsEmpty()) { pressDuration = Time.time - pressStartTime; if (!isHolding && pressDuration >= holdThreshold) { isHolding = true; OnHoldPress(); } } } } private void OnSingleClick() { if (buttonOptions != null && data != null) { buttonOptions.SetActive(true); buttonOptions.transform.position = transform.position; } } private void OnHoldPress() { isBeingDragged = true; } public void OnDrag(PointerEventData eventData) { if (isBeingDragged) { transform.position = Input.mousePosition; } } private void OnHoldRelease() { if (isOverlapping && overlappingButton != null) { // Swap only the inventorySlot data with the overlapping button //inventoryManager.SwapTransferItem(slotIndex, overlappingButton.slotIndex); inventoryManager.SwapInventorySlot(data, overlappingButton.data); // Optionally, update visual elements if they depend on inventorySlot data UpdateSlotDisplay(); overlappingButton.UpdateSlotDisplay(); isOverlapping = false; overlappingButton = null; } transform.position = originalPosition; // Return to original position visually } private void UpdateSlotDisplay() { // This method updates the UI display for the slot, such as icons or item quantities, // based on the current inventorySlot data. // Example: Update the icon or item quantity shown on the button. } private void OnTriggerEnter2D(Collider2D collision) { if (collision.TryGetComponent(out InventoryButton button) && button != this) { overlappingButton = button; isOverlapping = true; } } private void OnTriggerExit2D(Collider2D collision) { if (collision.TryGetComponent(out InventoryButton button) && button == overlappingButton) { overlappingButton = null; isOverlapping = false; } } }