private void CreateSearchTree() { List <SearchTreeEntry> tree = provider.CreateSearchTree(m_Context); if (tree != null) { m_Tree = tree.ToArray(); } else { m_Tree = new SearchTreeEntry[0]; } // Rebuild stack if (m_SelectionStack.Count == 0) { m_SelectionStack.Add(m_Tree[0] as SearchTreeGroupEntry); } else { // The root is always the match for level 0 SearchTreeGroupEntry match = m_Tree[0] as SearchTreeGroupEntry; int level = 0; while (true) { // Assign the match for the current level SearchTreeGroupEntry oldSearchTreeEntry = m_SelectionStack[level]; m_SelectionStack[level] = match; m_SelectionStack[level].selectedIndex = oldSearchTreeEntry.selectedIndex; m_SelectionStack[level].scroll = oldSearchTreeEntry.scroll; // See if we reached last SearchTreeEntry of stack level++; if (level == m_SelectionStack.Count) { break; } // Try to find a child of the same name as we had before List <SearchTreeEntry> children = GetChildren(activeTree, match); SearchTreeEntry childMatch = children.FirstOrDefault(c => c.name == m_SelectionStack[level].name); if (childMatch != null && childMatch is SearchTreeGroupEntry) { match = childMatch as SearchTreeGroupEntry; } else { // If we couldn't find the child, remove all further SearchTreeEntrys from the stack m_SelectionStack.RemoveRange(level, m_SelectionStack.Count - level); } } } s_DirtyList = false; RebuildSearch(); }
private void CreateSearchTree() { List <SearchTreeEntry> list = this.provider.CreateSearchTree(this.m_Context); if (list != null) { this.m_Tree = list.ToArray(); } else { this.m_Tree = new SearchTreeEntry[0]; } if (this.m_SelectionStack.Count == 0) { this.m_SelectionStack.Add(this.m_Tree[0] as SearchTreeGroupEntry); } else { SearchTreeGroupEntry searchTreeGroupEntry = this.m_Tree[0] as SearchTreeGroupEntry; int level = 0; while (true) { SearchTreeGroupEntry searchTreeGroupEntry2 = this.m_SelectionStack[level]; this.m_SelectionStack[level] = searchTreeGroupEntry; this.m_SelectionStack[level].selectedIndex = searchTreeGroupEntry2.selectedIndex; this.m_SelectionStack[level].scroll = searchTreeGroupEntry2.scroll; level++; if (level == this.m_SelectionStack.Count) { break; } List <SearchTreeEntry> children = this.GetChildren(this.activeTree, searchTreeGroupEntry); SearchTreeEntry searchTreeEntry = children.FirstOrDefault((SearchTreeEntry c) => c.name == this.m_SelectionStack[level].name); if (searchTreeEntry != null && searchTreeEntry is SearchTreeGroupEntry) { searchTreeGroupEntry = (searchTreeEntry as SearchTreeGroupEntry); } else { this.m_SelectionStack.RemoveRange(level, this.m_SelectionStack.Count - level); } } } SearchWindow.s_DirtyList = false; this.RebuildSearch(); }
private List <SearchTreeEntry> GetChildren(SearchTreeEntry[] tree, SearchTreeEntry parent) { List <SearchTreeEntry> list = new List <SearchTreeEntry>(); int num = -1; int i; for (i = 0; i < tree.Length; i++) { if (tree[i] == parent) { num = parent.level + 1; i++; break; } } List <SearchTreeEntry> result; if (num == -1) { result = list; } else { while (i < tree.Length) { SearchTreeEntry searchTreeEntry = tree[i]; if (searchTreeEntry.level < num) { break; } if (searchTreeEntry.level <= num || this.hasSearch) { list.Add(searchTreeEntry); } i++; } result = list; } return(result); }
private List <SearchTreeEntry> GetChildren(SearchTreeEntry[] tree, SearchTreeEntry parent) { List <SearchTreeEntry> children = new List <SearchTreeEntry>(); int level = -1; int i = 0; for (i = 0; i < tree.Length; i++) { if (tree[i] == parent) { level = parent.level + 1; i++; break; } } if (level == -1) { return(children); } for (; i < tree.Length; i++) { SearchTreeEntry e = tree[i]; if (e.level < level) { break; } if (e.level > level && !hasSearch) { continue; } children.Add(e); } return(children); }
private void SelectEntry(SearchTreeEntry e, bool shouldInvokeCallback) { if (e is SearchTreeGroupEntry) { if (!hasSearch) { m_LastTime = System.DateTime.Now.Ticks; if (m_AnimTarget == 0) { m_AnimTarget = 1; } else if (m_Anim == 1) { m_Anim = 0; m_SelectionStack.Add(e as SearchTreeGroupEntry); } } } else if (shouldInvokeCallback && provider.OnSelectEntry(e, m_Context)) { Close(); } }
private void SelectEntry(SearchTreeEntry e, bool shouldInvokeCallback) { if (e is SearchTreeGroupEntry) { if (!this.hasSearch) { this.m_LastTime = DateTime.Now.Ticks; if (this.m_AnimTarget == 0) { this.m_AnimTarget = 1; } else if (this.m_Anim == 1f) { this.m_Anim = 0f; this.m_SelectionStack.Add(e as SearchTreeGroupEntry); } } } else if (shouldInvokeCallback && this.provider.OnSelectEntry(e, this.m_Context)) { base.Close(); } }
private void ListGUI(SearchTreeEntry[] tree, SearchTreeGroupEntry parent) { // Start of scroll view list parent.scroll = GUILayout.BeginScrollView(parent.scroll); EditorGUIUtility.SetIconSize(new Vector2(16, 16)); List <SearchTreeEntry> children = GetChildren(tree, parent); Rect selectedRect = new Rect(); // Iterate through the children for (int i = 0; i < children.Count; i++) { SearchTreeEntry e = children[i]; Rect r = GUILayoutUtility.GetRect(16, 20, GUILayout.ExpandWidth(true)); // Select the SearchTreeEntry the mouse cursor is over. // Only do it on mouse move - keyboard controls are allowed to overwrite this until the next time the mouse moves. if (Event.current.type == EventType.MouseMove || Event.current.type == EventType.MouseDown) { if (parent.selectedIndex != i && r.Contains(Event.current.mousePosition)) { parent.selectedIndex = i; Repaint(); } } bool selected = false; // Handle selected item if (i == parent.selectedIndex) { selected = true; selectedRect = r; } // Draw SearchTreeEntry if (Event.current.type == EventType.Repaint) { GUIStyle labelStyle = (e is SearchTreeGroupEntry) ? s_Styles.groupButton : s_Styles.componentButton; labelStyle.Draw(r, e.content, false, false, selected, selected); if ((e is SearchTreeGroupEntry)) { Rect arrowRect = new Rect(r.x + r.width - 13, r.y + 4, 13, 13); s_Styles.rightArrow.Draw(arrowRect, false, false, false, false); } } if (Event.current.type == EventType.MouseDown && r.Contains(Event.current.mousePosition)) { Event.current.Use(); parent.selectedIndex = i; SelectEntry(e, true); } } EditorGUIUtility.SetIconSize(Vector2.zero); GUILayout.EndScrollView(); // Scroll to show selected if (m_ScrollToSelected && Event.current.type == EventType.Repaint) { m_ScrollToSelected = false; Rect scrollRect = GUILayoutUtility.GetLastRect(); if (selectedRect.yMax - scrollRect.height > parent.scroll.y) { parent.scroll.y = selectedRect.yMax - scrollRect.height; Repaint(); } if (selectedRect.y < parent.scroll.y) { parent.scroll.y = selectedRect.y; Repaint(); } } }
private void ListGUI(SearchTreeEntry[] tree, SearchTreeGroupEntry parent) { parent.scroll = GUILayout.BeginScrollView(parent.scroll, new GUILayoutOption[0]); EditorGUIUtility.SetIconSize(new Vector2(16f, 16f)); List <SearchTreeEntry> children = this.GetChildren(tree, parent); Rect rect = default(Rect); for (int i = 0; i < children.Count; i++) { SearchTreeEntry searchTreeEntry = children[i]; Rect rect2 = GUILayoutUtility.GetRect(16f, 20f, new GUILayoutOption[] { GUILayout.ExpandWidth(true) }); if (Event.current.type == EventType.MouseMove || Event.current.type == EventType.MouseDown) { if (parent.selectedIndex != i && rect2.Contains(Event.current.mousePosition)) { parent.selectedIndex = i; base.Repaint(); } } bool flag = false; if (i == parent.selectedIndex) { flag = true; rect = rect2; } if (Event.current.type == EventType.Repaint) { GUIStyle gUIStyle = (!(searchTreeEntry is SearchTreeGroupEntry)) ? SearchWindow.s_Styles.componentButton : SearchWindow.s_Styles.groupButton; gUIStyle.Draw(rect2, searchTreeEntry.content, false, false, flag, flag); if (searchTreeEntry is SearchTreeGroupEntry) { Rect position = new Rect(rect2.x + rect2.width - 13f, rect2.y + 4f, 13f, 13f); SearchWindow.s_Styles.rightArrow.Draw(position, false, false, false, false); } } if (Event.current.type == EventType.MouseDown && rect2.Contains(Event.current.mousePosition)) { Event.current.Use(); parent.selectedIndex = i; this.SelectEntry(searchTreeEntry, true); } } EditorGUIUtility.SetIconSize(Vector2.zero); GUILayout.EndScrollView(); if (this.m_ScrollToSelected && Event.current.type == EventType.Repaint) { this.m_ScrollToSelected = false; Rect lastRect = GUILayoutUtility.GetLastRect(); if (rect.yMax - lastRect.height > parent.scroll.y) { parent.scroll.y = rect.yMax - lastRect.height; base.Repaint(); } if (rect.y < parent.scroll.y) { parent.scroll.y = rect.y; base.Repaint(); } } }
private void RebuildSearch() { if (!this.hasSearch) { this.m_SearchResultTree = null; if (this.m_SelectionStack[this.m_SelectionStack.Count - 1].name == "Search") { this.m_SelectionStack.Clear(); this.m_SelectionStack.Add(this.m_Tree[0] as SearchTreeGroupEntry); } this.m_AnimTarget = 1; this.m_LastTime = DateTime.Now.Ticks; } else { string[] array = this.m_Search.ToLower().Split(new char[] { ' ' }); List <SearchTreeEntry> list = new List <SearchTreeEntry>(); List <SearchTreeEntry> list2 = new List <SearchTreeEntry>(); SearchTreeEntry[] tree = this.m_Tree; for (int i = 0; i < tree.Length; i++) { SearchTreeEntry searchTreeEntry = tree[i]; if (!(searchTreeEntry is SearchTreeGroupEntry)) { string text = searchTreeEntry.name.ToLower().Replace(" ", ""); bool flag = true; bool flag2 = false; for (int j = 0; j < array.Length; j++) { string value = array[j]; if (!text.Contains(value)) { flag = false; break; } if (j == 0 && text.StartsWith(value)) { flag2 = true; } } if (flag) { if (flag2) { list.Add(searchTreeEntry); } else { list2.Add(searchTreeEntry); } } } } list.Sort(); list2.Sort(); List <SearchTreeEntry> list3 = new List <SearchTreeEntry>(); list3.Add(new SearchTreeGroupEntry(new GUIContent("Search"), 0)); list3.AddRange(list); list3.AddRange(list2); this.m_SearchResultTree = list3.ToArray(); this.m_SelectionStack.Clear(); this.m_SelectionStack.Add(this.m_SearchResultTree[0] as SearchTreeGroupEntry); if (this.GetChildren(this.activeTree, this.activeParent).Count >= 1) { this.activeParent.selectedIndex = 0; } else { this.activeParent.selectedIndex = -1; } } }