설명 없음
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.

SearcherAdapter.cs 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using JetBrains.Annotations;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.Searcher
  8. {
  9. public enum ItemExpanderState
  10. {
  11. Hidden,
  12. Collapsed,
  13. Expanded
  14. }
  15. [PublicAPI]
  16. public interface ISearcherAdapter
  17. {
  18. VisualElement MakeItem();
  19. VisualElement Bind(VisualElement target, SearcherItem item, ItemExpanderState expanderState, string text);
  20. string Title { get; }
  21. bool HasDetailsPanel { get; }
  22. bool AddAllChildResults { get; }
  23. bool MultiSelectEnabled { get; }
  24. float InitialSplitterDetailRatio { get; }
  25. void OnSelectionChanged(IEnumerable<SearcherItem> items);
  26. SearcherItem OnSearchResultsFilter(IEnumerable<SearcherItem> searchResults, string searchQuery);
  27. void InitDetailsPanel(VisualElement detailsPanel);
  28. }
  29. [PublicAPI]
  30. public class SearcherAdapter : ISearcherAdapter
  31. {
  32. const string k_EntryName = "smartSearchItem";
  33. const int k_IndentDepthFactor = 15;
  34. readonly VisualTreeAsset m_DefaultItemTemplate;
  35. public virtual string Title { get; }
  36. public virtual bool HasDetailsPanel => true;
  37. public virtual bool AddAllChildResults => true;
  38. public virtual bool MultiSelectEnabled => false;
  39. Label m_DetailsLabel;
  40. public virtual float InitialSplitterDetailRatio => 1.0f;
  41. public SearcherAdapter(string title)
  42. {
  43. Title = title;
  44. m_DefaultItemTemplate = Resources.Load<VisualTreeAsset>("SearcherItem");
  45. }
  46. public virtual VisualElement MakeItem()
  47. {
  48. // Create a visual element hierarchy for this search result.
  49. var item = m_DefaultItemTemplate.CloneTree();
  50. return item;
  51. }
  52. public virtual VisualElement Bind(VisualElement element, SearcherItem item, ItemExpanderState expanderState, string query)
  53. {
  54. var indent = element.Q<VisualElement>("itemIndent");
  55. indent.style.width = item.Depth * k_IndentDepthFactor;
  56. var expander = element.Q<VisualElement>("itemChildExpander");
  57. var icon = expander.Query("expanderIcon").First();
  58. icon.ClearClassList();
  59. switch (expanderState)
  60. {
  61. case ItemExpanderState.Expanded:
  62. icon.AddToClassList("Expanded");
  63. break;
  64. case ItemExpanderState.Collapsed:
  65. icon.AddToClassList("Collapsed");
  66. break;
  67. }
  68. var nameLabelsContainer = element.Q<VisualElement>("labelsContainer");
  69. nameLabelsContainer.Clear();
  70. var iconElement = element.Q<VisualElement>("itemIconVisualElement");
  71. iconElement.style.backgroundImage = item.Icon;
  72. if (item.Icon == null && item.CollapseEmptyIcon)
  73. {
  74. iconElement.style.display = DisplayStyle.None;
  75. } else
  76. {
  77. iconElement.style.display = DisplayStyle.Flex;
  78. }
  79. if (string.IsNullOrWhiteSpace(query))
  80. nameLabelsContainer.Add(new Label(item.Name));
  81. else
  82. SearcherHighlighter.HighlightTextBasedOnQuery(nameLabelsContainer, item.Name, query);
  83. element.userData = item;
  84. element.name = k_EntryName;
  85. return expander;
  86. }
  87. public virtual void InitDetailsPanel(VisualElement detailsPanel)
  88. {
  89. m_DetailsLabel = new Label();
  90. detailsPanel.Add(m_DetailsLabel);
  91. }
  92. public virtual void OnSelectionChanged(IEnumerable<SearcherItem> items)
  93. {
  94. if (m_DetailsLabel != null)
  95. {
  96. var itemsList = items.ToList();
  97. m_DetailsLabel.text = itemsList.Any() ? itemsList[0].Help : "No results";
  98. }
  99. }
  100. // How to handle filtering and prioritization of search results is specific to clients of the searcher window
  101. // This callback is meant to be implemented by child classes of SearcherAdapter as they need
  102. public virtual SearcherItem OnSearchResultsFilter(IEnumerable<SearcherItem> searchResults, string searchQuery)
  103. {
  104. return new SearcherItem("");
  105. }
  106. }
  107. }