private void ListGUI(SearchTreeEntry[] tree, float anim, SearchTreeGroupEntry parent, SearchTreeGroupEntry grandParent) { anim = Mathf.Floor(anim) + Mathf.SmoothStep(0f, 1f, Mathf.Repeat(anim, 1f)); Rect position = base.position; position.x = base.position.width * (1f - anim) + 1f; position.y = 30f; position.height -= 30f; position.width -= 2f; GUILayout.BeginArea(position); Rect rect = GUILayoutUtility.GetRect(10f, 25f); string name = parent.name; GUI.Label(rect, name, SearchWindow.s_Styles.header); if (grandParent != null) { Rect position2 = new Rect(rect.x + 4f, rect.y + 7f, 13f, 13f); if (Event.current.type == EventType.Repaint) { SearchWindow.s_Styles.leftArrow.Draw(position2, false, false, false, false); } if (Event.current.type == EventType.MouseDown && rect.Contains(Event.current.mousePosition)) { this.GoToParent(); Event.current.Use(); } } this.ListGUI(tree, parent); GUILayout.EndArea(); }
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 void ListGUI(SearchTreeEntry[] tree, float anim, SearchTreeGroupEntry parent, SearchTreeGroupEntry grandParent) { // Smooth the fractional part of the anim value anim = Mathf.Floor(anim) + Mathf.SmoothStep(0, 1, Mathf.Repeat(anim, 1)); // Calculate rect for animated area Rect animRect = position; animRect.x = position.width * (1 - anim) + 1; animRect.y = k_HeaderHeight; animRect.height -= k_HeaderHeight; animRect.width -= 2; // Start of animated area (the part that moves left and right) GUILayout.BeginArea(animRect); // Header Rect headerRect = GUILayoutUtility.GetRect(10, 25); string name = parent.name; GUI.Label(headerRect, name, s_Styles.header); // Back button if (grandParent != null) { float yOffset = (headerRect.height - s_Styles.leftArrow.fixedHeight) / 2; Rect arrowRect = new Rect( headerRect.x + s_Styles.leftArrow.margin.left, headerRect.y + yOffset, s_Styles.leftArrow.fixedWidth, s_Styles.leftArrow.fixedHeight); if (Event.current.type == EventType.Repaint) { s_Styles.leftArrow.Draw(arrowRect, false, false, false, false); } if (Event.current.type == EventType.MouseDown && headerRect.Contains(Event.current.mousePosition)) { GoToParent(); Event.current.Use(); } } ListGUI(tree, parent); GUILayout.EndArea(); }
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(); } } }