protected virtual void InventoryUiDragUtilityOnOnStartDragging(InventoryUIDragLookup dragLookup, InventoryUIItemWrapperBase dragging, PointerEventData eventData)
 {
     if (dragging.item != null)
     {
         if (wrapper != null)
         {
             // Equippable character field
             if (equippableField != null)
             {
                 var equippable = dragging.item as EquippableInventoryItem;
                 if (equippable != null)
                 {
                     if (equippableField.equipTypes.Any(o => o == equippable.equipType))
                     {
                         SetOutlineValues();
                     }
                 }
             }
             else
             {
                 if (wrapper.itemCollection != null)
                 {
                     var canSet = wrapper.itemCollection.filters.IsItemAbidingFilters(dragging.item);
                     if (canSet)
                     {
                         SetOutlineValues();
                     }
                 }
             }
         }
     }
 }
        public override InventoryUIDragLookup OnBeginDrag(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
        {
            currentlyDragging = wrapper;
            dragLookup.Reset();

            dragLookup.startIndex = (int) wrapper.index;
            dragLookup.startItemCollection = wrapper.itemCollection;

            return dragLookup;
        }
        public override bool CanUse(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
        {
            if (Application.isMobilePlatform)
            {
                if (eventData.pointerId != -1 && Input.touchCount > 0)
                {
                    return true; // Mobile drag
                }
            }

            return false;
        }
        public override InventoryUIDragLookup OnEndDrag(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
        {
            if (currentlyDragging == null)
                return dragLookup;

            if (wrapper != null)
            {
                dragLookup.endIndex = (int)wrapper.index;
                dragLookup.endItemCollection = wrapper.itemCollection;
            }

            UnityEngine.Object.Destroy(currentlyDragging.gameObject); // No longer need it, destroy 
            currentlyDragging = null;

            return dragLookup;
        }
        /// <summary>
        /// Creates a draggable object.
        /// </summary>
        /// <param name="from"></param>
        /// <returns></returns>
        public static InventoryUIItemWrapperBase CreateDragObject(InventoryUIItemWrapperBase from)
        {
            var copy = GameObject.Instantiate<InventoryUIItemWrapperBase>(from);
            copy.index = from.index;
            copy.itemCollection = from.itemCollection;
            copy.item = from.item;

            var copyComp = copy.GetComponent<RectTransform>();
            copyComp.SetParent(InventorySettingsManager.instance.guiRoot.transform);
            copyComp.transform.localPosition = new Vector3(copyComp.transform.localPosition.x, copyComp.transform.localPosition.y, 0.0f);
            copyComp.sizeDelta = from.GetComponent<RectTransform>().sizeDelta;

            // Canvas group allows object to ignore raycasts.
            var group = copyComp.gameObject.GetComponent<CanvasGroup>();
            if (group == null)
                group = copyComp.gameObject.AddComponent<CanvasGroup>();

            group.blocksRaycasts = false; // Allows rays to go through so we can hover over the empty slots.
            group.interactable = false;

            return copy;
        }
        public static InventoryUIDragLookup OnBeginDrag(InventoryUIItemWrapperBase originalWrapper, PointerEventData eventData)
        {
            if (draggingItem != null)
            {
                Debug.LogWarning("Item still attached to cursor, can only drag one item at a time", draggingItem.gameObject);
                return null; // Can only drag one item at a time
            }

            currentDragHandler = FindBestDragHandler(originalWrapper, eventData);
            if (currentDragHandler == null)
                return null;

            var toDrag = CreateDragObject(originalWrapper);
            var lookup = currentDragHandler.OnBeginDrag(toDrag, eventData);
            if (OnStartDragging != null)
                OnStartDragging(lookup, toDrag, eventData);

            return lookup;
        }
        /// <summary>
        /// Grab the best suited handler for dragging.
        /// </summary>
        /// <param name="wrapper"></param>
        /// <param name="eventData"></param>
        /// <returns></returns>
        private static InventoryItemWrapperDragHandlerBase FindBestDragHandler(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
        {
            InventoryItemWrapperDragHandlerBase best = null;
            foreach (var handler in dragHandlers)
            {
                if (handler.CanUse(wrapper, eventData) && (best == null || handler.priority > best.priority))
                    best = handler;
            }

            return best;
        }
 public abstract InventoryUIDragLookup OnEndDrag(InventoryUIItemWrapperBase currentlyHoveringWrapper, PointerEventData eventData);
 public abstract InventoryUIDragLookup OnBeginDrag(InventoryUIItemWrapperBase wrapperToDrag, PointerEventData eventData);
 /// <summary>
 /// Can this handler be used to drag an item? Return true if allowed to use, false if not.
 /// </summary>
 public abstract bool CanUse(InventoryUIItemWrapperBase wrapper, PointerEventData eventData);
        public static bool CanReceiveInput(InventoryUIItemWrapperBase wrapper)
        {
            if (wrapper == null)
                return false;

            return CanReceiveInput(wrapper.gameObject);
        }
 public override InventoryUIDragLookup OnEndDrag(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
 {
     return base.OnEndDrag(wrapper, eventData);
 }
 private void OnStartDragging(InventoryUIDragLookup dragLookup, InventoryUIItemWrapperBase dragging, PointerEventData eventData)
 {
     TryShow();
 }
 public override bool CanUse(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
 {
     return eventData.button == PointerEventData.InputButton.Left;
 }
 protected virtual void InventoryUiDragUtilityOnOnEndDragging(InventoryUIDragLookup dragLookup, InventoryUIItemWrapperBase dragging, PointerEventData eventData)
 {
     RemoveOutlineValues();
 }
        private void OnEndDragging(InventoryUIDragLookup dragLookup, InventoryUIItemWrapperBase dragging, PointerEventData eventData)
        {
            Hide();

            if (eventData.hovered.Contains(gameObject))
            {
                if (dragLookup.startItemCollection != collection)
                {
                    // As long as the player didn't directly drop it on a wrapper object, we can auto. equip it to the right slot.
                    bool droppedOnEquipSlot = false;
                    if (triggerWhenDroppedOnWrapper == false)
                    {
                        foreach (var o in eventData.hovered)
                        {
                            var wrapper = o.GetComponent<InventoryUIItemWrapperBase>();
                            if (wrapper != null)
                            {
                                droppedOnEquipSlot = true;
                                break;
                            }
                        }
                    }

                    if (droppedOnEquipSlot == false)
                    {
                        var item = dragLookup.startItemCollection[dragLookup.startIndex].item;
                        iCollection.AcceptDragItem(item);
                       
                        //Debug.Log("Dragged from other collection " + item.name);
                    }
                }
            }
        }
 public override bool CanUse(InventoryUIItemWrapperBase wrapper, PointerEventData eventData)
 {
     return InventorySettingsManager.instance.unstackKeys.AllPressed(eventData, InventoryActionInput.EventType.All);
 }