protected void OnGUI()
        {
            if (Event.current.isKey && TabSwitcher.OnGUIGlobal())
            {
                return;
            }

            EditorWindow console = consoleWindowField.GetValue(null) as EditorWindow;

            if (console == null)
            {
                EditorGUILayout.HelpBox(@"Script Inspector Console can only work when the Console tab is also open.

Click the button below to open the Console window...", MessageType.Info);
                EditorGUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Open Console Widnow"))
                {
                    GetWindow(consoleWindowType);
                    Focus();
                    Repaint();
                }
                GUILayout.FlexibleSpace();
                EditorGUILayout.EndHorizontal();
                return;
            }

            Rect oldPosition = console.position;

            editorWindowPosField.SetValue(console, position);

            try
            {
                bool contextClick = Event.current.type == EventType.ContextClick ||
                                    Event.current.type == EventType.MouseUp && Event.current.button == 1 && Application.platform == RuntimePlatform.OSXEditor;
                if (contextClick && GUIUtility.hotControl == 0 &&
                    Event.current.mousePosition.y > EditorStyles.toolbar.fixedHeight)
                {
                    int lvHeight = (int)consoleLVHeightField.GetValue(console);
                    if (lvHeight > Event.current.mousePosition.y - EditorStyles.toolbar.fixedHeight)
                    {
                        Event.current.type       = EventType.MouseDown;
                        Event.current.button     = 0;
                        Event.current.clickCount = 1;
                        try { consoleOnGUIMethod.Invoke(console, null); } catch { }
                        GUIUtility.hotControl = 0;

                        DoPopupMenu(console);
                    }
                }
                else if (Event.current.type == EventType.MouseDown && Event.current.clickCount == 2 && Event.current.mousePosition.y > EditorStyles.toolbar.fixedHeight ||
                         Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Return)
                {
                    OpenLogEntry(console);
                    GUIUtility.hotControl = 0;
                    GUIUtility.ExitGUI();
                }
                try { consoleOnGUIMethod.Invoke(console, null); } catch { }

                var rc            = new Rect(254f, -1f, 144f, 18f);
                var autoFocusText = SISettings.autoFocusConsole == 0 ? "Auto-Focus: Never" :
                                    SISettings.autoFocusConsole == 1 ? "Auto-Focus: On Error" : "Auto-Focus: On Compile";
                if (GUI.Button(rc, autoFocusText, EditorStyles.toolbarDropDown))
                {
                    var menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Never"), SISettings.autoFocusConsole == 0,
                                 () => { SISettings.autoFocusConsole.Value = 0; });
                    menu.AddItem(new GUIContent("On Compile Error"), SISettings.autoFocusConsole == 1,
                                 () => { SISettings.autoFocusConsole.Value = 1; });
                    menu.AddItem(new GUIContent("On Compile"), SISettings.autoFocusConsole == 2,
                                 () => { SISettings.autoFocusConsole.Value = 2; });
                    menu.DropDown(rc);
                }
            }
            finally
            {
                editorWindowPosField.SetValue(console, oldPosition);
            }
        }
Example #2
0
        protected void OnGUI()
        {
            if (Event.current.isKey && TabSwitcher.OnGUIGlobal())
            {
                return;
            }

            EditorWindow console = consoleWindowField.GetValue(null) as EditorWindow;

            if (console == null)
            {
                EditorGUILayout.HelpBox(@"Script Inspector Console can only work when the Console tab is also open.

Click the button below to open the Console window...", MessageType.Info);
                EditorGUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Open Console Widnow"))
                {
                    GetWindow(consoleWindowType);
                    Focus();
                    Repaint();
                }
                GUILayout.FlexibleSpace();
                EditorGUILayout.EndHorizontal();
                return;
            }

            Rect oldPosition = console.position;

            editorWindowPosField.SetValue(console, position);

            try
            {
                bool contextClick = Event.current.type == EventType.ContextClick ||
                                    Event.current.type == EventType.MouseUp && Event.current.button == 1 && Application.platform == RuntimePlatform.OSXEditor;
                if (contextClick && GUIUtility.hotControl == 0 &&
                    Event.current.mousePosition.y > EditorStyles.toolbar.fixedHeight)
                {
                    int lvHeight = (int)consoleLVHeightField.GetValue(console);
                    if (lvHeight > Event.current.mousePosition.y - EditorStyles.toolbar.fixedHeight)
                    {
                        Event.current.type       = EventType.MouseDown;
                        Event.current.button     = 0;
                        Event.current.clickCount = 1;
                        try { consoleOnGUIMethod.Invoke(console, null); } catch { }
                        GUIUtility.hotControl = 0;

                        DoPopupMenu(console);
                    }
                }
                else if (Event.current.type == EventType.MouseDown && Event.current.clickCount == 2 && Event.current.mousePosition.y > EditorStyles.toolbar.fixedHeight ||
                         Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Return)
                {
                    OpenLogEntry(console);
                    GUIUtility.hotControl = 0;
                    GUIUtility.ExitGUI();
                }
                try { consoleOnGUIMethod.Invoke(console, null); } catch { }

#if UNITY_2019_3_OR_NEWER
                var rc = new Rect(413f, -1f, 160f, 18f);
#elif UNITY_2017_1_OR_NEWER
                var rc = new Rect(355f, -1f, 144f, 18f);
#else
                var rc = new Rect(254f, -1f, 144f, 18f);
#endif
                var autoFocusText = SISettings.autoFocusConsole == 0 ? "Auto-Focus: Never" :
                                    SISettings.autoFocusConsole == 1 ? "Auto-Focus: On Error" : "Auto-Focus: On Compile";
                if (GUI.Button(rc, autoFocusText, EditorStyles.toolbarDropDown))
                {
                    var menu = new GenericMenu();
                    menu.AddItem(new GUIContent("Never"), SISettings.autoFocusConsole == 0,
                                 () => { SISettings.autoFocusConsole.Value = 0; });
                    menu.AddItem(new GUIContent("On Compile Error"), SISettings.autoFocusConsole == 1,
                                 () => { SISettings.autoFocusConsole.Value = 1; });
                    menu.AddItem(new GUIContent("On Compile"), SISettings.autoFocusConsole == 2,
                                 () => { SISettings.autoFocusConsole.Value = 2; });
                    menu.DropDown(rc);
                }

#if !UNITY_2019_3_OR_NEWER
                if (font == null && SISettings.monospacedFontConsole)
                {
                    font = FGTextEditor.LoadEditorResource <Font>("Smooth Fonts/DejaVu Sans Mono.ttf");
                    SetConsoleFont(font);
                }

                rc.xMin = rc.xMax + 4f;
                rc.xMax = rc.xMin + 100f;
                if (SISettings.monospacedFontConsole != GUI.Toggle(rc, SISettings.monospacedFontConsole, "Monospaced Font", EditorStyles.toolbarButton))
                {
                    SISettings.monospacedFontConsole.Value = !SISettings.monospacedFontConsole;

                    if (font == null && SISettings.monospacedFontConsole)
                    {
                        font = FGTextEditor.LoadEditorResource <Font>("Smooth Fonts/DejaVu Sans Mono.ttf");
                    }

                    SetConsoleFont(SISettings.monospacedFontConsole ? font : null);
                }
#endif
            }
            finally
            {
                editorWindowPosField.SetValue(console, oldPosition);
            }
        }
        private void OnGUI()
        {
            if (Event.current.isKey && TabSwitcher.OnGUIGlobal())
            {
                return;
            }

            bool needsRepaint = false;

            if (Event.current.type == EventType.KeyDown)
            {
                var nextItem = currentItem;
                var results  = GroupByFile ? this.results : flatResults;

                if (Event.current.keyCode == KeyCode.DownArrow)
                {
                    ++nextItem;
                    if (GroupByFile)
                    {
                        while (nextItem < results.Count && results[nextItem].description != null &&
                               collapsedPaths.Contains(results[nextItem].assetPath))
                        {
                            ++nextItem;
                        }
                    }
                    if (nextItem == results.Count)
                    {
                        nextItem = currentItem;
                    }
                }
                else if (Event.current.keyCode == KeyCode.RightArrow && currentItem < results.Count)
                {
                    if (results[currentItem].description == null && collapsedPaths.Contains(results[currentItem].assetPath))
                    {
                        collapsedPaths.Remove(results[currentItem].assetPath);
                        needsRepaint = true;
                    }
                    else
                    {
                        ++nextItem;
                    }
                }
                else if (Event.current.keyCode == KeyCode.UpArrow)
                {
                    --nextItem;
                    if (GroupByFile)
                    {
                        while (nextItem > 0 && results[nextItem].description != null &&
                               collapsedPaths.Contains(results[nextItem].assetPath))
                        {
                            --nextItem;
                        }
                    }
                }
                else if (Event.current.keyCode == KeyCode.LeftArrow && currentItem < results.Count)
                {
                    if (results[currentItem].description == null)
                    {
                        collapsedPaths.Add(results[currentItem].assetPath);
                        needsRepaint = true;
                    }
                    else if (GroupByFile)
                    {
                        while (results[nextItem].description != null)
                        {
                            --nextItem;
                        }
                    }
                    else
                    {
                        --nextItem;
                    }
                }
                else if (Event.current.keyCode == KeyCode.Home)
                {
                    nextItem = 0;
                }
                else if (Event.current.keyCode == KeyCode.End)
                {
                    nextItem = results.Count - 1;
                    if (GroupByFile)
                    {
                        while (nextItem > 0 && results[nextItem].description != null &&
                               collapsedPaths.Contains(results[nextItem].assetPath))
                        {
                            --nextItem;
                        }
                    }
                }

                nextItem            = Mathf.Max(0, Mathf.Min(nextItem, results.Count - 1));
                scrollToCurrentItem = scrollToCurrentItem || needsRepaint || nextItem != currentItem;
                needsRepaint        = needsRepaint || nextItem != currentItem;
                currentItem         = nextItem;

                if (Event.current.keyCode == KeyCode.Return ||
                    Event.current.keyCode == KeyCode.KeypadEnter ||
                    Event.current.keyCode == KeyCode.Space)
                {
                    if (currentItem < results.Count)
                    {
                        Event.current.Use();

                        if (results[currentItem].description != null)
                        {
                            GoToResult(currentItem);
                        }
                        else
                        {
                            var path = results[currentItem].assetPath;
                            if (collapsedPaths.Contains(path))
                            {
                                collapsedPaths.Remove(path);
                            }
                            else
                            {
                                collapsedPaths.Add(path);
                            }

                            needsRepaint = true;
                        }
                    }
                }
                else if (needsRepaint)
                {
                    Event.current.Use();
                }

                if (needsRepaint)
                {
                    needsRepaint = false;
                    Repaint();
                    return;
                }
            }

            //if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Escape)
            //{
            //	Close();
            //	editor.OwnerWindow.Focus();
            //	return;
            //}

            if (evenItemStyle == null)
            {
                evenItemStyle                = new GUIStyle("PR Label");
                evenItemStyle.padding.top    = 2;
                evenItemStyle.padding.bottom = 2;
                evenItemStyle.padding.left   = 2;
                evenItemStyle.margin.right   = 0;
                evenItemStyle.fixedHeight    = 0;
                evenItemStyle.richText       = false;
                evenItemStyle.stretchWidth   = true;
                evenItemStyle.wordWrap       = false;

                oddItemStyle = new GUIStyle(evenItemStyle);

                var evenBackground = (GUIStyle)"CN EntryBackEven";
                var oddBackground  = (GUIStyle)"CN EntryBackodd";
                evenItemStyle.normal.background  = evenBackground.normal.background;
                evenItemStyle.focused.background = evenBackground.normal.background;
                oddItemStyle.normal.background   = oddBackground.normal.background;
                oddItemStyle.focused.background  = oddBackground.normal.background;

                pingStyle = (GUIStyle)"PR Ping";
            }

            var rcToolbar = new Rect(0f, 0f, Screen.width, 20f);

            GUI.Label(rcToolbar, GUIContent.none, EditorStyles.toolbar);

            GUILayout.BeginHorizontal();
            GUILayout.Label(infoText, GUILayout.Height(20f), GUILayout.MinWidth(0f));
            EditorGUILayout.Space();
            GUILayout.Label(resultsCountText, GUILayout.Height(20f));
            GUILayout.FlexibleSpace();

            var newGroupByFile = GUILayout.Toggle(GroupByFile, "Group by File", EditorStyles.toolbarButton, GUILayout.Height(20f), GUILayout.ExpandHeight(true));

            keepResults = GUILayout.Toggle(keepResults, "Keep Results", EditorStyles.toolbarButton, GUILayout.Height(20f), GUILayout.ExpandHeight(true));
            EditorGUILayout.Space();

            GUILayout.EndHorizontal();

            if (newGroupByFile != GroupByFile)
            {
                var results = GroupByFile ? this.results : flatResults;
                GroupByFile = newGroupByFile;
                var newResults = GroupByFile ? this.results : flatResults;
                if (currentItem < results.Count)
                {
                    var currentResult = results[currentItem];
                    if (currentResult.description == null)
                    {
                        currentResult = results[currentItem + 1];
                    }
                    currentItem = Mathf.Max(0, newResults.IndexOf(currentResult));
                }
                else
                {
                    currentItem = 0;
                }

                needsRepaint        = true;
                scrollToCurrentItem = true;
            }

            listViewHeight = Screen.height - rcToolbar.height - 20f;

            Vector2 scrollToPosition;

            try
            {
                scrollPosition   = GUILayout.BeginScrollView(scrollPosition, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
                scrollToPosition = scrollPosition;

                EditorGUIUtility.SetIconSize(new Vector2(16f, 16f));

                //resultsLock.EnterReadLock();

                if (foundNoResults)
                {
                    GUILayout.Label("No Results Found!");
                }
                else
                {
                    var  currentPath    = "";
                    bool isExpanded     = true;
                    int  drawnItemIndex = 0;
                    var  results        = GroupByFile ? this.results : flatResults;
                    for (var i = 0; i < results.Count; ++i)
                    {
                        var result    = results[i];
                        var itemStyle = (drawnItemIndex & 1) == 0 ? evenItemStyle : oddItemStyle;

                        if (result.description != null && !isExpanded)
                        {
                            continue;
                        }

                        ++drawnItemIndex;

                        var rc = GUILayoutUtility.GetRect(GUIContent.none, itemStyle, GUILayout.Height(21f), GUILayout.ExpandWidth(true));
                        if (Event.current.type == EventType.Repaint)
                        {
                            itemStyle.Draw(rc, GUIContent.none, false, false, i == currentItem, this == focusedWindow);
                        }

                        if (result.description == null)
                        {
                            currentPath = result.assetPath;
                            isExpanded  = !collapsedPaths.Contains(currentPath);
                            var rcToggle = rc;
                            rcToggle.xMax = 18f;
                            bool expand = GUI.Toggle(rcToggle, isExpanded, GUIContent.none, EditorStyles.foldout);
                            if (expand != isExpanded)
                            {
                                currentItem = i;
                                if (expand && !isExpanded)
                                {
                                    collapsedPaths.Remove(currentPath);
                                }
                                else if (!expand && isExpanded)
                                {
                                    collapsedPaths.Add(currentPath);
                                }
                                needsRepaint = true;
                            }
                        }

                        if (scrollToCurrentItem && i == currentItem && Event.current.type == EventType.Repaint)
                        {
                            if (rc.yMin < scrollPosition.y)
                            {
                                scrollToPosition.y = rc.yMin;
                                needsRepaint       = true;
                            }
                            else if (rc.yMax > scrollPosition.y + listViewHeight)
                            {
                                scrollToPosition.y = rc.yMax - listViewHeight;
                                needsRepaint       = true;
                            }
                        }

                        if (rc.yMax < scrollPosition.y || rc.yMin > scrollPosition.y + listViewHeight)
                        {
                            continue;
                        }

                        if (Event.current.type == EventType.MouseDown && rc.Contains(Event.current.mousePosition))
                        {
                            if (i == currentItem && Event.current.button == 0 && Event.current.clickCount == 2)
                            {
                                if (result.description == null)
                                {
                                    if (collapsedPaths.Contains(result.assetPath))
                                    {
                                        collapsedPaths.Remove(result.assetPath);
                                    }
                                    else
                                    {
                                        collapsedPaths.Add(result.assetPath);
                                    }

                                    needsRepaint = true;
                                }
                                else
                                {
                                    FGCodeWindow.OpenAssetInTab(result.assetGuid, result.line, result.characterIndex, result.length);
                                }
                            }
                            else if (Event.current.button == 1 && result.description == null)
                            {
                                GenericMenu menu = new GenericMenu();
                                menu.AddItem(new GUIContent("Expand All"), false, () => {
                                    collapsedPaths.Clear();
                                });
                                menu.AddItem(new GUIContent("Collapse All"), false, () => {
                                    foreach (var r in results)
                                    {
                                        if (r.description == null)
                                        {
                                            collapsedPaths.Add(r.assetPath);
                                        }
                                    }
                                });
                                menu.ShowAsContext();
                            }
                            currentItem         = i;
                            needsRepaint        = true;
                            scrollToCurrentItem = true;

                            Event.current.Use();
                        }

                        GUIContent contentContent;
                        int        lineInfoLength = 0;
                        if (result.description == null)
                        {
                            contentContent = new GUIContent(result.assetPath, AssetDatabase.GetCachedIcon(result.assetPath));
                            rc.xMin        = 18f;
                        }
                        else
                        {
                            string lineInfo;
                            if (GroupByFile)
                            {
                                lineInfo = (result.line + 1).ToString() + ": ";
                            }
                            else
                            {
                                lineInfo = System.IO.Path.GetFileName(result.assetPath) + '(' + (result.line + 1).ToString() + "): ";
                            }
                            lineInfoLength = lineInfo.Length;
                            contentContent = new GUIContent(lineInfo + result.description);
                            rc.xMin        = 22f;
                        }

                        if (Event.current.type == EventType.Repaint)
                        {
                            if (result.description != null)
                            {
                                var dotContent    = new GUIContent(".");
                                var preContent    = new GUIContent(contentContent.text.Substring(0, lineInfoLength + result.characterIndex - result.trimOffset) + '.');
                                var resultContent = new GUIContent('.' + contentContent.text.Substring(0, lineInfoLength + result.characterIndex + result.length - result.trimOffset) + '.');
                                var dotSize       = itemStyle.CalcSize(dotContent);
                                var preSize       = itemStyle.CalcSize(preContent); preSize.x -= dotSize.x;
                                var resultSize    = itemStyle.CalcSize(resultContent); resultSize.x -= dotSize.x * 2f;
                                var rcHighlight   = new Rect(rc.x + preSize.x - 4f, rc.y + 2f, resultSize.x - preSize.x + 14f, rc.height - 4f);
                                GUI.color = new Color(1f, 1f, 1f, 0.4f);
                                pingStyle.Draw(rcHighlight, false, false, false, false);
                                GUI.color = Color.white;
                            }

                            GUI.backgroundColor = Color.clear;
                            itemStyle.Draw(rc, contentContent, false, false, i == currentItem, this == focusedWindow);
                            GUI.backgroundColor = Color.white;
                        }
                    }
                }

                GUILayout.FlexibleSpace();
            }
            finally
            {
                //resultsLock.ExitReadLock();
                GUILayout.EndScrollView();
            }

            if (Event.current.type == EventType.Repaint)
            {
                if (needsRepaint)
                {
                    scrollToCurrentItem = false;
                    scrollPosition      = scrollToPosition;
                    Repaint();
                }
                else
                {
                    scrollToCurrentItem = false;
                }
            }
        }