123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEditor.Overlays;
- using UnityEngine;
- using UnityEngine.U2D.Animation;
- using UnityEngine.UIElements;
-
- namespace UnityEditor.U2D.Animation.SceneOverlays
- {
- internal interface INavigableElement
- {
- public event Action<int> onSelectionChange;
-
- int itemCount { get; }
- int selectedIndex { get; }
-
- public void Select(int index);
- void SetItems(IList items);
- object GetItem(int index);
-
- VisualElement visualElement { get; }
- }
-
- internal enum PropertyAnimationState
- {
- NotAnimated,
- Animated,
- Candidate,
- Recording
- }
-
- [Overlay(typeof(SceneView), overlayId, k_DefaultName,
- defaultDisplay = k_DefaultVisibility,
- defaultDockZone = DockZone.RightColumn,
- defaultDockPosition = DockPosition.Bottom,
- defaultLayout = Overlays.Layout.Panel,
- defaultWidth = k_DefaultWidth + k_WidthPadding,
- defaultHeight = k_DefaultHeight + k_HeightPadding)]
- [Icon("Packages/com.unity.2d.animation/Editor/Assets/ComponentIcons/Animation.SpriteResolver.png")]
- internal class SpriteSwapOverlay : Overlay
- {
- public static class Settings
- {
- public const float minThumbnailSize = 20.0f + k_ThumbnailPadding;
- public const float maxThumbnailSize = 110.0f + k_ThumbnailPadding;
- public const float defaultThumbnailSize = 50.0f + k_ThumbnailPadding;
- const float k_ThumbnailPadding = 8.0f;
-
- const string k_FilterKey = UserSettings.kSettingsUniqueKey + "SpriteSwapOverlay.filter";
- const string k_LockKey = UserSettings.kSettingsUniqueKey + "SpriteSwapOverlay.lock";
- const string k_ThumbnailSizeKey = UserSettings.kSettingsUniqueKey + "SpriteSwapOverlay.thumbnailSize";
- const string k_PreferredWidthKey = UserSettings.kSettingsUniqueKey + "SpriteSwapOverlay.preferredWidth";
- const string k_PreferredHeightKey = UserSettings.kSettingsUniqueKey + "SpriteSwapOverlay.preferredHeight";
-
- public static bool filter
- {
- get => EditorPrefs.GetBool(k_FilterKey, false);
- set => EditorPrefs.SetBool(k_FilterKey, value);
- }
-
- public static bool locked
- {
- get => EditorPrefs.GetBool(k_LockKey, false);
- set => EditorPrefs.SetBool(k_LockKey, value);
- }
-
- public static float thumbnailSize
- {
- get => EditorPrefs.GetFloat(k_ThumbnailSizeKey, defaultThumbnailSize);
- set => EditorPrefs.SetFloat(k_ThumbnailSizeKey, Mathf.Clamp(value, minThumbnailSize, maxThumbnailSize));
- }
-
- public static float preferredWidth
- {
- get => EditorPrefs.GetFloat(k_PreferredWidthKey, k_DefaultWidth);
- set => EditorPrefs.SetFloat(k_PreferredWidthKey, value);
- }
-
- public static float preferredHeight
- {
- get => EditorPrefs.GetFloat(k_PreferredHeightKey, k_DefaultHeight);
- set => EditorPrefs.SetFloat(k_PreferredHeightKey, value);
- }
- }
-
- public const string overlayId = "Scene View/Sprite Swap";
- public const string rootStyle = "sprite-swap-overlay";
-
- const float k_DefaultWidth = 230.0f;
- const float k_DefaultHeight = 133.0f;
- const float k_WidthPadding = 6.0f;
- const float k_HeightPadding = 19.0f;
-
- const bool k_DefaultVisibility = false;
-
- const string k_DefaultName = "Sprite Swap";
-
- public SpriteSwapVisualElement mainVisualElement => m_MainVisualElement;
-
- bool isViewInitialized => m_MainVisualElement != null;
-
- GameObject[] m_GameObjectSelection;
- SpriteResolver[] m_Selection;
-
- internal SpriteResolver[] selection => m_Selection;
-
- SpriteSwapVisualElement m_MainVisualElement;
-
- public SpriteSwapOverlay()
- {
- minSize = new Vector2(k_DefaultWidth + k_WidthPadding, k_DefaultHeight + k_HeightPadding);
- maxSize = new Vector2(k_DefaultWidth * 10.0f + k_WidthPadding, k_DefaultHeight * 10.0f + k_HeightPadding);
- }
-
- public override VisualElement CreatePanelContent()
- {
- var overlayElement = new SpriteSwapVisualElement { style = { width = Settings.preferredWidth, height = Settings.preferredHeight } };
- var toolbar = overlayElement.Q<OverlayToolbar>();
- toolbar.onFilterToggled += OnFilterToggled;
- toolbar.onLockToggled += OnLockToggled;
- toolbar.onResetSliderValue += OnResetThumbnailSize;
- toolbar.onSliderValueChanged += OnChangeThumbnailSize;
- overlayElement.RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
- overlayElement.RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
- overlayElement.styleSheets.Add(ResourceLoader.Load<StyleSheet>("SpriteSwap/SpriteSwapOverlay.uss"));
- return overlayElement;
- }
-
- public override void OnCreated()
- {
- base.OnCreated();
- EditorApplication.hierarchyChanged += OnHierarchyChanged;
- EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
- Selection.selectionChanged += OnSelectionChanged;
- SceneView.duringSceneGui += OnSceneGUI;
- }
-
- public override void OnWillBeDestroyed()
- {
- EditorApplication.hierarchyChanged -= OnHierarchyChanged;
- EditorApplication.playModeStateChanged -= OnPlayModeStateChanged;
- Selection.selectionChanged -= OnSelectionChanged;
- SceneView.duringSceneGui -= OnSceneGUI;
- base.OnWillBeDestroyed();
- }
-
- void OnSceneGUI(SceneView sceneView)
- {
- if (containerWindow != sceneView || m_MainVisualElement == null)
- return;
-
- m_MainVisualElement.OnSceneGUI();
- }
-
- internal void OnSelectionChanged()
- {
- if (Settings.locked)
- return;
-
- UpdateSelection();
- }
-
- void OnHierarchyChanged()
- {
- UpdateSelection();
- }
-
- void OnPlayModeStateChanged(PlayModeStateChange newState)
- {
- if (newState is PlayModeStateChange.EnteredEditMode or PlayModeStateChange.EnteredPlayMode)
- UpdateSelection();
- }
-
- void OnAttachToPanel(AttachToPanelEvent evt)
- {
- var element = (SpriteSwapVisualElement)evt.target;
- if (element != null)
- {
- m_MainVisualElement = element;
- m_MainVisualElement.parent.RegisterCallback<GeometryChangedEvent>(OnParentGeometryChanged);
- if (collapsed || isInToolbar)
- {
- m_MainVisualElement.style.width = m_MainVisualElement.style.maxWidth = Settings.preferredWidth;
- m_MainVisualElement.style.height = m_MainVisualElement.style.maxHeight = Settings.preferredHeight;
- }
-
- SetSelection(GetSelectedSpriteResolvers());
- }
- }
-
- void OnDetachFromPanel(DetachFromPanelEvent evt)
- {
- var element = (SpriteSwapVisualElement)evt.currentTarget;
- if (element == m_MainVisualElement)
- m_MainVisualElement = null;
- }
-
- void OnParentGeometryChanged(GeometryChangedEvent evt)
- {
- if (m_MainVisualElement == null)
- return;
-
- if (!isInToolbar && !collapsed)
- {
- Settings.preferredWidth = evt.newRect.width;
- Settings.preferredHeight = evt.newRect.height;
- }
-
- m_MainVisualElement.style.width = evt.newRect.width;
- }
-
- void OnFilterToggled(bool filter)
- {
- if (Settings.filter == filter)
- return;
-
- Settings.filter = filter;
-
- UpdateVisuals();
- }
-
- void OnLockToggled(bool locked)
- {
- if (Settings.locked == locked)
- return;
-
- Settings.locked = locked;
- if (!locked)
- UpdateSelection();
- }
-
- void OnChangeThumbnailSize(float newSize)
- {
- if (Math.Abs(Settings.thumbnailSize - newSize) < 0.01f)
- return;
-
- Settings.thumbnailSize = newSize;
-
- UpdateVisuals();
- }
-
- void OnResetThumbnailSize()
- {
- if (Math.Abs(Settings.thumbnailSize - Settings.defaultThumbnailSize) < 0.01f)
- return;
-
- Settings.thumbnailSize = Settings.defaultThumbnailSize;
-
- UpdateVisuals();
- }
-
- void UpdateSelection()
- {
- m_GameObjectSelection = Selection.gameObjects.Where(go => go.activeInHierarchy).ToArray();
- SetSelection(GetSelectedSpriteResolvers());
- }
-
- void SetSelection(SpriteResolver[] newSelection)
- {
- m_Selection = newSelection;
-
- if (isViewInitialized)
- UpdateVisuals();
- }
-
- void UpdateVisuals()
- {
- var filtered = false;
- var filteredSelection = Settings.filter ? FilterSelection(out filtered) : selection;
- m_MainVisualElement.SetSpriteResolvers(filteredSelection);
- m_MainVisualElement.SetFiltered(filtered);
- }
-
- SpriteResolver[] FilterSelection(out bool filtered)
- {
- filtered = false;
- var filteredSelection = new List<SpriteResolver>();
- if (selection != null)
- {
- for (var i = 0; i < selection.Length; i++)
- {
- var spriteResolver = selection[i];
- var spriteLibrary = spriteResolver.spriteLibrary;
- if (spriteLibrary == null)
- {
- filtered = true;
- continue;
- }
-
- var selectedCategory = spriteResolver.GetCategory();
- if (string.IsNullOrEmpty(selectedCategory))
- {
- filtered = true;
- continue;
- }
-
- var labelNames = spriteLibrary.GetEntryNames(selectedCategory);
- if (labelNames != null && labelNames.Count() > 1)
- filteredSelection.Add(spriteResolver);
- else
- filtered = true;
- }
- }
-
- return filteredSelection.ToArray();
- }
-
- SpriteResolver[] GetSelectedSpriteResolvers()
- {
- var spriteResolvers = new HashSet<SpriteResolver>();
- if (m_GameObjectSelection != null)
- {
- for (var o = 0; o < m_GameObjectSelection.Length; o++)
- {
- var gameObject = m_GameObjectSelection[o];
- if (gameObject == null || !gameObject.activeSelf)
- continue;
-
- var children = gameObject.GetComponentsInChildren<SpriteResolver>();
- for (var c = 0; c < children.Length; c++)
- {
- var spriteResolver = children[c];
- spriteResolvers.Add(spriteResolver);
- }
- }
- }
-
- return spriteResolvers.ToArray();
- }
- }
- }
|