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.

152 lines
5.2 KiB

  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Experimental.UIElements;
  4. namespace UnityEditor.PackageManager.UI
  5. {
  6. #if !UNITY_2018_3_OR_NEWER
  7. internal class PackageSearchToolbarFactory : UxmlFactory<PackageSearchToolbar>
  8. {
  9. protected override PackageSearchToolbar DoCreate(IUxmlAttributes bag, CreationContext cc)
  10. {
  11. return new PackageSearchToolbar();
  12. }
  13. }
  14. #endif
  15. internal class PackageSearchToolbar : VisualElement
  16. {
  17. #if UNITY_2018_3_OR_NEWER
  18. internal new class UxmlFactory : UxmlFactory<PackageSearchToolbar> { }
  19. #endif
  20. private const string kPlaceHolder = "Search by package name, verified, preview or version number...";
  21. public event Action OnFocusChange = delegate { };
  22. public event Action<string> OnSearchChange = delegate { };
  23. private string searchText;
  24. private bool showingPlaceHolder;
  25. private readonly VisualElement root;
  26. public PackageSearchToolbar()
  27. {
  28. root = Resources.GetTemplate("PackageSearchToolbar.uxml");
  29. Add(root);
  30. root.StretchToParentSize();
  31. SearchTextField.value = searchText;
  32. SearchTextField.maxLength = 54;
  33. SearchCancelButton.clickable.clicked += SearchCancelButtonClick;
  34. RegisterCallback<AttachToPanelEvent>(OnEnterPanel);
  35. RegisterCallback<DetachFromPanelEvent>(OnLeavePanel);
  36. searchText = PackageSearchFilter.Instance.SearchText;
  37. if (string.IsNullOrEmpty(searchText))
  38. {
  39. showingPlaceHolder = true;
  40. SearchTextField.value = kPlaceHolder;
  41. SearchTextField.AddToClassList("placeholder");
  42. }
  43. else
  44. {
  45. showingPlaceHolder = false;
  46. SearchTextField.value = searchText;
  47. SearchTextField.RemoveFromClassList("placeholder");
  48. }
  49. }
  50. public void GrabFocus()
  51. {
  52. SearchTextField.Focus();
  53. }
  54. public new void SetEnabled(bool enable)
  55. {
  56. base.SetEnabled(enable);
  57. SearchTextField.SetEnabled(enable);
  58. SearchCancelButton.SetEnabled(enable);
  59. }
  60. private void OnSearchTextFieldChange(ChangeEvent<string> evt)
  61. {
  62. if (showingPlaceHolder && evt.newValue == kPlaceHolder)
  63. return;
  64. if (!string.IsNullOrEmpty(evt.newValue))
  65. SearchCancelButton.AddToClassList("on");
  66. else
  67. SearchCancelButton.RemoveFromClassList("on");
  68. searchText = evt.newValue;
  69. OnSearchChange(searchText);
  70. }
  71. private void OnSearchTextFieldFocus(FocusEvent evt)
  72. {
  73. if (showingPlaceHolder)
  74. {
  75. SearchTextField.value = string.Empty;
  76. SearchTextField.RemoveFromClassList("placeholder");
  77. showingPlaceHolder = false;
  78. }
  79. }
  80. private void OnSearchTextFieldFocusOut(FocusOutEvent evt)
  81. {
  82. if (string.IsNullOrEmpty(searchText))
  83. {
  84. showingPlaceHolder = true;
  85. SearchTextField.AddToClassList("placeholder");
  86. SearchTextField.value = kPlaceHolder;
  87. }
  88. }
  89. private void SearchCancelButtonClick()
  90. {
  91. if (!string.IsNullOrEmpty(SearchTextField.value))
  92. {
  93. SearchTextField.value = string.Empty;
  94. }
  95. showingPlaceHolder = true;
  96. SearchTextField.AddToClassList("placeholder");
  97. SearchTextField.value = kPlaceHolder;
  98. }
  99. private void OnEnterPanel(AttachToPanelEvent evt)
  100. {
  101. SearchTextField.RegisterCallback<FocusEvent>(OnSearchTextFieldFocus);
  102. SearchTextField.RegisterCallback<FocusOutEvent>(OnSearchTextFieldFocusOut);
  103. SearchTextField.RegisterCallback<ChangeEvent<string>>(OnSearchTextFieldChange);
  104. SearchTextField.RegisterCallback<KeyDownEvent>(OnKeyDownShortcut);
  105. }
  106. private void OnLeavePanel(DetachFromPanelEvent evt)
  107. {
  108. SearchTextField.UnregisterCallback<FocusEvent>(OnSearchTextFieldFocus);
  109. SearchTextField.UnregisterCallback<FocusOutEvent>(OnSearchTextFieldFocusOut);
  110. SearchTextField.UnregisterCallback<ChangeEvent<string>>(OnSearchTextFieldChange);
  111. SearchTextField.UnregisterCallback<KeyDownEvent>(OnKeyDownShortcut);
  112. }
  113. private void OnKeyDownShortcut(KeyDownEvent evt)
  114. {
  115. if (evt.keyCode == KeyCode.Escape)
  116. {
  117. SearchCancelButtonClick();
  118. SearchCancelButton.Focus();
  119. evt.StopImmediatePropagation();
  120. return;
  121. }
  122. if (evt.keyCode == KeyCode.Tab)
  123. {
  124. OnFocusChange();
  125. evt.StopImmediatePropagation();
  126. }
  127. }
  128. private TextField SearchTextField { get { return root.Q<TextField>("searchTextField"); } }
  129. private Button SearchCancelButton { get { return root.Q<Button>("searchCancelButton"); } }
  130. }
  131. }