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