コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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();
                }
            }
        }
コード例 #6
0
        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();
                }
            }
        }