123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345 |
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEditor.IMGUI.Controls;
- using System;
- using System.Linq;
- using UnityEngine.UIElements;
- namespace UnityEditor.U2D.Animation
- {
- internal class MeshVisibilityTool : IVisibilityTool
- {
- private MeshVisibilityToolView m_View;
- private MeshVisibilityToolModel m_Model;
- private SkinningCache m_SkinningCache;
- public SkinningCache skinningCache { get { return m_SkinningCache; } }
- public MeshVisibilityTool(SkinningCache s)
- {
- m_SkinningCache = s;
- }
- public void Setup()
- {
- m_Model = skinningCache.CreateCache<MeshVisibilityToolModel>();
- m_View = new MeshVisibilityToolView(skinningCache)
- {
- GetModel = () => m_Model,
- SetAllVisibility = SetAllVisibility,
- GetAllVisibility = GetAllVisibility
- };
- }
- public void Dispose()
- {
- }
- public VisualElement view { get { return m_View; } }
- public string name { get { return "Mesh"; } }
- public void Activate()
- {
- skinningCache.events.selectedSpriteChanged.AddListener(OnSelectionChange);
- skinningCache.events.skinningModeChanged.AddListener(OnViewModeChanged);
- OnViewModeChanged(skinningCache.mode);
- if (m_Model.previousVisiblity != m_Model.allVisibility)
- {
- SetAllMeshVisibility();
- m_Model.previousVisiblity = m_Model.allVisibility;
- }
- }
- public void Deactivate()
- {
- skinningCache.events.selectedSpriteChanged.RemoveListener(OnSelectionChange);
- skinningCache.events.skinningModeChanged.RemoveListener(OnViewModeChanged);
- }
- public bool isAvailable
- {
- get { return false; }
- }
- public void SetAvailabilityChangeCallback(Action callback)
- {}
- private void OnViewModeChanged(SkinningMode characterMode)
- {
- if (characterMode == SkinningMode.Character)
- {
- m_View.Setup(skinningCache.GetSprites());
- }
- else
- {
- m_View.Setup(new[] { skinningCache.selectedSprite });
- }
- }
- private void OnSelectionChange(SpriteCache sprite)
- {
- OnViewModeChanged(skinningCache.mode);
- SetAllMeshVisibility();
- }
- void SetAllVisibility(bool visibility)
- {
- using (skinningCache.UndoScope(TextContent.meshVisibility))
- {
- m_Model.allVisibility = visibility;
- SetAllMeshVisibility();
- }
- }
- void SetAllMeshVisibility()
- {
- SpriteCache[] sprites;
- if (skinningCache.mode == SkinningMode.Character)
- sprites = skinningCache.GetSprites();
- else
- sprites = new[] { skinningCache.selectedSprite };
- foreach (var spr in sprites)
- {
- if (spr != null)
- m_Model.SetMeshVisibility(spr, m_Model.allVisibility);
- }
- }
- bool GetAllVisibility()
- {
- return m_Model.allVisibility;
- }
- }
- internal class MeshVisibilityToolModel : SkinningObject
- {
- [SerializeField]
- bool m_AllVisibility = true;
- bool m_PreviousVisibility = true;
- public bool allVisibility
- {
- get {return m_AllVisibility; }
- set { m_AllVisibility = value; }
- }
- public void SetMeshVisibility(SpriteCache sprite, bool visibility)
- {
- }
- public bool GetMeshVisibility(SpriteCache sprite)
- {
- return false;
- }
- public bool ShouldDisable(SpriteCache sprite)
- {
- var mesh = sprite.GetMesh();
- return mesh == null || mesh.vertices.Count == 0;
- }
- public bool previousVisiblity
- {
- get { return m_PreviousVisibility; }
- set { m_PreviousVisibility = value; }
- }
- }
- internal class MeshVisibilityToolView : VisibilityToolViewBase
- {
- public Func<MeshVisibilityToolModel> GetModel = () => null;
- public Action<bool> SetAllVisibility = (b) => {};
- public Func<bool> GetAllVisibility = () => true;
- public SkinningCache skinningCache { get; set; }
- public MeshVisibilityToolView(SkinningCache s)
- {
- skinningCache = s;
- var columns = new MultiColumnHeaderState.Column[2];
- columns[0] = new MultiColumnHeaderState.Column
- {
- headerContent = EditorGUIUtility.TrTextContent(TextContent.name),
- headerTextAlignment = TextAlignment.Center,
- width = 200,
- minWidth = 130,
- autoResize = true,
- allowToggleVisibility = false
- };
- columns[1] = new MultiColumnHeaderState.Column
- {
- headerContent = new GUIContent(EditorGUIUtility.FindTexture("visibilityOn")),
- headerTextAlignment = TextAlignment.Center,
- width = 32,
- minWidth = 32,
- maxWidth = 32,
- autoResize = false,
- allowToggleVisibility = true
- };
- var multiColumnHeaderState = new MultiColumnHeaderState(columns);
- var multiColumnHeader = new VisibilityToolColumnHeader(multiColumnHeaderState)
- {
- GetAllVisibility = InternalGetAllVisibility,
- SetAllVisibility = InternalSetAllVisibility,
- canSort = false,
- height = 20,
- visibilityColumn = 1
- };
- m_TreeView = new MeshTreeView(m_TreeViewState, multiColumnHeader)
- {
- GetModel = InternalGetModel
- };
- SetupSearchField();
- }
- MeshVisibilityToolModel InternalGetModel()
- {
- return GetModel();
- }
- public void Setup(SpriteCache[] sprites)
- {
- ((MeshTreeView)m_TreeView).Setup(sprites);
- ((MeshTreeView)m_TreeView).SetSelection(skinningCache.selectedSprite);
- }
- bool InternalGetAllVisibility()
- {
- return GetAllVisibility();
- }
- void InternalSetAllVisibility(bool visibility)
- {
- SetAllVisibility(visibility);
- }
- }
- class MeshTreeView : VisibilityTreeViewBase
- {
- private List<SpriteCache> m_Sprites = new List<SpriteCache>();
- public MeshTreeView(TreeViewState treeViewState, MultiColumnHeader header)
- : base(treeViewState, header)
- {
- this.showAlternatingRowBackgrounds = true;
- this.useScrollView = true;
- Reload();
- }
- public Func<MeshVisibilityToolModel> GetModel = () => null;
- public void Setup(SpriteCache[] sprites)
- {
- m_Sprites.Clear();
- m_Sprites.AddRange(sprites);
- Reload();
- }
- private static TreeViewItem CreateTreeViewItem(SpriteCache part)
- {
- return new TreeViewItemBase<SpriteCache>(part.GetInstanceID(), -1, part.name, part);
- }
- private void AddTreeViewItem(IList<TreeViewItem> rows, SpriteCache part)
- {
- if (string.IsNullOrEmpty(searchString) || part.name.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0)
- {
- var item = CreateTreeViewItem(part);
- rows.Add(item);
- rootItem.AddChild(item);
- }
- }
- private void CellGUI(Rect cellRect, TreeViewItem item, int column, ref RowGUIArgs args)
- {
- CenterRectUsingSingleLineHeight(ref cellRect);
- switch (column)
- {
- case 0:
- DrawNameCell(cellRect, item, ref args);
- break;
- case 1:
- DrawVisibilityCell(cellRect, item);
- break;
- }
- }
- private void DrawVisibilityCell(Rect cellRect, TreeViewItem item)
- {
- GUIStyle style = MultiColumnHeader.DefaultStyles.columnHeaderCenterAligned;
- var itemView = item as TreeViewItemBase<SpriteCache>;
- var shouldDisable = GetModel().ShouldDisable(itemView.customData);
- using (new EditorGUI.DisabledScope(shouldDisable))
- {
- EditorGUI.BeginChangeCheck();
- bool visible = GetModel().GetMeshVisibility(itemView.customData);
- visible = GUI.Toggle(cellRect, visible, visible ? VisibilityIconStyle.visibilityOnIcon : VisibilityIconStyle.visibilityOffIcon, style);
- if (EditorGUI.EndChangeCheck())
- GetModel().SetMeshVisibility(itemView.customData, visible);
- }
- }
- private void DrawNameCell(Rect cellRect, TreeViewItem item, ref RowGUIArgs args)
- {
- args.rowRect = cellRect;
- base.RowGUI(args);
- }
- protected override void RowGUI(RowGUIArgs args)
- {
- var item = args.item;
- for (int i = 0; i < args.GetNumVisibleColumns(); ++i)
- {
- CellGUI(args.GetCellRect(i), item, args.GetColumn(i), ref args);
- }
- }
- protected override void SelectionChanged(IList<int> selectedIds)
- {
- SpriteCache newSelected = null;
- if (selectedIds.Count > 0)
- {
- var selected = GetRows().FirstOrDefault(x => ((TreeViewItemBase<SpriteCache>)x).customData.GetInstanceID() == selectedIds[0]) as TreeViewItemBase<SpriteCache>;
- if (selected != null)
- newSelected = selected.customData;
- }
- var skinningCache = newSelected.skinningCache;
- using (skinningCache.UndoScope(TextContent.selectionChange))
- {
- skinningCache.events.selectedSpriteChanged.Invoke(newSelected);
- }
- }
- public void SetSelection(SpriteCache sprite)
- {
- var rows = GetRows();
- for (int i = 0; rows != null && i < rows.Count; ++i)
- {
- var r = (TreeViewItemBase<SpriteCache>)rows[i];
- if (r.customData == sprite)
- {
- SetSelection(new[] { r.customData.GetInstanceID() }, TreeViewSelectionOptions.RevealAndFrame);
- break;
- }
- }
- }
- protected override IList<TreeViewItem> BuildRows(TreeViewItem root)
- {
- var rows = GetRows() ?? new List<TreeViewItem>(200);
- rows.Clear();
- m_Sprites.RemoveAll(s => s == null);
- foreach (var sprite in m_Sprites)
- AddTreeViewItem(rows, sprite);
- SetupDepthsFromParentsAndChildren(root);
- return rows;
- }
- }
- }
|