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;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| } |