using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TMPro;
///
/// Component which controls how a LogicElement is displayed in the UI;
///
public class LogicElementUI : Dragable
{
#region Inspector Fields
[SerializeField]
[Tooltip("Logic Block this will display")]
protected LogicBlock LogicElement;
#endregion Inspector Fields
#region ReadOnly Variables
///
/// RectTransform of LogicElementUI
///
public RectTransform rectTransform { get { return transform as RectTransform; } }
public LogicBlock logicElement { get { return LogicElement; } }
#endregion ReadOnly Variables
#region Private Variables
//Text Mesh pro to display Name
protected TextMeshProUGUI nameText;
//background image to color;
protected Image background;
protected LogicElementHolder currentHolder;
private List lastHover = new List();
#endregion Private Variables
#region Unity Functions
private void Start()
{
UpdateUI();
}
#endregion Unity Functions
#region Class Implementation
///
/// Updates the UI to match the LogicElemnts name and color
///
public virtual void UpdateUI()
{
//Make sure we have the UI components
if (nameText == null)
nameText = GetComponentInChildren();
if (background == null)
background = GetComponentInChildren();
//Set UI
if (LogicElement != null)
{
//If name null use file name
nameText.text = LogicElement.DisplayName;
background.color = LogicElement.Color;
}
}
public virtual void Initialise(LogicBlock LogicElement, LogicElementHolder Holder)
{
this.LogicElement = LogicElement.Clone();
currentHolder = Holder;
}
#endregion Class Implementation
#region Drag Implementation
public override void OnBeginDrag(PointerEventData eventData)
{
base.OnBeginDrag(eventData);
if (currentHolder != null)
currentHolder.OnRemove(this);
}
public override void OnDrag(PointerEventData data)
{
base.OnDrag(data);
//Get all overlapping holders
List currentHover = LogicElementHolder.OverlappingElements(transform as RectTransform).ToList();
DebugExtensions.DrawRect(rectTransform, Color.blue);
LogicElementHolder.DebugDrawAll(Color.red);
//Call OnHoverStart() for each holder which wasn't in the last update
currentHover.Except(lastHover).ForEach(p => p.OnHoverStart(this));
//Call OnHover() for each overlapping holder
currentHover.ForEach(p => p.OnHover(this));
//Call OnHoverEnd() for each element not overlapping but was last update
lastHover.Except(currentHover).ForEach(p => p.OnHoverEnd(this));
//Save all overlapping elements this update
lastHover = currentHover;
}
public override void OnEndDrag(PointerEventData eventData)
{
base.OnEndDrag(eventData);
//Call OnHoverStop to each element we are hovering over
lastHover.ForEach(p => p.OnHoverEnd(this));
//order the UIHolders by priority and get the first which will accept this
lastHover = lastHover.OrderByDescending(p => p.Priority).ToList();
lastHover.ForEach(p => Debug.Log(p.gameObject.name));
LogicElementHolder holderToAdd = lastHover.FirstOrDefault(p => p.canHold(LogicElement));
//If we are still hovering over anything add this to it
//Else add it back to where it came from
if (holderToAdd != default)
{
holderToAdd.OnAdd(this);
currentHolder = holderToAdd;
}
else
currentHolder.OnAdd(this);
}
protected override void OnDoubleClick()
{
base.OnDoubleClick();
currentHolder.OnDoubleClick(this);
}
#endregion Drag Implementaion
}