PackageManagerToolbar.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System.Linq;
  2. using UnityEngine;
  3. using UnityEngine.Experimental.UIElements;
  4. namespace UnityEditor.PackageManager.UI
  5. {
  6. #if !UNITY_2018_3_OR_NEWER
  7. internal class PackageManangerToolbarFactory : UxmlFactory<PackageManagerToolbar>
  8. {
  9. protected override PackageManagerToolbar DoCreate(IUxmlAttributes bag, CreationContext cc)
  10. {
  11. return new PackageManagerToolbar();
  12. }
  13. }
  14. #endif
  15. internal class PackageManagerToolbar : VisualElement
  16. {
  17. #if UNITY_2018_3_OR_NEWER
  18. internal new class UxmlFactory : UxmlFactory<PackageManagerToolbar> {}
  19. #endif
  20. private readonly VisualElement root;
  21. [SerializeField]
  22. private PackageFilter selectedFilter = PackageFilter.Unity;
  23. public PackageManagerToolbar()
  24. {
  25. root = Resources.GetTemplate("PackageManagerToolbar.uxml");
  26. Add(root);
  27. root.StretchToParentSize();
  28. SetFilter(PackageCollection.Instance.Filter);
  29. OnFilterChanged(PackageCollection.Instance.Filter);
  30. RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
  31. RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
  32. PackageCollection.Instance.OnFilterChanged += OnFilterChanged;
  33. }
  34. private void OnFilterChanged(PackageFilter filter)
  35. {
  36. selectedFilter = filter;
  37. FilterButton.text = string.Format("{0} ▾", GetFilterDisplayName(selectedFilter));
  38. }
  39. public void GrabFocus()
  40. {
  41. SearchToolbar.GrabFocus();
  42. }
  43. public new void SetEnabled(bool enable)
  44. {
  45. base.SetEnabled(enable);
  46. FilterButton.SetEnabled(enable);
  47. AdvancedButton.SetEnabled(enable);
  48. SearchToolbar.SetEnabled(enable);
  49. }
  50. private static string GetFilterDisplayName(PackageFilter filter)
  51. {
  52. switch (filter)
  53. {
  54. case PackageFilter.Unity:
  55. return "Unity Registry";
  56. case PackageFilter.Other:
  57. return "My Registries";
  58. case PackageFilter.Local:
  59. return "In Project";
  60. case PackageFilter.Modules:
  61. return "Built-in";
  62. case PackageFilter.None:
  63. return "None";
  64. default:
  65. return filter.ToString();
  66. }
  67. }
  68. private void SetFilter(object obj)
  69. {
  70. PackageCollection.Instance.SetFilter((PackageFilter)obj);
  71. }
  72. private void OnFilterButtonMouseDown(MouseDownEvent evt)
  73. {
  74. if (evt.propagationPhase != PropagationPhase.AtTarget)
  75. return;
  76. var menu = new GenericMenu();
  77. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Unity)),
  78. selectedFilter == PackageFilter.Unity,
  79. SetFilter, PackageFilter.Unity);
  80. if (PackageCollection.Instance.LatestSearchOtherPackages.Any(p => !p.IsLocal && !p.IsInDevelopment))
  81. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Other)),
  82. selectedFilter == PackageFilter.Other,
  83. SetFilter, PackageFilter.Other);
  84. menu.AddSeparator("");
  85. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Local)),
  86. selectedFilter == PackageFilter.Local,
  87. SetFilter, PackageFilter.Local);
  88. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Modules)),
  89. selectedFilter == PackageFilter.Modules,
  90. SetFilter, PackageFilter.Modules);
  91. var menuPosition = new Vector2(FilterButton.layout.xMin, FilterButton.layout.center.y);
  92. menuPosition = this.LocalToWorld(menuPosition);
  93. var menuRect = new Rect(menuPosition, Vector2.zero);
  94. menu.DropDown(menuRect);
  95. }
  96. private void OnAdvancedButtonMouseDown(MouseDownEvent evt)
  97. {
  98. if (evt.propagationPhase != PropagationPhase.AtTarget)
  99. return;
  100. var menu = new GenericMenu();
  101. menu.AddItem(new GUIContent("Show preview packages"), PackageManagerPrefs.ShowPreviewPackages, TogglePreviewPackages);
  102. //menu.AddItem(new GUIContent("Reset to defaults"), false, ResetToDefaultsClick);
  103. var menuPosition = new Vector2(AdvancedButton.layout.xMax + 30, AdvancedButton.layout.center.y);
  104. menuPosition = this.LocalToWorld(menuPosition);
  105. var menuRect = new Rect(menuPosition, Vector2.zero);
  106. menu.DropDown(menuRect);
  107. }
  108. private static void TogglePreviewPackages()
  109. {
  110. var showPreviewPackages = PackageManagerPrefs.ShowPreviewPackages;
  111. if (!showPreviewPackages && PackageManagerPrefs.ShowPreviewPackagesWarning)
  112. {
  113. const string message = "Preview packages are not verified with Unity, may be unstable, and are unsupported in production. Are you sure you want to show preview packages?";
  114. if (!EditorUtility.DisplayDialog("Unity Package Manager", message, "Yes", "No"))
  115. return;
  116. PackageManagerPrefs.ShowPreviewPackagesWarning = false;
  117. }
  118. PackageManagerPrefs.ShowPreviewPackages = !showPreviewPackages;
  119. PackageCollection.Instance.UpdatePackageCollection(true);
  120. }
  121. private void ResetToDefaultsClick()
  122. {
  123. if (!EditorUtility.DisplayDialog("Unity Package Manager", "Operation will reset all your packages to Editor defaults. Do you want to continue?", "Yes", "No"))
  124. return;
  125. // Registered on callback
  126. AssemblyReloadEvents.beforeAssemblyReload += PackageManagerWindow.ShowPackageManagerWindow;
  127. Client.ResetToEditorDefaults();
  128. var windows = UnityEngine.Resources.FindObjectsOfTypeAll<PackageManagerWindow>();
  129. if (windows.Length > 0)
  130. {
  131. windows[0].Close();
  132. }
  133. }
  134. private void OnEnterPanel(AttachToPanelEvent evt)
  135. {
  136. FilterButton.RegisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
  137. AdvancedButton.RegisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
  138. }
  139. private void OnLeavePanel(DetachFromPanelEvent evt)
  140. {
  141. FilterButton.UnregisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
  142. AdvancedButton.UnregisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
  143. }
  144. private Label FilterButton { get { return root.Q<Label>("toolbarFilterButton"); } }
  145. private Label AdvancedButton { get { return root.Q<Label>("toolbarAdvancedButton"); } }
  146. internal PackageSearchToolbar SearchToolbar { get { return root.Q<PackageSearchToolbar>("toolbarSearch"); } }
  147. }
  148. }