102 lines
3.0 KiB
C#
102 lines
3.0 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using UnityEditor.Experimental.GraphView;
|
||
using UnityEngine;
|
||
using UnityEditor;
|
||
|
||
public class StringListSerchProvider : ScriptableObject , ISearchWindowProvider
|
||
// public class StringListSerchProvider
|
||
{
|
||
|
||
public List<SearchTreeEntry> CreateSearchTree(SearchWindowContext context)
|
||
{
|
||
List<SearchTreeEntry> serchList = new List<SearchTreeEntry>();
|
||
serchList.Add(new SearchTreeGroupEntry(new GUIContent("List"),0));
|
||
List<string> listItemAfterSort = listItems.ToList();
|
||
|
||
sortListItems(ref listItemAfterSort);
|
||
|
||
List<string> groups = new List<string>();
|
||
foreach (var item in listItemAfterSort)
|
||
{
|
||
string[] entryTitle = item.Split("/");
|
||
string groupName = "";
|
||
for (int i = 0; i < entryTitle.Length - 1; i++)
|
||
{
|
||
groupName += entryTitle[i];
|
||
if (!groups.Contains(groupName))
|
||
{
|
||
serchList.Add(new SearchTreeGroupEntry(new GUIContent(entryTitle[i]),i+1));
|
||
}
|
||
groupName += "/";
|
||
}
|
||
|
||
SearchTreeEntry entry = new SearchTreeEntry(new GUIContent(entryTitle.Last()));
|
||
entry.level = entryTitle.Length;
|
||
entry.userData = item;//这里是serch操作点击最后的返回值,是什么都可以的。
|
||
// Debug.Log(entry.userData);
|
||
serchList.Add(entry);
|
||
}
|
||
|
||
|
||
return serchList;
|
||
|
||
}
|
||
|
||
public bool OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context)
|
||
{
|
||
string data = (string)searchTreeEntry.userData;
|
||
onSetIndexCallback?.Invoke(data);
|
||
return true;
|
||
}
|
||
|
||
private string[] listItems;
|
||
private Action<string> onSetIndexCallback;
|
||
public StringListSerchProvider(string[] items, Action<string> callBack)
|
||
{
|
||
listItems = items;
|
||
onSetIndexCallback = callBack;
|
||
}
|
||
|
||
public void Initialize(string[] items, Action<string> callBack)
|
||
{
|
||
listItems = items;
|
||
onSetIndexCallback = callBack;
|
||
}
|
||
|
||
// private List<string> sortListItems;
|
||
|
||
void sortListItems(ref List<string> list)
|
||
{
|
||
// sortListItems = listItems.ToList();
|
||
list.Sort((a, b) =>
|
||
{
|
||
string[] splits1 = a.Split('/');
|
||
string[] splits2 = b.Split('/');
|
||
|
||
for (int i = 0; i < splits1.Length; i++)
|
||
{
|
||
if (i >= splits2.Length)
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
int value = splits1[i].CompareTo(splits2[i]);
|
||
if (value != 0)
|
||
{
|
||
if (splits1.Length != splits2.Length && (i == splits1.Length - 1 || i == splits2.Length - 1))
|
||
{
|
||
return splits1.Length < splits2.Length ? 1 : -1;
|
||
}
|
||
|
||
return value;
|
||
}
|
||
}
|
||
|
||
return 0;
|
||
});
|
||
}
|
||
}
|