You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

96 lines
3.4 KiB

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