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.

133 lines
4.3 KiB

  1. using UnityEngine;
  2. using UnityEngine.Experimental.UIElements;
  3. namespace UnityEditor.PackageManager.UI
  4. {
  5. #if !UNITY_2018_3_OR_NEWER
  6. internal class PackageAddFromUrlFieldFactory : UxmlFactory<PackageAddFromUrlField>
  7. {
  8. protected override PackageAddFromUrlField DoCreate(IUxmlAttributes bag, CreationContext cc)
  9. {
  10. return new PackageAddFromUrlField();
  11. }
  12. }
  13. #endif
  14. internal class PackageAddFromUrlField : VisualElement
  15. {
  16. #if UNITY_2018_3_OR_NEWER
  17. internal new class UxmlFactory : UxmlFactory<PackageAddFromUrlField> { }
  18. #endif
  19. private string urlText;
  20. private readonly VisualElement root;
  21. public PackageAddFromUrlField()
  22. {
  23. root = Resources.GetTemplate("PackageAddFromUrlField.uxml");
  24. Add(root);
  25. UrlTextField.value = urlText;
  26. AddButton.SetEnabled(!string.IsNullOrEmpty(urlText));
  27. AddButton.clickable.clicked += OnAddButtonClick;
  28. RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
  29. RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
  30. }
  31. private void OnUrlTextFieldChange(ChangeEvent<string> evt)
  32. {
  33. urlText = evt.newValue;
  34. AddButton.SetEnabled(!string.IsNullOrEmpty(urlText));
  35. }
  36. private void OnUrlTextFieldFocus(FocusEvent evt)
  37. {
  38. Show();
  39. }
  40. private void OnUrlTextFieldFocusOut(FocusOutEvent evt)
  41. {
  42. Hide();
  43. }
  44. private void OnContainerFocus(FocusEvent evt)
  45. {
  46. UrlTextField.Focus();
  47. }
  48. private void OnContainerFocusOut(FocusOutEvent evt)
  49. {
  50. Hide();
  51. }
  52. private void OnEnterPanel(AttachToPanelEvent evt)
  53. {
  54. AddFromUrlFieldContainer.RegisterCallback<FocusEvent>(OnContainerFocus);
  55. AddFromUrlFieldContainer.RegisterCallback<FocusOutEvent>(OnContainerFocusOut);
  56. UrlTextField.RegisterCallback<FocusEvent>(OnUrlTextFieldFocus);
  57. UrlTextField.RegisterCallback<FocusOutEvent>(OnUrlTextFieldFocusOut);
  58. UrlTextField.RegisterCallback<ChangeEvent<string>>(OnUrlTextFieldChange);
  59. UrlTextField.RegisterCallback<KeyDownEvent>(OnKeyDownShortcut);
  60. Hide();
  61. }
  62. private void OnLeavePanel(DetachFromPanelEvent evt)
  63. {
  64. AddFromUrlFieldContainer.UnregisterCallback<FocusEvent>(OnContainerFocus);
  65. AddFromUrlFieldContainer.UnregisterCallback<FocusOutEvent>(OnContainerFocusOut);
  66. UrlTextField.UnregisterCallback<FocusEvent>(OnUrlTextFieldFocus);
  67. UrlTextField.UnregisterCallback<FocusOutEvent>(OnUrlTextFieldFocusOut);
  68. UrlTextField.UnregisterCallback<ChangeEvent<string>>(OnUrlTextFieldChange);
  69. UrlTextField.UnregisterCallback<KeyDownEvent>(OnKeyDownShortcut);
  70. }
  71. private void OnKeyDownShortcut(KeyDownEvent evt)
  72. {
  73. switch (evt.keyCode)
  74. {
  75. case KeyCode.Escape:
  76. Hide();
  77. break;
  78. case KeyCode.Return:
  79. case KeyCode.KeypadEnter:
  80. OnAddButtonClick();
  81. break;
  82. }
  83. }
  84. private void OnAddButtonClick()
  85. {
  86. var path = urlText;
  87. if (!string.IsNullOrEmpty(path) && !Package.AddRemoveOperationInProgress)
  88. {
  89. Package.AddFromLocalDisk(path);
  90. Hide();
  91. }
  92. }
  93. internal void Hide()
  94. {
  95. UIUtils.SetElementDisplay(this, false);
  96. }
  97. internal void Show(bool reset = false)
  98. {
  99. if (reset)
  100. Reset();
  101. UIUtils.SetElementDisplay(this, true);
  102. }
  103. private void Reset()
  104. {
  105. UrlTextField.value = string.Empty;
  106. urlText = string.Empty;
  107. AddButton.SetEnabled(false);
  108. UrlTextField.Focus();
  109. }
  110. private VisualElement AddFromUrlFieldContainer { get { return root.Q<VisualElement>("addFromUrlFieldContainer"); }}
  111. private TextField UrlTextField { get { return root.Q<TextField>("urlTextField"); } }
  112. private Button AddButton{ get { return root.Q<Button>("addFromUrlButton"); }}
  113. }
  114. }