using System; using System.Text.RegularExpressions; using UnityEngine.Experimental.UIElements; namespace UnityEditor.PackageManager.UI { internal static class PackageFiltering { private static bool FilterByText(PackageInfo info, string text) { if (info == null) return false; if (info.Name.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0) return true; if (!string.IsNullOrEmpty(info.DisplayName) && info.DisplayName.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0) return true; if (!info.IsBuiltIn) { var prerelease = text.StartsWith("-") ? text.Substring(1) : text; if (info.Version != null && info.Version.Prerelease.IndexOf(prerelease, StringComparison.CurrentCultureIgnoreCase) >= 0) return true; if (info.VersionWithoutTag.StartsWith(text, StringComparison.CurrentCultureIgnoreCase)) return true; if (info.IsPreview) { if (PackageTag.preview.ToString().IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0) return true; } if (info.IsVerified) { if (PackageTag.verified.ToString().IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0) return true; } } return false; } internal static bool FilterByText(Package package, string text) { if (string.IsNullOrEmpty(text)) return true; var trimText = text.Trim(' ', '\t'); trimText = Regex.Replace(trimText, @"[ ]{2,}", " "); return string.IsNullOrEmpty(trimText) || FilterByText(package.Current ?? package.Latest, trimText); } private static bool FilterByText(PackageItem item, string text) { return item.package != null && FilterByText(item.package, text); } public static void FilterPackageList(PackageList packageList) { PackageItem firstItem = null; PackageItem lastItem = null; var selectedItemInFilter = false; var selectedItem = packageList.selectedItem; var packageItems = packageList.Query().ToList(); foreach (var item in packageItems) { if (FilterByText(item, PackageSearchFilter.Instance.SearchText)) { if (firstItem == null) firstItem = item; if (item == selectedItem) selectedItemInFilter = true; UIUtils.SetElementDisplay(item, true); if (lastItem != null) lastItem.nextItem = item; item.previousItem = lastItem; item.nextItem = null; lastItem = item; } else UIUtils.SetElementDisplay(item, false); } if (firstItem == null) packageList.ShowNoResults(); else packageList.ShowResults(selectedItemInFilter ? selectedItem : firstItem); } } }