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