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; public GameObject background; //sprite imager; public GameObject icon; 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(); //Set UI if (LogicElement != null) { //If name null use file name nameText.text = LogicElement.DisplayName; nameText.outlineColor = new Color32(0, 0, 0, 255); nameText.outlineWidth = 0.1f; icon.GetComponent().color = LogicElement.Color; if(logicElement.icon != null) { background.GetComponent().sprite = LogicElement.icon; } else { background.GetComponent().enabled = false; } } } public virtual void Initialise(LogicBlock LogicElement, LogicElementHolder Holder,bool copy) { if (copy) this.LogicElement = LogicElement.Clone(); else this.LogicElement = LogicElement; 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 }