|
|
- 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<PackageItem>().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);
- }
- }
- }
|