UITreeNode.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /****************************************************************************
  2. * 2019.4 GIDEONHE-HOMEPC
  3. ****************************************************************************/
  4. using UniRx;
  5. using UnityEngine;
  6. using UniRx.Triggers;
  7. namespace QFramework.ThermalPower
  8. {
  9. public partial class UITreeNode : UIElement
  10. {
  11. public Color pointEnterColor;
  12. public Color pointExitColor;
  13. protected override void OnBeforeDestroy()
  14. {
  15. }
  16. private TreeNodeItem _treeNodeItemModel;
  17. /// <summary>
  18. /// 初始化方法
  19. /// </summary>
  20. /// <param name="treeNodeItem">节点数据模型</param>
  21. public void Init(TreeNodeItem treeNodeItem)
  22. {
  23. _treeNodeItemModel = treeNodeItem;
  24. string conent = _treeNodeItemModel.Content.Value;
  25. if (conent.Contains("%"))
  26. {
  27. conent = conent.Split('%')[1];
  28. }
  29. else if (conent.Contains("@"))
  30. {
  31. conent = conent.Split('@')[1];
  32. }
  33. //监测(监听)内容数据
  34. _treeNodeItemModel.Content.Subscribe(content => ContentText.text = conent);
  35. //根据数据模型的ShowHidden值监测,确定显示隐藏该Node
  36. _treeNodeItemModel.ShowHidden.Subscribe(value =>
  37. {
  38. if (value)
  39. Show();
  40. else
  41. Hide();
  42. });
  43. //根据数据模型的Layer值检测,改变Node位置
  44. _treeNodeItemModel.Layer.Subscribe(layer =>
  45. {
  46. var indentDistance = 15 * (layer - 1);
  47. Toggle.LocalPosition(indentDistance, 0);
  48. ContentText.LocalPosition(ContentText.GetLocalPosition().x + indentDistance, 0);
  49. //Button.LocalPosition(ContentText.GetLocalPosition().x + indentDistance, 0);
  50. Button.LocalPosition(ContentText.GetLocalPosition());
  51. });
  52. //如果没有子节点,隐藏Toggle
  53. if (treeNodeItem.ChildTreeNodeList.TreeNodeItems.Count == 0)
  54. {
  55. Toggle.Hide();
  56. }
  57. else
  58. {
  59. Toggle.isOn = _treeNodeItemModel.ExPanded.Value;
  60. Toggle.onValueChanged.AddListener(on => _treeNodeItemModel.ExPanded.Value = on);
  61. //监测节点展开状态数据
  62. _treeNodeItemModel.ExPanded.Subscribe(on =>
  63. {
  64. if (on)
  65. {
  66. ChangeChilderNodeItemState(treeNodeItem.ChildTreeNodeList.TreeNodeItems, true);
  67. ExpandImg.Show();
  68. RecoverImg.Hide();
  69. Toggle.targetGraphic = ExpandImg;
  70. }
  71. else
  72. {
  73. ChangeChilderNodeItemState(treeNodeItem.ChildTreeNodeList.TreeNodeItems,false);
  74. ExpandImg.Hide();
  75. RecoverImg.Show();
  76. Toggle.targetGraphic = RecoverImg;
  77. }
  78. });
  79. }
  80. //节点点击事件添加
  81. //以下为示例
  82. Button.GetComponent<ClickButton>().onLeftClick.AddListener(() => NodeButtonLeftClick(treeNodeItem));
  83. Button.GetComponent<ClickButton>().onMiddleClick.AddListener(() => Debug.Log(_treeNodeItemModel.Content.Value + ":中键点击"));
  84. Button.GetComponent<ClickButton>().onRightClick.AddListener(() =>
  85. {
  86. Debug.Log(_treeNodeItemModel.Content.Value + ":右键点击");
  87. });
  88. Button.OnPointerEnterAsObservable().Subscribe(_ =>
  89. {
  90. ContentText.color = pointEnterColor;
  91. });
  92. Button.OnPointerExitAsObservable().Subscribe(_ =>
  93. {
  94. ContentText.color = pointExitColor;
  95. });
  96. }
  97. private void NodeButtonLeftClick(TreeNodeItem treeNodeItem)
  98. {
  99. Debug.Log(_treeNodeItemModel.Content.Value + ":左键点击");
  100. }
  101. /// <summary>
  102. /// 切换节点状态
  103. /// </summary>
  104. /// <param name="nodeList"></param>
  105. /// <param name="hide"></param>
  106. public void ChangeChilderNodeItemState(ReactiveCollection<TreeNodeItem> nodeList, bool hide = false)
  107. {
  108. nodeList.ForEach(item =>
  109. {
  110. item.ShowHidden.Value = hide;
  111. if (hide == true && item.ExPanded.Value == false) return;
  112. if (item.ChildTreeNodeList.TreeNodeItems.Count != 0)
  113. {
  114. ChangeChilderNodeItemState(item.ChildTreeNodeList.TreeNodeItems, hide);
  115. }
  116. });
  117. }
  118. }
  119. }