- using System.Reflection;
- using TMPro;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.UI;
- 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;
- [SerializeField] private PlayerInventoryUI playerInventoryUI;
- private void Start()
- {
- originalPosition = transform.position;
- inventoryManager = GameManager.Instance.PlayerController.GetComponentInChildren<InventoryManager>();
- }
- public void OnPointerDown(PointerEventData eventData)
- {
- if (eventData.button == PointerEventData.InputButton.Left)
- {
- if (!data.IsEmpty())
- {
- pressStartTime = Time.time;
- isHolding = false;
- isBeingDragged = false;
- }
- }
- else if (eventData.button == PointerEventData.InputButton.Right)
- {
- if (!data.IsEmpty())
- {
- data.Owner.SplitSlot(data.SlotIndex);
- }
- }
- }
- 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 (data.Item != null)
- {
- //if (playerInventoryUI.currentButtonOptions == null)
- //{
- // playerInventoryUI.currentButtonOptions = Instantiate(buttonOptions, transform);
- // playerInventoryUI.currentButtonOptions.transform.position = transform.position;
- //}
- //else
- //{
- // playerInventoryUI.currentButtonOptions = null;
- // playerInventoryUI.currentButtonOptions = Instantiate(buttonOptions, transform);
- // playerInventoryUI.currentButtonOptions.transform.position = transform.position;
- //}
- }
- }
- private void OnHoldPress()
- {
- isBeingDragged = true;
- }
- public void OnDrag(PointerEventData eventData)
- {
- if (isBeingDragged)
- {
- transform.position = Input.mousePosition;
- }
- }
- public void ChangeData(InventorySlot d)
- {
- data = d;
- Image[] images = gameObject.GetComponentsInChildren<Image>();
- TextMeshProUGUI tmp = gameObject.GetComponentInChildren<TextMeshProUGUI>();
- foreach (Image image in images)
- {
- if (image.gameObject.transform.childCount == 0)
- {
- if (data.Item != null)
- {
- image.color = Color.white;
- image.sprite = data.Item.ItemImage;
- tmp.text = data.Amount > 1 ? d.Amount.ToString() : string.Empty;
- }
- else
- {
- image.color = Color.clear; // Reset to transparent
- image.sprite = null;
- tmp.text = string.Empty; // Clear text
- }
- }
- }
- }
- private void OnHoldRelease()
- {
- if (isOverlapping && overlappingButton != null)
- {
- if (!data.Owner.TryMergeSlots(data, overlappingButton.data))
- {
- // Perform the swap in the inventory data
- inventoryManager.SwapInventorySlot(data, overlappingButton.data);
- }
- isOverlapping = false;
- overlappingButton = null;
- }
- transform.position = originalPosition; // Return to original position visually
- }
- private void OnTriggerEnter2D(Collider2D collision)
- {
- // Check if the current button is being dragged and the collision is with another button
- if (isBeingDragged && collision.TryGetComponent(out InventoryButton button) && button != this)
- {
- overlappingButton = button;
- isOverlapping = true;
- Debug.Log($"Started overlapping with button at index {button.slotIndex}");
- }
- }
- private void OnTriggerExit2D(Collider2D collision)
- {
- if (collision.TryGetComponent(out InventoryButton button) && button == overlappingButton)
- {
- overlappingButton = null;
- isOverlapping = false;
- }
- }
- }