using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.UI; public abstract class DraggablePanelController : PanelController>, DraggablePanelInterface { [SerializeField] protected new List ChildBoxList = new List(); protected static UIWarehouseManager _uiManager; protected new UIWarehouseManager UiManager { get { if (_uiManager == null) { return FetchUiManager() as UIWarehouseManager; } return null; } } public ISlot SetupDragAndDropToSlot(ISlot slot) { slot.OnBeginDragEvent += BeginDrag; slot.OnEndDragEvent += EndDrag; slot.OnDragEvent += Drag; slot.OnDropEvent += Drop; return slot; } public void BeginDrag(ItemSlot itemSlot) { if (itemSlot.Item != null) { DraggedSlotController.Instance.CreateDraggedSlot(itemSlot, _panelContent.transform.position); } } public void Drag(ItemSlot itemSlot) { DraggedSlotController.Instance.UpdatePosition(Input.mousePosition); } public virtual void EndDrag(ItemSlot itemSlot) { if (!DraggedSlotController.Instance.IsDragged()) // if there was nothing dragged - ignore event return; DraggedSlotController.Instance.RemoveDraggedSlot(); // Rebuild/apply UiManager content (list of items) base on slots values after its updating for (int i = 0; i < ChildBoxList.Count; i++) { if (ChildBoxList[i].Item != null) { UiManager.Add(new KeyValuePair(i, ChildBoxList[i].Item)); } else { UiManager.RemoveByPosition(i); } } } public virtual void Drop(ItemSlot dropItemSlot) { if (!DraggedSlotController.Instance.IsDragged()) // if there was nothing dragged - ignore event return; var draggedSlot = GetDraggedSlot(); if (dropItemSlot.CanReceiveItem(draggedSlot.Item) && draggedSlot.CanReceiveItem(dropItemSlot.Item)) { EquippableItem dragItem = draggedSlot.Item as EquippableItem; EquippableItem dropItem = dropItemSlot.Item as EquippableItem; // TODO insert child criterials //draggedSlot.Item = (EquippableItem)new Item("test", "test desc", 1, null, null); Item tmpDraggedItem = draggedSlot.Item == null ? null : new EquippableItem(draggedSlot.Item); // InventoryUIManager.Instance.DraggedSlot.Item; // remember temporary currently dragged item UiManager.Add(new KeyValuePair(dropItemSlot.Number, tmpDraggedItem)); // !!! remember item from dropped position to future operation !!! if (dropItem) DraggedSlotController.Instance.UpdateItem(new EquippableItem(dropItem)); else DraggedSlotController.Instance.UpdateItem(null); } } public ISlot GetDraggedSlot() { return DraggedSlotController.Instance.DraggedSlot; } }