Game/Library/PackageCache/com.unity.package-manager-ui@2.0.13/Editor/Sources/UI/PackageManagerToolbar.cs
2021-01-16 18:29:12 +01:00

177 lines
6.8 KiB
C#

using System.Linq;
using UnityEngine;
using UnityEngine.Experimental.UIElements;
namespace UnityEditor.PackageManager.UI
{
#if !UNITY_2018_3_OR_NEWER
internal class PackageManangerToolbarFactory : UxmlFactory<PackageManagerToolbar>
{
protected override PackageManagerToolbar DoCreate(IUxmlAttributes bag, CreationContext cc)
{
return new PackageManagerToolbar();
}
}
#endif
internal class PackageManagerToolbar : VisualElement
{
#if UNITY_2018_3_OR_NEWER
internal new class UxmlFactory : UxmlFactory<PackageManagerToolbar> {}
#endif
private readonly VisualElement root;
[SerializeField]
private PackageFilter selectedFilter = PackageFilter.Unity;
public PackageManagerToolbar()
{
root = Resources.GetTemplate("PackageManagerToolbar.uxml");
Add(root);
root.StretchToParentSize();
SetFilter(PackageCollection.Instance.Filter);
OnFilterChanged(PackageCollection.Instance.Filter);
RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
PackageCollection.Instance.OnFilterChanged += OnFilterChanged;
}
private void OnFilterChanged(PackageFilter filter)
{
selectedFilter = filter;
FilterButton.text = string.Format("{0} ▾", GetFilterDisplayName(selectedFilter));
}
public void GrabFocus()
{
SearchToolbar.GrabFocus();
}
public new void SetEnabled(bool enable)
{
base.SetEnabled(enable);
FilterButton.SetEnabled(enable);
AdvancedButton.SetEnabled(enable);
SearchToolbar.SetEnabled(enable);
}
private static string GetFilterDisplayName(PackageFilter filter)
{
switch (filter)
{
case PackageFilter.Unity:
return "Unity Registry";
case PackageFilter.Other:
return "My Registries";
case PackageFilter.Local:
return "In Project";
case PackageFilter.Modules:
return "Built-in";
case PackageFilter.None:
return "None";
default:
return filter.ToString();
}
}
private void SetFilter(object obj)
{
PackageCollection.Instance.SetFilter((PackageFilter)obj);
}
private void OnFilterButtonMouseDown(MouseDownEvent evt)
{
if (evt.propagationPhase != PropagationPhase.AtTarget)
return;
var menu = new GenericMenu();
menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Unity)),
selectedFilter == PackageFilter.Unity,
SetFilter, PackageFilter.Unity);
if (PackageCollection.Instance.LatestSearchOtherPackages.Any(p => !p.IsLocal && !p.IsInDevelopment))
menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Other)),
selectedFilter == PackageFilter.Other,
SetFilter, PackageFilter.Other);
menu.AddSeparator("");
menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Local)),
selectedFilter == PackageFilter.Local,
SetFilter, PackageFilter.Local);
menu.AddItem(new GUIContent(GetFilterDisplayName(PackageFilter.Modules)),
selectedFilter == PackageFilter.Modules,
SetFilter, PackageFilter.Modules);
var menuPosition = new Vector2(FilterButton.layout.xMin, FilterButton.layout.center.y);
menuPosition = this.LocalToWorld(menuPosition);
var menuRect = new Rect(menuPosition, Vector2.zero);
menu.DropDown(menuRect);
}
private void OnAdvancedButtonMouseDown(MouseDownEvent evt)
{
if (evt.propagationPhase != PropagationPhase.AtTarget)
return;
var menu = new GenericMenu();
menu.AddItem(new GUIContent("Show preview packages"), PackageManagerPrefs.ShowPreviewPackages, TogglePreviewPackages);
//menu.AddItem(new GUIContent("Reset to defaults"), false, ResetToDefaultsClick);
var menuPosition = new Vector2(AdvancedButton.layout.xMax + 30, AdvancedButton.layout.center.y);
menuPosition = this.LocalToWorld(menuPosition);
var menuRect = new Rect(menuPosition, Vector2.zero);
menu.DropDown(menuRect);
}
private static void TogglePreviewPackages()
{
var showPreviewPackages = PackageManagerPrefs.ShowPreviewPackages;
if (!showPreviewPackages && PackageManagerPrefs.ShowPreviewPackagesWarning)
{
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?";
if (!EditorUtility.DisplayDialog("Unity Package Manager", message, "Yes", "No"))
return;
PackageManagerPrefs.ShowPreviewPackagesWarning = false;
}
PackageManagerPrefs.ShowPreviewPackages = !showPreviewPackages;
PackageCollection.Instance.UpdatePackageCollection(true);
}
private void ResetToDefaultsClick()
{
if (!EditorUtility.DisplayDialog("Unity Package Manager", "Operation will reset all your packages to Editor defaults. Do you want to continue?", "Yes", "No"))
return;
// Registered on callback
AssemblyReloadEvents.beforeAssemblyReload += PackageManagerWindow.ShowPackageManagerWindow;
Client.ResetToEditorDefaults();
var windows = UnityEngine.Resources.FindObjectsOfTypeAll<PackageManagerWindow>();
if (windows.Length > 0)
{
windows[0].Close();
}
}
private void OnEnterPanel(AttachToPanelEvent evt)
{
FilterButton.RegisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
AdvancedButton.RegisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
}
private void OnLeavePanel(DetachFromPanelEvent evt)
{
FilterButton.UnregisterCallback<MouseDownEvent>(OnFilterButtonMouseDown);
AdvancedButton.UnregisterCallback<MouseDownEvent>(OnAdvancedButtonMouseDown);
}
private Label FilterButton { get { return root.Q<Label>("toolbarFilterButton"); } }
private Label AdvancedButton { get { return root.Q<Label>("toolbarAdvancedButton"); } }
internal PackageSearchToolbar SearchToolbar { get { return root.Q<PackageSearchToolbar>("toolbarSearch"); } }
}
}