PackageGroup.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine.Experimental.UIElements;
  5. namespace UnityEditor.PackageManager.UI
  6. {
  7. #if !UNITY_2018_3_OR_NEWER
  8. internal class ArrowToggleFactory : UxmlFactory<ArrowToggle>
  9. {
  10. protected override ArrowToggle DoCreate(IUxmlAttributes bag, CreationContext cc)
  11. {
  12. return new ArrowToggle();
  13. }
  14. }
  15. #endif
  16. internal class ArrowToggle : TextElement
  17. {
  18. #if UNITY_2018_3_OR_NEWER
  19. internal new class UxmlFactory : UxmlFactory<ArrowToggle> {}
  20. #endif
  21. public enum Direction
  22. {
  23. Left,
  24. Right,
  25. Up,
  26. Down
  27. }
  28. private bool m_Expanded;
  29. public bool expanded
  30. {
  31. get { return m_Expanded; }
  32. set
  33. {
  34. m_Expanded = value;
  35. if (m_Expanded)
  36. {
  37. SetDirection(Direction.Down);
  38. RemoveFromClassList("collapsed");
  39. AddToClassList("expanded");
  40. }
  41. else
  42. {
  43. SetDirection(Direction.Right);
  44. RemoveFromClassList("expanded");
  45. AddToClassList("collapsed");
  46. }
  47. }
  48. }
  49. public ArrowToggle()
  50. : this(Direction.Right, "arrow")
  51. {
  52. }
  53. public ArrowToggle(Direction direction, string defaultClass)
  54. {
  55. AddToClassList(defaultClass);
  56. SetDirection(direction);
  57. expanded = true;
  58. }
  59. public void Toggle()
  60. {
  61. expanded = !expanded;
  62. }
  63. public void SetDirection(Direction direction)
  64. {
  65. if (direction == Direction.Left)
  66. text = "◄";
  67. else if (direction == Direction.Right)
  68. text = "►";
  69. else if (direction == Direction.Up)
  70. text = "▲";
  71. else if (direction == Direction.Down)
  72. text = "▼";
  73. }
  74. }
  75. #if !UNITY_2018_3_OR_NEWER
  76. internal class PackageGroupFactory : UxmlFactory<PackageGroup>
  77. {
  78. protected override PackageGroup DoCreate(IUxmlAttributes bag, CreationContext cc)
  79. {
  80. return new PackageGroup(bag.GetPropertyString("name"));
  81. }
  82. }
  83. #endif
  84. internal class PackageGroup : VisualElement
  85. {
  86. #if UNITY_2018_3_OR_NEWER
  87. internal new class UxmlFactory : UxmlFactory<PackageGroup> {}
  88. #endif
  89. private const string k_HiddenHeaderClass = "hidden";
  90. public event Action<bool> OnGroupToggle = delegate {};
  91. private readonly VisualElement root;
  92. public IEnumerable<PackageItem> packageItems { get { return List.Children().Cast<PackageItem>(); } }
  93. public bool IsExpanded { get { return HeaderCaret != null && HeaderCaret.expanded; } }
  94. public PackageGroup() : this(string.Empty)
  95. {
  96. }
  97. public PackageGroup(string groupName, bool hidden = false)
  98. {
  99. name = groupName;
  100. root = Resources.GetTemplate("PackageGroup.uxml");
  101. Add(root);
  102. HeaderTitle.text = groupName;
  103. HeaderTitle.ShowTextTooltipOnSizeChange();
  104. if (hidden)
  105. HeaderContainer.AddToClassList(k_HiddenHeaderClass);
  106. HeaderContainer.RegisterCallback<MouseDownEvent>(TogglePackageGroup);
  107. }
  108. private void TogglePackageGroup(MouseDownEvent evt)
  109. {
  110. if (evt.button == 0)
  111. {
  112. SetExpanded(!HeaderCaret.expanded);
  113. if (OnGroupToggle != null)
  114. OnGroupToggle.Invoke(HeaderCaret.expanded);
  115. }
  116. }
  117. public bool Contains(PackageItem item)
  118. {
  119. return List.Contains(item);
  120. }
  121. public void SetExpanded(bool value)
  122. {
  123. if (HeaderCaret == null)
  124. return;
  125. HeaderCaret.expanded = value;
  126. if (value)
  127. {
  128. RemoveFromClassList("collapsed");
  129. AddToClassList("expanded");
  130. }
  131. else
  132. {
  133. RemoveFromClassList("expanded");
  134. AddToClassList("collapsed");
  135. }
  136. }
  137. internal PackageItem AddPackage(Package package)
  138. {
  139. var packageItem = new PackageItem(package) {packageGroup = this};
  140. List.Add(packageItem);
  141. return packageItem;
  142. }
  143. private VisualElement List { get { return root.Q<VisualElement>("groupContainer"); } }
  144. private VisualElement HeaderContainer { get { return root.Q<VisualElement>("headerContainer"); } }
  145. private Label HeaderTitle { get { return root.Q<Label>("headerTitle"); } }
  146. private ArrowToggle HeaderCaret { get { return root.Q<ArrowToggle>("headerCaret"); } }
  147. }
  148. }