using System.Collections.Generic; using System.Linq; using System.Threading; using UnityEngine; namespace Unity.VisualScripting { public abstract class ExtensibleFuzzyOptionTree : FuzzyOptionTree { protected ExtensibleFuzzyOptionTree() { extensions = this.Extensions().ToList(); } protected ExtensibleFuzzyOptionTree(GUIContent header) : this() { this.header = header; } public IList extensions { get; } public override void Prewarm() { foreach (var extension in extensions) { extension.Prewarm(); } } public override IFuzzyOption Option(object item) { if (item is IFuzzyOption option) { return option; } foreach (var extension in extensions) { var extensionOption = extension.Option(item); if (extensionOption != null) { return extensionOption; } } return base.Option(item); } #region Hierarchy public override IEnumerable Root() { foreach (var extension in extensions) { foreach (var extensionRootItem in extension.Root()) { yield return extensionRootItem; } } } public override IEnumerable Children(object parent) { foreach (var extension in extensions) { foreach (var extensionChild in extension.Children(parent)) { yield return extensionChild; } } } #endregion #region Search public override IEnumerable OrderedSearchResults(string query, CancellationToken cancellation) { foreach (var baseSearchResult in base.OrderedSearchResults(query, cancellation)) { yield return baseSearchResult; } foreach (var extension in extensions) { if (extension.searchable) { foreach (var extensionSearchResult in extension.OrderedSearchResults(query, cancellation)) { yield return extensionSearchResult; } } } } public override IEnumerable SearchResults(string query, CancellationToken cancellation) { foreach (var baseSearchResult in base.SearchResults(query, cancellation)) { yield return baseSearchResult; } foreach (var extension in extensions) { if (extension.searchable) { foreach (var extensionSearchResult in extension.SearchResults(query, cancellation)) { yield return extensionSearchResult; } } } } public override string SearchResultLabel(object item, string query) { foreach (var extension in extensions) { var extensionSearchResultLabel = extension.SearchResultLabel(item, query); if (extensionSearchResultLabel != null) { return extensionSearchResultLabel; } } return null; } #endregion } }