Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / UI / Inventory / InventoryButton.cs
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;
        }
    }
}