You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.4 KiB

5 years ago
5 years ago
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using TMPro;
  5. using UnityEngine.UI;
  6. public class LogicTrayUI : LogicElementHolder
  7. {
  8. //[SerializeField]
  9. //protected List<LogicBlock> list;
  10. [SerializeField]
  11. protected LogicElementUI Prefab;
  12. [SerializeField]
  13. protected int insertIndex = -1;
  14. [SerializeField]
  15. private Transform content;
  16. [SerializeField]
  17. protected BlockReader reader;
  18. #region Unity Functions
  19. public void Start()
  20. {
  21. UpdateDisplay();
  22. }
  23. protected override void OnEnable()
  24. {
  25. base.OnEnable();
  26. if (reader != null)
  27. reader.OnUpdate += UpdateDisplay;
  28. }
  29. protected override void OnDisable()
  30. {
  31. base.OnDisable();
  32. if (reader != null)
  33. reader.OnUpdate -= UpdateDisplay;
  34. }
  35. #endregion Unity Functions
  36. public void SetBlockReader(BlockReader newBlockReader)
  37. {
  38. if (reader != null)
  39. reader.OnUpdate -= UpdateDisplay;
  40. reader = newBlockReader;
  41. reader.OnUpdate += UpdateDisplay;
  42. UpdateDisplay();
  43. }
  44. [ContextMenu("Update Display")]
  45. public void UpdateDisplay()
  46. {
  47. //Destroy all children
  48. int destroyedCount = content.childCount; //we need to know how many were destroyed since unity doesn't actually destroy anything until the end of the frame
  49. foreach (Transform child in content)
  50. Destroy(child.gameObject);
  51. //Instatiate logicElement prefab
  52. foreach (LogicBlock element in reader.LogicChain)
  53. {
  54. LogicElementUI elementUI = Instantiate(Prefab.gameObject, content).GetComponent<LogicElementUI>();
  55. elementUI.Initialise(element, this);
  56. }
  57. //Add insertIndex object if needed
  58. if (insertIndex != -1)
  59. {
  60. GameObject elementObject = Instantiate(Prefab.gameObject, content);
  61. elementObject.GetComponentInChildren<TextMeshProUGUI>().text = "insert";
  62. elementObject.GetComponentInChildren<Image>().color = new Color(0.5f, 0.5f, 0.5f, 0.25f);
  63. //Set sibling index to where we want it in list + add destroyedCount since technically they are still here
  64. elementObject.transform.SetSiblingIndex(destroyedCount + insertIndex);
  65. }
  66. }
  67. #region LogicElementHolder Implementation
  68. /// <summary>
  69. /// When a LogicElement has started being dragged from this Tray
  70. /// </summary>
  71. /// <param name="element">Element which is being dragged</param>
  72. public override void OnRemove(LogicElementUI element)
  73. {
  74. reader.Remove(element.logicElement);
  75. }
  76. /// <summary>
  77. /// When a logicElement needs to be added back to this Tray
  78. /// </summary>
  79. /// <param name="element">Element to add</param>
  80. public override void OnAdd(LogicElementUI element)
  81. {
  82. int index = GetInsertIndex(element.rectTransform);
  83. reader.Insert(index, element.logicElement);
  84. Destroy(element.gameObject);
  85. }
  86. /// <summary>
  87. /// When a logic Element is hovering over this holder
  88. /// </summary>
  89. /// <param name="element">Element which is hovering</param>
  90. public override void OnHover(LogicElementUI element)
  91. {
  92. insertIndex = GetInsertIndex(element.rectTransform);
  93. UpdateDisplay();
  94. }
  95. /// <summary>
  96. /// First frame a logic Element is hovering over this holder
  97. /// </summary>
  98. /// <param name="element">Element which is hovering</param>
  99. public override void OnHoverStart(LogicElementUI element)
  100. {
  101. Debug.Log("OnHoverStart");
  102. //Create insert prefab at End
  103. insertIndex = content.childCount;
  104. UpdateDisplay();
  105. }
  106. /// <summary>
  107. /// first frame a logic Element is no longer hovering over this holder
  108. /// </summary>
  109. /// <param name="element">Element which is hovering</param>
  110. public override void OnHoverEnd(LogicElementUI element)
  111. {
  112. //Remove insert prefab
  113. insertIndex = -1;
  114. UpdateDisplay();
  115. }
  116. #endregion LogicElementHolder Implementation
  117. #region Helper Functions
  118. public int GetInsertIndex(RectTransform rt)
  119. {
  120. Rect rect = rt.GlobalRect();
  121. foreach (Transform child in content)
  122. {
  123. RectTransform childRect = child as RectTransform;
  124. if (rect.Overlaps(childRect.GlobalRect()))
  125. return child.GetSiblingIndex();
  126. }
  127. return reader.LogicChain.Count;
  128. }
  129. #endregion Helper Functions
  130. }