Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / ui / grid / UiCell.cs
@小李xl 小李xl on 11 Mar 2024 4 KB 制作图鉴
  1.  
  2. using System;
  3. using System.Collections;
  4. using Godot;
  5.  
  6. /// <summary>
  7. /// 网格组件中单个格子的数据处理类
  8. /// </summary>
  9. /// <typeparam name="TUiCellNode">ui节点类型</typeparam>
  10. /// <typeparam name="T">数据类型</typeparam>
  11. public abstract class UiCell<TUiCellNode, T> : IUiCell, IData<T> where TUiCellNode : IUiCellNode
  12. {
  13. public bool IsDestroyed { get; private set; }
  14. public bool Enable { get; private set; }
  15. public int Index { get; private set; } = -1;
  16. /// <summary>
  17. /// 所在的网格对象
  18. /// </summary>
  19. public UiGrid<TUiCellNode, T> Grid { get; private set; }
  20. /// <summary>
  21. /// 当前cell使用的Ui节点对象
  22. /// </summary>
  23. public TUiCellNode CellNode { get; private set; }
  24. /// <summary>
  25. /// 当前cell分配的数据
  26. /// </summary>
  27. public T Data { get; private set; }
  28.  
  29. private bool _init = false;
  30. //上一次点击的时间
  31. private long _prevClickTime = -1;
  32.  
  33. public IUiGrid GetGrid()
  34. {
  35. return Grid;
  36. }
  37.  
  38. public virtual void OnInit()
  39. {
  40. }
  41.  
  42. /// <summary>
  43. /// 当前cell被分配值时调用
  44. /// </summary>
  45. public virtual void OnSetData(T data)
  46. {
  47. }
  48.  
  49. /// <summary>
  50. /// 当前cell被分配值时调用,该函数为协程函数,当仅在 Grid 中调研 SetDataListCoroutine() 函数时才会被调用
  51. /// </summary>
  52. public virtual IEnumerator OnSetDataCoroutine(T data)
  53. {
  54. yield break;
  55. }
  56.  
  57. public virtual void Process(float delta)
  58. {
  59. }
  60. public virtual void OnClick()
  61. {
  62. }
  63.  
  64. public virtual void OnDoubleClick()
  65. {
  66. }
  67. public virtual void OnEnable()
  68. {
  69. }
  70. public virtual void OnDisable()
  71. {
  72. }
  73.  
  74. public virtual bool CanSelect()
  75. {
  76. return true;
  77. }
  78. public virtual void OnSelect()
  79. {
  80. }
  81. public virtual void OnUnSelect()
  82. {
  83. }
  84. public virtual void OnRefreshIndex()
  85. {
  86. }
  87. public virtual void OnDestroy()
  88. {
  89. }
  90.  
  91. /// <summary>
  92. /// 当 Cell 参与排序时调用, 参数 other 为需要对比的另一个 Cell 对象<br/>
  93. /// 函数返回 -1 表示当前 Cell 在 other 之前<br/>
  94. /// 函数返回 0 表示当前 Cell 和 other 位置相同<br/>
  95. /// 函数返回 1 表示当前 Cell 和 other 之后<br/>
  96. /// </summary>
  97. public virtual int OnSort(UiCell<TUiCellNode, T> other)
  98. {
  99. return 0;
  100. }
  101.  
  102. /// <summary>
  103. /// 初始化数据
  104. /// </summary>
  105. public void Init(UiGrid<TUiCellNode, T> grid, TUiCellNode cellNode, int index)
  106. {
  107. if (_init)
  108. {
  109. return;
  110. }
  111.  
  112. _init = true;
  113. Grid = grid;
  114. CellNode = cellNode;
  115. //绑定点击事件
  116. if (cellNode.GetUiInstance() is BaseButton button)
  117. {
  118. button.Pressed += Click;
  119. }
  120. OnInit();
  121. SetIndex(index);
  122. }
  123. /// <summary>
  124. /// 更新当前 Cell 的值, 该函数由 UiGrid 调用
  125. /// </summary>
  126. public void UpdateData(T data)
  127. {
  128. Data = data;
  129. OnSetData(data);
  130. }
  131.  
  132. /// <summary>
  133. /// 设置当前 Cell 的值, 该函数由 UiGrid 调用,该函数为协程函数
  134. /// </summary>
  135. public void SetData(T data)
  136. {
  137. Data = data;
  138. }
  139.  
  140. /// <summary>
  141. /// 设置当前 Cell 的索引, 该函数由 UiGrid 对象调用
  142. /// </summary>
  143. public void SetIndex(int index)
  144. {
  145. if (Index != index)
  146. {
  147. Index = index;
  148. OnRefreshIndex();
  149. }
  150. }
  151.  
  152. /// <summary>
  153. /// 设置是否启用该 Cell, 该函数由 UiGrid 对象调用
  154. /// </summary>
  155. public void SetEnable(bool value)
  156. {
  157. Enable = value;
  158. if (value)
  159. {
  160. OnEnable();
  161. }
  162. else
  163. {
  164. OnDisable();
  165. }
  166. }
  167.  
  168. /// <summary>
  169. /// 触发点击当前Ui, 如果 Cell 的模板为 BaseButton 类型, 则 UiCell 会自动绑定点击事件
  170. /// </summary>
  171. public void Click()
  172. {
  173. Grid.SelectIndex = Index;
  174. OnClick();
  175.  
  176. //双击判定
  177. if (_prevClickTime >= 0)
  178. {
  179. var now = DateTime.Now.Ticks / 10000;
  180. if (now <= _prevClickTime + 500)
  181. {
  182. OnDoubleClick();
  183. }
  184.  
  185. _prevClickTime = now;
  186. }
  187. else
  188. {
  189. _prevClickTime = DateTime.Now.Ticks / 10000;
  190. }
  191. }
  192. public void Destroy()
  193. {
  194. if (IsDestroyed)
  195. {
  196. return;
  197. }
  198.  
  199. OnDestroy();
  200. CellNode.GetUiInstance().QueueFree();
  201. IsDestroyed = true;
  202. }
  203. }