PinnedElementView.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using UnityEditor.Experimental.GraphView;
  2. using UnityEngine.UIElements;
  3. using UnityEditor;
  4. using UnityEngine;
  5. using System;
  6. namespace GraphProcessor
  7. {
  8. public abstract class PinnedElementView : GraphElement
  9. {
  10. protected PinnedElement pinnedElement;
  11. protected VisualElement root;
  12. protected VisualElement content;
  13. protected VisualElement header;
  14. protected event Action onResized;
  15. VisualElement main;
  16. Label titleLabel;
  17. bool _scrollable;
  18. ScrollView scrollView;
  19. static readonly string pinnedElementStyle = "GraphProcessorStyles/PinnedElementView";
  20. static readonly string pinnedElementTree = "GraphProcessorElements/PinnedElement";
  21. public override string title
  22. {
  23. get { return titleLabel.text; }
  24. set { titleLabel.text = value; }
  25. }
  26. protected bool scrollable
  27. {
  28. get
  29. {
  30. return _scrollable;
  31. }
  32. set
  33. {
  34. if (_scrollable == value)
  35. return;
  36. _scrollable = value;
  37. style.position = Position.Absolute;
  38. if (_scrollable)
  39. {
  40. content.RemoveFromHierarchy();
  41. root.Add(scrollView);
  42. scrollView.Add(content);
  43. AddToClassList("scrollable");
  44. }
  45. else
  46. {
  47. scrollView.RemoveFromHierarchy();
  48. content.RemoveFromHierarchy();
  49. root.Add(content);
  50. RemoveFromClassList("scrollable");
  51. }
  52. }
  53. }
  54. public PinnedElementView()
  55. {
  56. var tpl = Resources.Load<VisualTreeAsset>(pinnedElementTree);
  57. styleSheets.Add(Resources.Load<StyleSheet>(pinnedElementStyle));
  58. main = tpl.CloneTree();
  59. main.AddToClassList("mainContainer");
  60. scrollView = new ScrollView(ScrollViewMode.VerticalAndHorizontal);
  61. root = main.Q("content");
  62. header = main.Q("header");
  63. titleLabel = main.Q<Label>(name: "titleLabel");
  64. content = main.Q<VisualElement>(name: "contentContainer");
  65. hierarchy.Add(main);
  66. capabilities |= Capabilities.Movable | Capabilities.Resizable;
  67. style.overflow = Overflow.Hidden;
  68. ClearClassList();
  69. AddToClassList("pinnedElement");
  70. this.AddManipulator(new Dragger { clampToParentEdges = true });
  71. scrollable = false;
  72. hierarchy.Add(new Resizer(() => onResized?.Invoke()));
  73. RegisterCallback<DragUpdatedEvent>(e =>
  74. {
  75. e.StopPropagation();
  76. });
  77. title = "PinnedElementView";
  78. }
  79. public void InitializeGraphView(PinnedElement pinnedElement, BaseGraphView graphView)
  80. {
  81. this.pinnedElement = pinnedElement;
  82. SetPosition(pinnedElement.position);
  83. onResized += () => {
  84. pinnedElement.position.size = layout.size;
  85. };
  86. RegisterCallback<MouseUpEvent>(e => {
  87. pinnedElement.position.position = layout.position;
  88. });
  89. Initialize(graphView);
  90. }
  91. public void ResetPosition()
  92. {
  93. pinnedElement.position = new Rect(Vector2.zero, PinnedElement.defaultSize);
  94. SetPosition(pinnedElement.position);
  95. }
  96. protected abstract void Initialize(BaseGraphView graphView);
  97. ~PinnedElementView()
  98. {
  99. Destroy();
  100. }
  101. protected virtual void Destroy() {}
  102. }
  103. }