public EntityHierarchy(EntityHierarchyFoldingState entityHierarchyFoldingState) { m_EntityHierarchyFoldingState = entityHierarchyFoldingState; style.flexGrow = 1.0f; m_ViewContainer = new VisualElement(); m_ViewContainer.style.flexGrow = 1.0f; m_ViewContainer.RegisterCallback <PointerDownEvent>(evt => { if (evt.button == (int)MouseButton.LeftMouse) { Selection.activeObject = null; } }); m_TreeView = new TreeView(m_TreeViewRootItems, Constants.ListView.ItemHeight, MakeTreeViewItem, ReleaseTreeViewItem, BindTreeViewItem) { selectionType = SelectionType.Single, name = Constants.EntityHierarchy.FullViewName, style = { flexGrow = 1 }, }; m_TreeView.onSelectionChange += OnLocalSelectionChanged; m_TreeView.ItemExpandedStateChanging += (item, isExpanding) => { var entityHierarchyItem = (EntityHierarchyItem)item; if (entityHierarchyItem.NodeId.Kind == NodeKind.Scene || entityHierarchyItem.NodeId.Kind == NodeKind.SubScene) { m_EntityHierarchyFoldingState.OnFoldingStateChanged(entityHierarchyItem.NodeId, isExpanding); } }; m_TreeView.Hide(); m_ViewContainer.Add(m_TreeView); m_ListView = new ListView(m_ListViewFilteredItems, Constants.ListView.ItemHeight, MakeListViewItem, ReleaseListViewItem, BindListViewItem) { selectionType = SelectionType.Single, name = Constants.EntityHierarchy.SearchViewName, style = { flexGrow = 1 } }; m_ListView.Hide(); m_ViewContainer.Add(m_ListView); m_SearchEmptyMessage = new CenteredMessageElement(); m_SearchEmptyMessage.Hide(); Add(m_SearchEmptyMessage); #if UNITY_2020_1_OR_NEWER m_ListView.onSelectionChange += OnLocalSelectionChanged; #else m_ListView.onSelectionChanged += OnSelectionChanged; #endif m_ItemsCache = new HierarchyItemsCache(); m_CurrentViewMode = ViewMode.Full; Add(m_ViewContainer); Selection.selectionChanged += OnGlobalSelectionChanged; }
void RefreshView() { // This is split in two because RefreshSearchView // can change the current view mode if no result is found. // We need to refresh the data before deciding what to show if (m_CurrentViewMode == ViewMode.Full) { m_TreeView.PrepareItemsToExpand(m_TreeViewItemsToExpand); m_TreeView.Refresh(); } else if (m_CurrentViewMode == ViewMode.Search) { RefreshSearchView(); } switch (m_CurrentViewMode) { case ViewMode.Full: TrySelect(m_SelectedItem); m_SearchEmptyMessage.Hide(); m_ListView.Hide(); m_TreeView.Show(); m_ViewContainer.Show(); break; case ViewMode.Search: TrySelect(m_SelectedItem); m_SearchEmptyMessage.Hide(); m_TreeView.Hide(); m_ListView.Show(); m_ViewContainer.Show(); break; case ViewMode.Message: m_SearchEmptyMessage.Show(); m_TreeView.Hide(); m_ListView.Hide(); m_ViewContainer.Hide(); break; } }
/// <summary> /// Refresh tree view to update with latest information. /// </summary> void Refresh() { // System details need to be updated also. m_SystemDetailsVisualElement.Target = m_LastSelectedItem; m_SystemDetailsVisualElement.SearchFilter = SearchFilter; // Check if there is search result if (!SearchFilter.IsEmpty) { PopulateListViewWithSearchResults(); var hasSearchResult = m_ListViewFilteredItems.Any(); m_SystemListView.ToggleVisibility(hasSearchResult); m_SystemTreeView.Hide(); m_SystemDetailsVisualElement.ToggleVisibility(hasSearchResult); m_SearchEmptyMessage.ToggleVisibility(!hasSearchResult); if (string.IsNullOrEmpty(SearchFilter.ErrorComponentType)) { m_SearchEmptyMessage.Title = k_NoSystemsFoundTitle; m_SearchEmptyMessage.Message = string.Empty; } else { m_SearchEmptyMessage.Title = k_ComponentTypeNotFoundTitle; m_SearchEmptyMessage.Message = string.Format(k_ComponentTypeNotFoundContent, SearchFilter.ErrorComponentType); } // Remove detail section if not in the results. if (Contains(m_SystemDetailsVisualElement) && !m_ListViewFilteredItems.Contains(m_LastSelectedItem)) { Remove(m_SystemDetailsVisualElement); } } else { m_SystemListView.Hide(); m_SystemTreeView.Show(); m_SearchEmptyMessage.Hide(); m_SystemDetailsVisualElement.Show(); } SetSelection(); }