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.
 
 
 
 

134 lines
4.3 KiB

using UnityEngine;
using UnityEngine.Experimental.UIElements;
namespace UnityEditor.PackageManager.UI
{
#if !UNITY_2018_3_OR_NEWER
internal class PackageAddFromUrlFieldFactory : UxmlFactory<PackageAddFromUrlField>
{
protected override PackageAddFromUrlField DoCreate(IUxmlAttributes bag, CreationContext cc)
{
return new PackageAddFromUrlField();
}
}
#endif
internal class PackageAddFromUrlField : VisualElement
{
#if UNITY_2018_3_OR_NEWER
internal new class UxmlFactory : UxmlFactory<PackageAddFromUrlField> { }
#endif
private string urlText;
private readonly VisualElement root;
public PackageAddFromUrlField()
{
root = Resources.GetTemplate("PackageAddFromUrlField.uxml");
Add(root);
UrlTextField.value = urlText;
AddButton.SetEnabled(!string.IsNullOrEmpty(urlText));
AddButton.clickable.clicked += OnAddButtonClick;
RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
}
private void OnUrlTextFieldChange(ChangeEvent<string> evt)
{
urlText = evt.newValue;
AddButton.SetEnabled(!string.IsNullOrEmpty(urlText));
}
private void OnUrlTextFieldFocus(FocusEvent evt)
{
Show();
}
private void OnUrlTextFieldFocusOut(FocusOutEvent evt)
{
Hide();
}
private void OnContainerFocus(FocusEvent evt)
{
UrlTextField.Focus();
}
private void OnContainerFocusOut(FocusOutEvent evt)
{
Hide();
}
private void OnEnterPanel(AttachToPanelEvent evt)
{
AddFromUrlFieldContainer.RegisterCallback<FocusEvent>(OnContainerFocus);
AddFromUrlFieldContainer.RegisterCallback<FocusOutEvent>(OnContainerFocusOut);
UrlTextField.RegisterCallback<FocusEvent>(OnUrlTextFieldFocus);
UrlTextField.RegisterCallback<FocusOutEvent>(OnUrlTextFieldFocusOut);
UrlTextField.RegisterCallback<ChangeEvent<string>>(OnUrlTextFieldChange);
UrlTextField.RegisterCallback<KeyDownEvent>(OnKeyDownShortcut);
Hide();
}
private void OnLeavePanel(DetachFromPanelEvent evt)
{
AddFromUrlFieldContainer.UnregisterCallback<FocusEvent>(OnContainerFocus);
AddFromUrlFieldContainer.UnregisterCallback<FocusOutEvent>(OnContainerFocusOut);
UrlTextField.UnregisterCallback<FocusEvent>(OnUrlTextFieldFocus);
UrlTextField.UnregisterCallback<FocusOutEvent>(OnUrlTextFieldFocusOut);
UrlTextField.UnregisterCallback<ChangeEvent<string>>(OnUrlTextFieldChange);
UrlTextField.UnregisterCallback<KeyDownEvent>(OnKeyDownShortcut);
}
private void OnKeyDownShortcut(KeyDownEvent evt)
{
switch (evt.keyCode)
{
case KeyCode.Escape:
Hide();
break;
case KeyCode.Return:
case KeyCode.KeypadEnter:
OnAddButtonClick();
break;
}
}
private void OnAddButtonClick()
{
var path = urlText;
if (!string.IsNullOrEmpty(path) && !Package.AddRemoveOperationInProgress)
{
Package.AddFromLocalDisk(path);
Hide();
}
}
internal void Hide()
{
UIUtils.SetElementDisplay(this, false);
}
internal void Show(bool reset = false)
{
if (reset)
Reset();
UIUtils.SetElementDisplay(this, true);
}
private void Reset()
{
UrlTextField.value = string.Empty;
urlText = string.Empty;
AddButton.SetEnabled(false);
UrlTextField.Focus();
}
private VisualElement AddFromUrlFieldContainer { get { return root.Q<VisualElement>("addFromUrlFieldContainer"); }}
private TextField UrlTextField { get { return root.Q<TextField>("urlTextField"); } }
private Button AddButton{ get { return root.Q<Button>("addFromUrlButton"); }}
}
}