137 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			137 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | |||
|  | using System.Collections.Generic; | |||
|  | using JetBrains.Annotations; | |||
|  | using UnityEngine; | |||
|  | 
 | |||
|  | namespace UnityEditor.Searcher | |||
|  | { | |||
|  |     [PublicAPI] | |||
|  |     [Serializable] | |||
|  |     public class SearcherItem | |||
|  |     { | |||
|  |         [SerializeField] int m_Id; | |||
|  |         [SerializeField] List<int> m_ChildrenIds; | |||
|  |         [SerializeField] string m_Name; | |||
|  |         [SerializeField] string m_Help; | |||
|  |         [SerializeField] string[] m_Synonyms; | |||
|  |         [SerializeField] Texture2D m_Icon; | |||
|  |         [SerializeField] bool m_CollapseEmptyIcon = true; | |||
|  | 
 | |||
|  |         public int Id => m_Id; | |||
|  | 
 | |||
|  |         public virtual string Name => m_Name; | |||
|  | 
 | |||
|  |         public string Path { get; private set; } | |||
|  | 
 | |||
|  |         public string Help | |||
|  |         { | |||
|  |             get => m_Help; | |||
|  |             set => m_Help = value; | |||
|  |         } | |||
|  | 
 | |||
|  |         public string[] Synonyms { get { return m_Synonyms; } set { m_Synonyms = value; } } | |||
|  | 
 | |||
|  |         public int Depth => Parent?.Depth + 1 ?? 0; | |||
|  | 
 | |||
|  |         public object UserData { get; set; } | |||
|  | 
 | |||
|  |         public Texture2D Icon { get => m_Icon; set { m_Icon = value; } } | |||
|  | 
 | |||
|  |         public bool CollapseEmptyIcon { get => m_CollapseEmptyIcon; set { m_CollapseEmptyIcon = value; } } | |||
|  | 
 | |||
|  |         public SearcherItem Parent { get; private set; } | |||
|  |         public SearcherDatabaseBase Database { get; private set; } | |||
|  | 
 | |||
|  |         // the backing field gets serialized otherwise and triggers a "Serialization depth limit 7 exceeded" warning | |||
|  |         [field:NonSerialized] | |||
|  |         public List<SearcherItem> Children { get; private set; } | |||
|  |         public bool HasChildren => Children.Count > 0; | |||
|  | 
 | |||
|  |         public SearcherItem(string name, string help = "", List<SearcherItem> children = null, object userData = null, Texture2D icon = null, bool collapseEmptyIcon = true) | |||
|  |         { | |||
|  |             m_Id = -1; | |||
|  |             Parent = null; | |||
|  |             Database = null; | |||
|  | 
 | |||
|  |             m_Name = name; | |||
|  |             m_Help = help; | |||
|  |             m_Icon = icon; | |||
|  |             UserData = userData; | |||
|  |             m_CollapseEmptyIcon = collapseEmptyIcon; | |||
|  | 
 | |||
|  |             Children = new List<SearcherItem>(); | |||
|  |             if (children == null) | |||
|  |                 return; | |||
|  | 
 | |||
|  |             Children = children; | |||
|  |             foreach (var child in children) | |||
|  |                 child.OverwriteParent(this); | |||
|  |         } | |||
|  | 
 | |||
|  |         public void AddChild(SearcherItem child) | |||
|  |         { | |||
|  |             if (child == null) | |||
|  |                 throw new ArgumentNullException(nameof(child)); | |||
|  | 
 | |||
|  |             if (Database != null) | |||
|  |                 throw new InvalidOperationException( | |||
|  |                     "Cannot add more children to an item that was already used in a database."); | |||
|  | 
 | |||
|  |             if (Children == null) | |||
|  |                 Children = new List<SearcherItem>(); | |||
|  | 
 | |||
|  |             Children.Add(child); | |||
|  |             child.OverwriteParent(this); | |||
|  |         } | |||
|  | 
 | |||
|  |         internal void OverwriteId(int newId) | |||
|  |         { | |||
|  |             m_Id = newId; | |||
|  |         } | |||
|  | 
 | |||
|  |         void OverwriteParent(SearcherItem newParent) | |||
|  |         { | |||
|  |             Parent = newParent; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal void OverwriteDatabase(SearcherDatabaseBase newDatabase) | |||
|  |         { | |||
|  |             Database = newDatabase; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal void OverwriteChildrenIds(List<int> childrenIds) | |||
|  |         { | |||
|  |             m_ChildrenIds = childrenIds; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal void GeneratePath() | |||
|  |         { | |||
|  |             if (Parent != null) | |||
|  |                 Path = Parent.Path + " "; | |||
|  |             else | |||
|  |                 Path = string.Empty; | |||
|  |             Path += Name; | |||
|  |         } | |||
|  | 
 | |||
|  |         internal void ReInitAfterLoadFromFile() | |||
|  |         { | |||
|  |             if (Children == null) | |||
|  |                 Children = new List<SearcherItem>(); | |||
|  | 
 | |||
|  |             foreach (var id in m_ChildrenIds) | |||
|  |             { | |||
|  |                 var child = Database.ItemList[id]; | |||
|  |                 Children.Add(child); | |||
|  |                 child.OverwriteParent(this); | |||
|  |             } | |||
|  | 
 | |||
|  |             GeneratePath(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public override string ToString() | |||
|  |         { | |||
|  |             return $"{nameof(Id)}: {Id}, {nameof(Name)}: {Name}, {nameof(Depth)}: {Depth}"; | |||
|  |         } | |||
|  |     } | |||
|  | } |