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.

163 lines
6.3 KiB

  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.All;
  23. public PackageManagerToolbar()
  24. {
  25. root = Resources.GetTemplate("PackageManagerToolbar.uxml");
  26. Add(root);
  27. root.StretchToParentSize();
  28. SetFilter(PackageCollection.Instance.Filter);
  29. RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
  30. RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
  31. }
  32. public void GrabFocus()
  33. {
  34. SearchToolbar.GrabFocus();
  35. }
  36. public new void SetEnabled(bool enable)
  37. {
  38. base.SetEnabled(enable);
  39. FilterButton.SetEnabled(enable);
  40. AdvancedButton.SetEnabled(enable);
  41. SearchToolbar.SetEnabled(enable);
  42. }
  43. private static string GetFilterDisplayName(PackageFilter filter)
  44. {
  45. switch (filter)
  46. {
  47. case PackageFilter.All:
  48. return "All packages";
  49. case PackageFilter.Local:
  50. return "In Project";
  51. case PackageFilter.Modules:
  52. return "Built-in packages";
  53. case PackageFilter.None:
  54. return "None";
  55. default:
  56. return filter.ToString();
  57. }
  58. }
  59. private void SetFilter(object obj)
  60. {
  61. var previouSelectedFilter = selectedFilter;
  62. selectedFilter = (PackageFilter) obj;
  63. FilterButton.text = string.Format("{0} ▾", GetFilterDisplayName(selectedFilter));
  64. if (selectedFilter != previouSelectedFilter)
  65. PackageCollection.Instance.SetFilter(selectedFilter);
  66. }
  67. private void OnFilterButtonMouseDown(MouseDownEvent evt)
  68. {
  69. if (evt.propagationPhase != PropagationPhase.AtTarget)
  70. return;
  71. var menu = new GenericMenu();
  72. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.All)),
  73. selectedFilter == PackageFilter.All,
  74. SetFilter, PackageFilter.All);
  75. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Local)),
  76. selectedFilter == PackageFilter.Local,
  77. SetFilter, PackageFilter.Local);
  78. menu.AddSeparator("");
  79. menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Modules)),
  80. selectedFilter == PackageFilter.Modules,
  81. SetFilter, PackageFilter.Modules);
  82. var menuPosition = new Vector2(FilterButton.layout.xMin, FilterButton.layout.center.y);
  83. menuPosition = this.LocalToWorld(menuPosition);
  84. var menuRect = new Rect(menuPosition, Vector2.zero);
  85. menu.DropDown(menuRect);
  86. }
  87. private void OnAdvancedButtonMouseDown(MouseDownEvent evt)
  88. {
  89. if (evt.propagationPhase != PropagationPhase.AtTarget)
  90. return;
  91. var menu = new GenericMenu();
  92. menu.AddItem(new GUIContent("Show preview packages"), PackageManagerPrefs.ShowPreviewPackages, TogglePreviewPackages);
  93. //menu.AddItem(new GUIContent("Reset to defaults"), false, ResetToDefaultsClick);
  94. var menuPosition = new Vector2(AdvancedButton.layout.xMax + 30, AdvancedButton.layout.center.y);
  95. menuPosition = this.LocalToWorld(menuPosition);
  96. var menuRect = new Rect(menuPosition, Vector2.zero);
  97. menu.DropDown(menuRect);
  98. }
  99. private static void TogglePreviewPackages()
  100. {
  101. var showPreviewPackages = PackageManagerPrefs.ShowPreviewPackages;
  102. if (!showPreviewPackages && PackageManagerPrefs.ShowPreviewPackagesWarning)
  103. {
  104. 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?";
  105. if (!EditorUtility.DisplayDialog("Unity Package Manager", message, "Yes", "No"))
  106. return;
  107. PackageManagerPrefs.ShowPreviewPackagesWarning = false;
  108. }
  109. PackageManagerPrefs.ShowPreviewPackages = !showPreviewPackages;
  110. PackageCollection.Instance.UpdatePackageCollection(true);
  111. }
  112. private void ResetToDefaultsClick()
  113. {
  114. if (!EditorUtility.DisplayDialog("Unity Package Manager", "Operation will reset all your packages to Editor defaults. Do you want to continue?", "Yes", "No"))
  115. return;
  116. // Registered on callback
  117. AssemblyReloadEvents.beforeAssemblyReload += PackageManagerWindow.ShowPackageManagerWindow;
  118. Client.ResetToEditorDefaults();
  119. var windows = UnityEngine.Resources.FindObjectsOfTypeAll<PackageManagerWindow>();
  120. if (windows.Length > 0)
  121. {
  122. windows[0].Close();
  123. }
  124. }
  125. private void OnEnterPanel(AttachToPanelEvent evt)
  126. {
  127. FilterButton.RegisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
  128. AdvancedButton.RegisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
  129. }
  130. private void OnLeavePanel(DetachFromPanelEvent evt)
  131. {
  132. FilterButton.UnregisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
  133. AdvancedButton.UnregisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
  134. }
  135. private Label FilterButton { get { return root.Q<Label>("toolbarFilterButton"); } }
  136. private Label AdvancedButton { get { return root.Q<Label>("toolbarAdvancedButton"); } }
  137. internal PackageSearchToolbar SearchToolbar { get { return root.Q<PackageSearchToolbar>("toolbarSearch"); } }
  138. }
  139. }