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

153 lines
5.2 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Experimental.UIElements;
namespace UnityEditor.PackageManager.UI
{
#if !UNITY_2018_3_OR_NEWER
internal class PackageSearchToolbarFactory : UxmlFactory<PackageSearchToolbar>
{
protected override PackageSearchToolbar DoCreate(IUxmlAttributes bag, CreationContext cc)
{
return new PackageSearchToolbar();
}
}
#endif
internal class PackageSearchToolbar : VisualElement
{
#if UNITY_2018_3_OR_NEWER
internal new class UxmlFactory : UxmlFactory<PackageSearchToolbar> { }
#endif
private const string kPlaceHolder = "Search by package name, verified, preview or version number...";
public event Action OnFocusChange = delegate { };
public event Action<string> OnSearchChange = delegate { };
private string searchText;
private bool showingPlaceHolder;
private readonly VisualElement root;
public PackageSearchToolbar()
{
root = Resources.GetTemplate("PackageSearchToolbar.uxml");
Add(root);
root.StretchToParentSize();
SearchTextField.value = searchText;
SearchTextField.maxLength = 54;
SearchCancelButton.clickable.clicked += SearchCancelButtonClick;
RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
searchText = PackageSearchFilter.Instance.SearchText;
if (string.IsNullOrEmpty(searchText))
{
showingPlaceHolder = true;
SearchTextField.value = kPlaceHolder;
SearchTextField.AddToClassList("placeholder");
}
else
{
showingPlaceHolder = false;
SearchTextField.value = searchText;
SearchTextField.RemoveFromClassList("placeholder");
}
}
public void GrabFocus()
{
SearchTextField.Focus();
}
public new void SetEnabled(bool enable)
{
base.SetEnabled(enable);
SearchTextField.SetEnabled(enable);
SearchCancelButton.SetEnabled(enable);
}
private void OnSearchTextFieldChange(ChangeEvent<string> evt)
{
if (showingPlaceHolder && evt.newValue == kPlaceHolder)
return;
if (!string.IsNullOrEmpty(evt.newValue))
SearchCancelButton.AddToClassList("on");
else
SearchCancelButton.RemoveFromClassList("on");
searchText = evt.newValue;
OnSearchChange(searchText);
}
private void OnSearchTextFieldFocus(FocusEvent evt)
{
if (showingPlaceHolder)
{
SearchTextField.value = string.Empty;
SearchTextField.RemoveFromClassList("placeholder");
showingPlaceHolder = false;
}
}
private void OnSearchTextFieldFocusOut(FocusOutEvent evt)
{
if (string.IsNullOrEmpty(searchText))
{
showingPlaceHolder = true;
SearchTextField.AddToClassList("placeholder");
SearchTextField.value = kPlaceHolder;
}
}
private void SearchCancelButtonClick()
{
if (!string.IsNullOrEmpty(SearchTextField.value))
{
SearchTextField.value = string.Empty;
}
showingPlaceHolder = true;
SearchTextField.AddToClassList("placeholder");
SearchTextField.value = kPlaceHolder;
}
private void OnEnterPanel(AttachToPanelEvent evt)
{
SearchTextField.RegisterCallback<FocusEvent>(OnSearchTextFieldFocus);
SearchTextField.RegisterCallback<FocusOutEvent>(OnSearchTextFieldFocusOut);
SearchTextField.RegisterCallback<ChangeEvent<string>>(OnSearchTextFieldChange);
SearchTextField.RegisterCallback<KeyDownEvent>(OnKeyDownShortcut);
}
private void OnLeavePanel(DetachFromPanelEvent evt)
{
SearchTextField.UnregisterCallback<FocusEvent>(OnSearchTextFieldFocus);
SearchTextField.UnregisterCallback<FocusOutEvent>(OnSearchTextFieldFocusOut);
SearchTextField.UnregisterCallback<ChangeEvent<string>>(OnSearchTextFieldChange);
SearchTextField.UnregisterCallback<KeyDownEvent>(OnKeyDownShortcut);
}
private void OnKeyDownShortcut(KeyDownEvent evt)
{
if (evt.keyCode == KeyCode.Escape)
{
SearchCancelButtonClick();
SearchCancelButton.Focus();
evt.StopImmediatePropagation();
return;
}
if (evt.keyCode == KeyCode.Tab)
{
OnFocusChange();
evt.StopImmediatePropagation();
}
}
private TextField SearchTextField { get { return root.Q<TextField>("searchTextField"); } }
private Button SearchCancelButton { get { return root.Q<Button>("searchCancelButton"); } }
}
}