PackageManagerWindow.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. using System.Linq;
  2. using UnityEngine;
  3. using UnityEngine.Experimental.UIElements;
  4. using UnityEditor.Experimental.UIElements;
  5. namespace UnityEditor.PackageManager.UI
  6. {
  7. internal class PackageManagerWindow : EditorWindow
  8. {
  9. public const string PackagePath = "Packages/com.unity.package-manager-ui/";
  10. public const string ResourcesPath = PackagePath + "Editor/Resources/";
  11. private const string TemplatePath = ResourcesPath + "Templates/PackageManagerWindow.uxml";
  12. private const string DarkStylePath = ResourcesPath + "Styles/Main_Dark.uss";
  13. private const string LightStylePath = ResourcesPath + "Styles/Main_Light.uss";
  14. private const double targetVersionNumber = 2018.1;
  15. public PackageCollection Collection;
  16. public PackageSearchFilter SearchFilter;
  17. #if UNITY_2018_1_OR_NEWER
  18. public void OnEnable()
  19. {
  20. PackageCollection.InitInstance(ref Collection);
  21. PackageSearchFilter.InitInstance(ref SearchFilter);
  22. this.GetRootVisualContainer().AddStyleSheetPath(EditorGUIUtility.isProSkin ? DarkStylePath : LightStylePath);
  23. var windowResource = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(TemplatePath);
  24. if (windowResource != null)
  25. {
  26. var template = windowResource.CloneTree(null);
  27. this.GetRootVisualContainer().Add(template);
  28. template.StretchToParentSize();
  29. PackageList.OnSelected += OnPackageSelected;
  30. PackageList.OnLoaded += OnPackagesLoaded;
  31. PackageList.OnFocusChange += OnListFocusChange;
  32. PackageManagerToolbar.SearchToolbar.OnSearchChange += OnSearchChange;
  33. PackageManagerToolbar.SearchToolbar.OnFocusChange += OnToolbarFocusChange;
  34. // Disable filter while fetching first results
  35. if (!PackageCollection.Instance.LatestListPackages.Any())
  36. PackageManagerToolbar.SetEnabled(false);
  37. else
  38. PackageList.SelectLastSelection();
  39. }
  40. }
  41. private void OnListFocusChange()
  42. {
  43. PackageManagerToolbar.GrabFocus();
  44. }
  45. private void OnToolbarFocusChange()
  46. {
  47. PackageList.GrabFocus();
  48. }
  49. private void OnSearchChange(string searchText)
  50. {
  51. PackageSearchFilter.Instance.SearchText = searchText;
  52. PackageFiltering.FilterPackageList(PackageList);
  53. }
  54. public void OnDisable()
  55. {
  56. // Package list item may not be valid here.
  57. if (PackageList != null)
  58. {
  59. PackageList.OnSelected -= OnPackageSelected;
  60. PackageList.OnLoaded -= OnPackagesLoaded;
  61. }
  62. if (PackageManagerToolbar != null)
  63. {
  64. PackageManagerToolbar.SearchToolbar.OnSearchChange -= OnSearchChange;
  65. PackageManagerToolbar.SearchToolbar.OnFocusChange -= OnToolbarFocusChange;
  66. }
  67. }
  68. public void OnDestroy()
  69. {
  70. PackageSearchFilter.Instance.ResetSearch();
  71. PackageCollection.Instance.ResetExpandedGroups();
  72. PackageCollection.Instance.SetFilter(PackageFilter.Unity, false);
  73. }
  74. private void OnPackageSelected(Package package)
  75. {
  76. PackageDetails.SetPackage(package);
  77. }
  78. private void OnPackagesLoaded()
  79. {
  80. PackageManagerToolbar.SetEnabled(true);
  81. }
  82. private PackageList PackageList
  83. {
  84. get {return this.GetRootVisualContainer().Q<PackageList>("packageList");}
  85. }
  86. private PackageDetails PackageDetails
  87. {
  88. get {return this.GetRootVisualContainer().Q<PackageDetails>("detailsGroup");}
  89. }
  90. private PackageManagerToolbar PackageManagerToolbar
  91. {
  92. get {return this.GetRootVisualContainer().Q<PackageManagerToolbar>("toolbarContainer");}
  93. }
  94. internal Alert ErrorBanner { get { return this.GetRootVisualContainer().Q<Alert>("errorBanner"); } }
  95. #endif
  96. [MenuItem("Window/Package Manager", priority = 1500)]
  97. internal static void ShowPackageManagerWindow()
  98. {
  99. #if UNITY_2018_1_OR_NEWER
  100. var window = GetWindow<PackageManagerWindow>(false, "Packages", true);
  101. window.minSize = new Vector2(700, 250);
  102. window.Show();
  103. #else
  104. EditorUtility.DisplayDialog("Unsupported Unity Version", string.Format("The Package Manager requires Unity Version {0} or higher to operate.", targetVersionNumber), "Ok");
  105. #endif
  106. }
  107. }
  108. }