No Description
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.

InfluenceWindow.cs 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.UIElements;
  4. namespace UnityEditor.U2D.Animation
  5. {
  6. internal interface IInfluenceWindow
  7. {
  8. void UpdateList(List<TransformCache> transformsList);
  9. void UpdateSelection(IEnumerable<TransformCache> newSelection);
  10. void ToggleAddButton(bool enabled);
  11. void ToggleRemoveButton(bool enabled);
  12. string headerText { get; set; }
  13. string listLabelText { set; }
  14. void SetHiddenFromLayout(bool hide);
  15. void SetTooltips(string addButtonTooltip, string removeButtonTooltip);
  16. bool visible { get; }
  17. event Action onAddElement;
  18. event Action onRemoveElement;
  19. event Action<IEnumerable<TransformCache>> onReordered;
  20. event Action<IEnumerable<object>> onSelectionChanged;
  21. }
  22. internal class InfluenceWindow : VisualElement, IInfluenceWindow
  23. {
  24. public class CustomUxmlFactory : UxmlFactory<InfluenceWindow, UxmlTraits> { }
  25. public event Action onAddElement = () => {};
  26. public event Action onRemoveElement = () => {};
  27. public event Action<IEnumerable<TransformCache>> onReordered = _ => {};
  28. public event Action<IEnumerable<object>> onSelectionChanged = _ => {};
  29. UnityEngine.UIElements.PopupWindow m_HeaderLabel;
  30. Label m_ListLabel;
  31. IEnumerable<TransformCache> m_Selection;
  32. ListView m_ListView;
  33. List<TransformCache> m_Influences = new List<TransformCache>();
  34. Button m_AddButton;
  35. Button m_RemoveButton;
  36. bool m_IgnoreSelectionChange = false;
  37. public string headerText
  38. {
  39. get => m_HeaderLabel.text;
  40. set => m_HeaderLabel.text = value;
  41. }
  42. public string listLabelText
  43. {
  44. get => m_ListLabel.text;
  45. set => m_ListLabel.text = value;
  46. }
  47. public void SetTooltips(string addButtonTooltip, string removeButtonTooltip)
  48. {
  49. m_AddButton.tooltip = addButtonTooltip;
  50. m_RemoveButton.tooltip = removeButtonTooltip;
  51. }
  52. internal static InfluenceWindow CreateFromUxml()
  53. {
  54. var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/InfluenceWindow.uxml");
  55. var ve = (InfluenceWindow)visualTree.CloneTree().Q("InfluenceWindow");
  56. ve.styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/InfluenceWindowStyle.uss"));
  57. if (EditorGUIUtility.isProSkin)
  58. ve.AddToClassList("Dark");
  59. ve.LocalizeTextInChildren();
  60. ve.BindElements();
  61. return ve;
  62. }
  63. public void SetListReorderable(bool reorderable)
  64. {
  65. m_ListView.reorderable = reorderable;
  66. }
  67. public void SetAllowMultiselect(bool allowMultiselect)
  68. {
  69. m_ListView.selectionType = allowMultiselect ? SelectionType.Multiple : SelectionType.Single;
  70. }
  71. private void BindElements()
  72. {
  73. m_HeaderLabel = this.Q<UnityEngine.UIElements.PopupWindow>();
  74. m_ListLabel = this.Q<Label>();
  75. m_ListView = this.Q<ListView>();
  76. m_ListView.selectionType = SelectionType.Multiple;
  77. m_ListView.itemsSource = m_Influences;
  78. m_ListView.makeItem = () =>
  79. {
  80. var label = new Label()
  81. {
  82. name = "ListRow"
  83. };
  84. return label;
  85. };
  86. m_ListView.bindItem = (e, index) =>
  87. {
  88. if (m_Influences[index] == null)
  89. return;
  90. ((Label)e).text = m_Influences[index].name;
  91. if (index % 2 == 0)
  92. {
  93. e.RemoveFromClassList("ListRowOddColor");
  94. e.AddToClassList("ListRowEvenColor");
  95. }
  96. else
  97. {
  98. e.RemoveFromClassList("ListRowEvenColor");
  99. e.AddToClassList("ListRowOddColor");
  100. }
  101. };
  102. m_ListView.onSelectionChange += OnListViewSelectionChanged;
  103. m_AddButton = this.Q<Button>("AddButton");
  104. m_AddButton.clickable.clicked += () =>
  105. {
  106. onAddElement.Invoke();
  107. };
  108. m_RemoveButton = this.Q<Button>("RemoveButton");
  109. m_RemoveButton.clickable.clicked += () =>
  110. {
  111. onRemoveElement.Invoke();
  112. };
  113. RegisterCallback<DragPerformEvent>(x => onReordered(m_Influences) );
  114. }
  115. public void UpdateList(List<TransformCache> transformsList)
  116. {
  117. m_Influences = transformsList;
  118. m_ListView.itemsSource = m_Influences;
  119. m_ListView.Rebuild();
  120. }
  121. public void UpdateSelection(IEnumerable<TransformCache> newSelection)
  122. {
  123. m_Selection = newSelection;
  124. m_IgnoreSelectionChange = true;
  125. m_ListView.ClearSelection();
  126. foreach (var selection in newSelection)
  127. {
  128. var index = m_Influences.IndexOf(selection);
  129. if(index >= 0)
  130. m_ListView.AddToSelection(index);
  131. }
  132. m_IgnoreSelectionChange = false;
  133. }
  134. private void OnListViewSelectionChanged(IEnumerable<object> newSelection)
  135. {
  136. if (m_IgnoreSelectionChange)
  137. return;
  138. onSelectionChanged(newSelection);
  139. }
  140. public void ToggleAddButton(bool enabled)
  141. {
  142. m_AddButton.SetEnabled(enabled);
  143. }
  144. public void ToggleRemoveButton(bool enabled)
  145. {
  146. m_RemoveButton.SetEnabled(enabled && m_ListView.selectedIndex >= 0);
  147. }
  148. void IInfluenceWindow.SetHiddenFromLayout(bool hide)
  149. {
  150. this.SetHiddenFromLayout(hide);
  151. }
  152. }
  153. }