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.

SpriteSwapVisualElement.cs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.U2D.Animation;
  4. using UnityEngine.UIElements;
  5. namespace UnityEditor.U2D.Animation.SceneOverlays
  6. {
  7. internal class SpriteSwapVisualElement : VisualElement
  8. {
  9. static class Styles
  10. {
  11. public const string selectorList = SpriteSwapOverlay.rootStyle + "__selector-list";
  12. public static string infoLabelHolder = SpriteSwapOverlay.rootStyle + "__info-label-holder";
  13. public static string infoLabelIcon = SpriteSwapOverlay.rootStyle + "__info-label-icon";
  14. public static string infoLabel = SpriteSwapOverlay.rootStyle + "__info-label";
  15. }
  16. VisualElement m_InfoLabelHolder;
  17. Image m_InfoIcon;
  18. Label m_InfoLabel;
  19. ListView m_ListView;
  20. public SpriteSwapVisualElement()
  21. {
  22. AddToClassList(SpriteSwapOverlay.rootStyle);
  23. m_InfoLabelHolder = new VisualElement();
  24. m_InfoLabelHolder.AddToClassList(Styles.infoLabelHolder);
  25. m_InfoIcon = new Image { image = EditorGUIUtility.IconContent("console.infoicon").image };
  26. m_InfoIcon.AddToClassList(Styles.infoLabelIcon);
  27. m_InfoLabel = new Label { text = TextContent.spriteSwapSelectSpriteResolver };
  28. m_InfoLabel.AddToClassList(Styles.infoLabel);
  29. m_InfoLabelHolder.Add(m_InfoIcon);
  30. m_InfoLabelHolder.Add(m_InfoLabel);
  31. Add(m_InfoLabelHolder);
  32. m_ListView = new ListView { virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight };
  33. m_ListView.makeItem += MakeItem;
  34. m_ListView.bindItem += BindItem;
  35. m_ListView.unbindItem += UnbindItem;
  36. m_ListView.selectionChanged += OnSelectionChanged;
  37. m_ListView.AddToClassList(Styles.selectorList);
  38. Add(m_ListView);
  39. Add(new OverlayToolbar());
  40. }
  41. static VisualElement MakeItem() => new SpriteResolverSelector(new CategoryContainer(), new LabelContainer());
  42. void BindItem(VisualElement visualElement, int i)
  43. {
  44. if (m_ListView.itemsSource == null || m_ListView.itemsSource.Count <= i)
  45. return;
  46. var resolverSelector = (SpriteResolverSelector)visualElement;
  47. resolverSelector.SetSpriteResolver((SpriteResolver)m_ListView.itemsSource[i]);
  48. }
  49. void UnbindItem(VisualElement visualElement, int i)
  50. {
  51. if (m_ListView.itemsSource == null || m_ListView.itemsSource.Count <= i)
  52. return;
  53. var resolverSelector = (SpriteResolverSelector)visualElement;
  54. resolverSelector.SetSpriteResolver(null);
  55. }
  56. void OnSelectionChanged(IEnumerable<object> obj)
  57. {
  58. var index = m_ListView.selectedIndex;
  59. if (index == -1)
  60. return;
  61. var selector = (SpriteResolverSelector)m_ListView.GetRootElementForIndex(index);
  62. selector?.Select();
  63. }
  64. public void SetSpriteResolvers(SpriteResolver[] selection)
  65. {
  66. var isListVisible = selection is { Length: > 0 };
  67. m_InfoLabelHolder.style.display = isListVisible ? DisplayStyle.None : DisplayStyle.Flex;
  68. m_ListView.style.display = isListVisible ? DisplayStyle.Flex : DisplayStyle.None;
  69. if (isListVisible)
  70. {
  71. m_ListView.selectedIndex = -1;
  72. m_ListView.itemsSource = selection;
  73. m_ListView.Rebuild();
  74. }
  75. }
  76. public void OnSceneGUI()
  77. {
  78. if (m_ListView?.itemsSource == null)
  79. return;
  80. for (var i = 0; i < m_ListView.itemsSource.Count; i++)
  81. {
  82. var id = m_ListView.viewController.GetIdForIndex(i);
  83. var spriteResolverSelector = (SpriteResolverSelector)m_ListView.GetRootElementForId(id);
  84. spriteResolverSelector?.SceneUpdate();
  85. }
  86. }
  87. public void SetFiltered(bool isFiltered)
  88. {
  89. m_InfoLabel.text = isFiltered ? TextContent.spriteSwapFilteredContent : TextContent.spriteSwapSelectSpriteResolver;
  90. m_InfoIcon.style.display = isFiltered ? DisplayStyle.Flex : DisplayStyle.None;
  91. }
  92. }
  93. }