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.
90 lines
2.6 KiB
90 lines
2.6 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using JetBrains.Annotations; |
|
using UnityEngine; |
|
|
|
namespace UnityEditor.Searcher |
|
{ |
|
[PublicAPI] |
|
public abstract class SearcherDatabaseBase |
|
{ |
|
protected const string k_SerializedJsonFile = "/SerializedDatabase.json"; |
|
public string DatabaseDirectory { get; set; } |
|
|
|
public IList<SearcherItem> ItemList => m_ItemList; |
|
|
|
// ReSharper disable once Unity.RedundantSerializeFieldAttribute |
|
[SerializeField] |
|
protected List<SearcherItem> m_ItemList; |
|
|
|
protected SearcherDatabaseBase(string databaseDirectory) |
|
{ |
|
DatabaseDirectory = databaseDirectory; |
|
} |
|
|
|
public virtual void BuildIndex() { } |
|
|
|
public abstract List<SearcherItem> Search(string query, out float localMaxScore); |
|
|
|
internal void OverwriteId(int newId) |
|
{ |
|
Id = newId; |
|
} |
|
|
|
internal int Id { get; private set; } |
|
|
|
protected void LoadFromFile() |
|
{ |
|
var reader = new StreamReader(DatabaseDirectory + k_SerializedJsonFile); |
|
var serializedData = reader.ReadToEnd(); |
|
reader.Close(); |
|
|
|
EditorJsonUtility.FromJsonOverwrite(serializedData, this); |
|
|
|
foreach (var item in m_ItemList) |
|
{ |
|
item.OverwriteDatabase(this); |
|
item.ReInitAfterLoadFromFile(); |
|
} |
|
} |
|
|
|
protected void SerializeToFile() |
|
{ |
|
if (DatabaseDirectory == null) |
|
return; |
|
var serializedData = EditorJsonUtility.ToJson(this, true); |
|
var writer = new StreamWriter(DatabaseDirectory + k_SerializedJsonFile, false); |
|
writer.Write(serializedData); |
|
writer.Close(); |
|
} |
|
|
|
protected void AddItemToIndex(SearcherItem item, ref int lastId, Action<SearcherItem> action) |
|
{ |
|
m_ItemList.Insert(lastId, item); |
|
|
|
// We can only set the id here as we only know the final index of the item here. |
|
item.OverwriteId(lastId); |
|
item.GeneratePath(); |
|
|
|
action?.Invoke(item); |
|
|
|
lastId++; |
|
|
|
// This is used for sorting results between databases. |
|
item.OverwriteDatabase(this); |
|
|
|
if (!item.HasChildren) |
|
return; |
|
|
|
var childrenIds = new List<int>(); |
|
foreach (SearcherItem child in item.Children) |
|
{ |
|
AddItemToIndex(child, ref lastId, action); |
|
childrenIds.Add(child.Id); |
|
} |
|
|
|
item.OverwriteChildrenIds(childrenIds); |
|
} |
|
} |
|
}
|
|
|