91 lines
2.6 KiB
C#
91 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|