113 lines
4.2 KiB
C#
113 lines
4.2 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.U2D.Animation;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace UnityEditor.U2D.Animation.SceneOverlays
|
|
{
|
|
internal class SpriteSwapVisualElement : VisualElement
|
|
{
|
|
static class Styles
|
|
{
|
|
public const string selectorList = SpriteSwapOverlay.rootStyle + "__selector-list";
|
|
public static string infoLabelHolder = SpriteSwapOverlay.rootStyle + "__info-label-holder";
|
|
public static string infoLabelIcon = SpriteSwapOverlay.rootStyle + "__info-label-icon";
|
|
public static string infoLabel = SpriteSwapOverlay.rootStyle + "__info-label";
|
|
}
|
|
|
|
VisualElement m_InfoLabelHolder;
|
|
Image m_InfoIcon;
|
|
Label m_InfoLabel;
|
|
ListView m_ListView;
|
|
|
|
public SpriteSwapVisualElement()
|
|
{
|
|
AddToClassList(SpriteSwapOverlay.rootStyle);
|
|
|
|
m_InfoLabelHolder = new VisualElement();
|
|
m_InfoLabelHolder.AddToClassList(Styles.infoLabelHolder);
|
|
m_InfoIcon = new Image { image = EditorGUIUtility.IconContent("console.infoicon").image };
|
|
m_InfoIcon.AddToClassList(Styles.infoLabelIcon);
|
|
m_InfoLabel = new Label { text = TextContent.spriteSwapSelectSpriteResolver };
|
|
m_InfoLabel.AddToClassList(Styles.infoLabel);
|
|
m_InfoLabelHolder.Add(m_InfoIcon);
|
|
m_InfoLabelHolder.Add(m_InfoLabel);
|
|
Add(m_InfoLabelHolder);
|
|
|
|
m_ListView = new ListView { virtualizationMethod = CollectionVirtualizationMethod.DynamicHeight };
|
|
m_ListView.makeItem += MakeItem;
|
|
m_ListView.bindItem += BindItem;
|
|
m_ListView.unbindItem += UnbindItem;
|
|
m_ListView.selectionChanged += OnSelectionChanged;
|
|
m_ListView.AddToClassList(Styles.selectorList);
|
|
Add(m_ListView);
|
|
|
|
Add(new OverlayToolbar());
|
|
}
|
|
|
|
static VisualElement MakeItem() => new SpriteResolverSelector(new CategoryContainer(), new LabelContainer());
|
|
|
|
void BindItem(VisualElement visualElement, int i)
|
|
{
|
|
if (m_ListView.itemsSource == null || m_ListView.itemsSource.Count <= i)
|
|
return;
|
|
|
|
var resolverSelector = (SpriteResolverSelector)visualElement;
|
|
resolverSelector.SetSpriteResolver((SpriteResolver)m_ListView.itemsSource[i]);
|
|
}
|
|
|
|
void UnbindItem(VisualElement visualElement, int i)
|
|
{
|
|
if (m_ListView.itemsSource == null || m_ListView.itemsSource.Count <= i)
|
|
return;
|
|
|
|
var resolverSelector = (SpriteResolverSelector)visualElement;
|
|
resolverSelector.SetSpriteResolver(null);
|
|
}
|
|
|
|
void OnSelectionChanged(IEnumerable<object> obj)
|
|
{
|
|
var index = m_ListView.selectedIndex;
|
|
if (index == -1)
|
|
return;
|
|
|
|
var selector = (SpriteResolverSelector)m_ListView.GetRootElementForIndex(index);
|
|
selector?.Select();
|
|
}
|
|
|
|
public void SetSpriteResolvers(SpriteResolver[] selection)
|
|
{
|
|
var isListVisible = selection is { Length: > 0 };
|
|
|
|
m_InfoLabelHolder.style.display = isListVisible ? DisplayStyle.None : DisplayStyle.Flex;
|
|
m_ListView.style.display = isListVisible ? DisplayStyle.Flex : DisplayStyle.None;
|
|
|
|
if (isListVisible)
|
|
{
|
|
m_ListView.selectedIndex = -1;
|
|
m_ListView.itemsSource = selection;
|
|
m_ListView.Rebuild();
|
|
}
|
|
}
|
|
|
|
public void OnSceneGUI()
|
|
{
|
|
if (m_ListView?.itemsSource == null)
|
|
return;
|
|
|
|
for (var i = 0; i < m_ListView.itemsSource.Count; i++)
|
|
{
|
|
var id = m_ListView.viewController.GetIdForIndex(i);
|
|
var spriteResolverSelector = (SpriteResolverSelector)m_ListView.GetRootElementForId(id);
|
|
spriteResolverSelector?.SceneUpdate();
|
|
}
|
|
}
|
|
|
|
public void SetFiltered(bool isFiltered)
|
|
{
|
|
m_InfoLabel.text = isFiltered ? TextContent.spriteSwapFilteredContent : TextContent.spriteSwapSelectSpriteResolver;
|
|
m_InfoIcon.style.display = isFiltered ? DisplayStyle.Flex : DisplayStyle.None;
|
|
}
|
|
}
|
|
}
|