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.

95 lines
3.4 KiB

  1. using System;
  2. using System.Text.RegularExpressions;
  3. using UnityEngine.Experimental.UIElements;
  4. namespace UnityEditor.PackageManager.UI
  5. {
  6. internal static class PackageFiltering
  7. {
  8. private static bool FilterByText(PackageInfo info, string text)
  9. {
  10. if (info == null)
  11. return false;
  12. if (info.Name.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0)
  13. return true;
  14. if (!string.IsNullOrEmpty(info.DisplayName) && info.DisplayName.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0)
  15. return true;
  16. if (!info.IsBuiltIn)
  17. {
  18. var prerelease = text.StartsWith("-") ? text.Substring(1) : text;
  19. if (info.Version != null && info.Version.Prerelease.IndexOf(prerelease, StringComparison.CurrentCultureIgnoreCase) >= 0)
  20. return true;
  21. if (info.VersionWithoutTag.StartsWith(text, StringComparison.CurrentCultureIgnoreCase))
  22. return true;
  23. if (info.IsPreview)
  24. {
  25. if (PackageTag.preview.ToString().IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0)
  26. return true;
  27. }
  28. if (info.IsVerified)
  29. {
  30. if (PackageTag.verified.ToString().IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0)
  31. return true;
  32. }
  33. }
  34. return false;
  35. }
  36. internal static bool FilterByText(Package package, string text)
  37. {
  38. if (string.IsNullOrEmpty(text))
  39. return true;
  40. var trimText = text.Trim(' ', '\t');
  41. trimText = Regex.Replace(trimText, @"[ ]{2,}", " ");
  42. return string.IsNullOrEmpty(trimText) || FilterByText(package.Current ?? package.Latest, trimText);
  43. }
  44. private static bool FilterByText(PackageItem item, string text)
  45. {
  46. return item.package != null && FilterByText(item.package, text);
  47. }
  48. public static void FilterPackageList(PackageList packageList)
  49. {
  50. PackageItem firstItem = null;
  51. PackageItem lastItem = null;
  52. var selectedItemInFilter = false;
  53. var selectedItem = packageList.selectedItem;
  54. var packageItems = packageList.Query<PackageItem>().ToList();
  55. foreach (var item in packageItems)
  56. {
  57. if (FilterByText(item, PackageSearchFilter.Instance.SearchText))
  58. {
  59. if (firstItem == null)
  60. firstItem = item;
  61. if (item == selectedItem)
  62. selectedItemInFilter = true;
  63. UIUtils.SetElementDisplay(item, true);
  64. if (lastItem != null)
  65. lastItem.nextItem = item;
  66. item.previousItem = lastItem;
  67. item.nextItem = null;
  68. lastItem = item;
  69. }
  70. else
  71. UIUtils.SetElementDisplay(item, false);
  72. }
  73. if (firstItem == null)
  74. packageList.ShowNoResults();
  75. else
  76. packageList.ShowResults(selectedItemInFilter ? selectedItem : firstItem);
  77. }
  78. }
  79. }