87 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using JetBrains.Annotations; | |||
|  | 
 | |||
|  | namespace UnityEditor.Searcher | |||
|  | { | |||
|  |     // SearcherTreeUtility contains a helper function that takes a flat list of SearcherItems and constructs a SearcherItems tree using their names as paths. | |||
|  |     // | |||
|  |     // For example: | |||
|  |     // List<SearcherItem> items = new List<SearcherItem>(); | |||
|  |     // items.Add(new SearcherItem("Fantasy/J. R. R. Tolkien/The Fellowship of the Ring")); | |||
|  |     // items.Add(new SearcherItem("Fantasy/J. R. R. Tolkien/The Two Towers")); | |||
|  |     // items.Add(new SearcherItem("Fantasy/J. R. R. Tolkien/The Return of the King")); | |||
|  |     // items.Add(new SearcherItem("Health & Fitness/Becoming a Supple Leopard")); | |||
|  |     // items.Add(new SearcherItem("Some Uncategorized Book")); | |||
|  |     //  | |||
|  |     // List<SearcherItem> itemsTree = SearcherTreeUtility.CreateFromFlatList(items); | |||
|  |     // | |||
|  |     // Will return the follow hierarchy: | |||
|  |     // - Fantasy | |||
|  |     // - - J. R. R. Tolkien | |||
|  |     // - - - The Fellowship of the Ring | |||
|  |     // - - - The Two Towers | |||
|  |     // - - - The Return of the King | |||
|  |     // - Health & Fitness | |||
|  |     // - - Becoming a Supple Leopard | |||
|  |     // - Some Uncategorized Book | |||
|  |     // | |||
|  |     // Where the first level of SearcherItems is directly inside the list. | |||
|  |     // Note that this will also break the names into their final path component. | |||
|  |     [PublicAPI] | |||
|  |     public static class SearcherTreeUtility | |||
|  |     { | |||
|  |         public static List<SearcherItem> CreateFromFlatList(List<SearcherItem> items) | |||
|  |         { | |||
|  |             List<SearcherItem> searchList = new List<SearcherItem>(); | |||
|  |             for (int i = 0; i < items.Count; ++i) | |||
|  |             { | |||
|  |                 SearcherItem item = items[i]; | |||
|  |                 string[] pathParts = item.Name.Split('/'); | |||
|  |                 SearcherItem searchNode = FindNodeByName(searchList, pathParts[0]); | |||
|  |                 if (searchNode == null) | |||
|  |                 { | |||
|  |                     searchNode = new SearcherItem(pathParts[0]); | |||
|  |                     searchList.Add(searchNode); | |||
|  |                 } | |||
|  |                 AddItem(searchNode, item, pathParts); | |||
|  |             } | |||
|  |             return searchList; | |||
|  |         } | |||
|  | 
 | |||
|  |         private static void AddItem(SearcherItem root, SearcherItem item, string[] pathParts) | |||
|  |         { | |||
|  |             string itemFullPath = item.Name; | |||
|  |             string itemName = pathParts[pathParts.Length - 1]; | |||
|  |             string currentPath = string.Empty; | |||
|  |             SearcherItem currentSearchNode = root; | |||
|  | 
 | |||
|  |             for (int i = 1; i < pathParts.Length; ++i) | |||
|  |             { | |||
|  |                 SearcherItem node = FindNodeByName(currentSearchNode.Children, pathParts[i]); | |||
|  |                 if (node == null) | |||
|  |                 { | |||
|  |                     node = new SearcherItem(pathParts[i]); | |||
|  |                     currentSearchNode.AddChild(node); | |||
|  |                 } | |||
|  |                 currentSearchNode = node; | |||
|  |             } | |||
|  |             // Set the user data to the final node, which is guaranteed to correspond to the item. | |||
|  |             currentSearchNode.UserData = item.UserData; | |||
|  |             currentSearchNode.Icon = item.Icon; | |||
|  |         } | |||
|  | 
 | |||
|  |         private static SearcherItem FindNodeByName(IList<SearcherItem> searchList, string name) | |||
|  |         { | |||
|  |             for (int i = 0; i < searchList.Count; ++i) | |||
|  |             { | |||
|  |                 if (searchList[i].Name.Equals(name)) | |||
|  |                 { | |||
|  |                     return searchList[i]; | |||
|  |                 } | |||
|  |             } | |||
|  |             return null; | |||
|  |         } | |||
|  | 
 | |||
|  |     } | |||
|  | } |