Scriptum/Assets/Scripts/REFACTORING/Application/Shared/Manager/UI/Panel/Draggable/DraggablePanelController.cs
2023-01-03 22:44:24 +01:00

151 lines
4.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public abstract class DraggablePanelController : PanelController<IndexValuePair<int, EquippableItem>>, DraggablePanelInterface
{
protected PanelTypeEnum Type = PanelTypeEnum.None;
public bool AllowToUseItemInPanel = true;
[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;
slot.OnPointerClickEvent += MouseClick;
return slot;
}
#region drag & drop handler
public virtual void BeginDrag(ItemSlot itemSlot)
{
if (itemSlot.Item != null)
{
DraggedSlotController.Instance.CreateDraggedSlot(itemSlot, _panelContent.transform.position);
}
}
public virtual 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
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));
// !!! remember item from dropped position to future operation !!!
if (dropItem)
DraggedSlotController.Instance.UpdateItem(new EquippableItem(dropItem));
else
DraggedSlotController.Instance.UpdateItem(null);
}
}
#endregion
public void MouseClick(ItemSlot itemSlot, PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Right && eventData.clickCount == 1)
{
SingleRightMouseClick(itemSlot);
}
if (eventData.button == PointerEventData.InputButton.Right && eventData.clickCount == 2)
{
DoubleRightMouseClick(itemSlot);
}
if (eventData.button == PointerEventData.InputButton.Left && eventData.clickCount == 1)
{
SingleLeftMouseClick(itemSlot);
}
if (eventData.button == PointerEventData.InputButton.Left && eventData.clickCount == 2)
{
DoubleLeftMouseClick(itemSlot);
}
}
#region mouse handler
public virtual void SingleRightMouseClick(ItemSlot itemSlot)
{
}
public virtual void DoubleRightMouseClick(ItemSlot itemSlot)
{
}
public virtual void SingleLeftMouseClick(ItemSlot itemSlot)
{
}
public virtual void DoubleLeftMouseClick(ItemSlot itemSlot)
{
}
#endregion
public ISlot GetDraggedSlot()
{
return DraggedSlotController.Instance.DraggedSlot;
}
}