Scriptum/Assets/Scripts/REFACTORING/Application/Shared/Manager/UI/Panel/Draggable/DraggablePanelController.cs
2022-11-24 03:03:30 +01:00

99 lines
3.2 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public abstract class DraggablePanelController : PanelController<IndexValuePair<int, EquippableItem>>, DraggablePanelInterface
{
[SerializeField] protected new List<ISlot> ChildBoxList = new List<ISlot>();
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 IndexValuePair<int, EquippableItem>(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);
EquippableItem tmpDraggedItem = draggedSlot.Item == null ? null : new EquippableItem(draggedSlot.Item); // InventoryUIManager.Instance.DraggedSlot.Item; // remember temporary currently dragged item
UiManager.Add(new IndexValuePair<int, EquippableItem>(dropItemSlot.Number, tmpDraggedItem));
Debug.Log(UiManager);
// !!! 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;
}
}