You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.3 KiB
87 lines
3.3 KiB
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; |
|
} |
|
|
|
} |
|
} |