public BluLog GetCompleteLog(int row)
        {
            var log = UnityLoggerServer.GetCompleteLog(row);

            log.FilterStackTrace(StackTraceIgnorePrefixs);
            return(log);
        }
        private void PreProcessLogs()
        {
            _qtLogs = UnityLoggerServer.StartGettingLogs();

            _cacheLogCount = _qtLogs;

            // Filtering logs with ugly code
            int cntLogs = 0;

            int[]    rows  = GetCachedIntArr(_qtLogs);
            BluLog[] logs  = GetCachedLogsArr(_qtLogs);
            int      index = 0;
            int      cacheLogComparerCount = _cacheLogComparer.Count;

            for (int i = 0; i < _qtLogs; i++)
            {
                // Ugly code to avoid function call
                int    realCount = _cacheLog.Count;
                BluLog log       = null;
                if (i < _cacheLogCount && i < realCount)
                {
                    log = _cacheLog[i];
                }
                else
                {
                    log = GetSimpleLog(i);
                }

                // Ugly code to avoid function call
                bool has = false;
                if (i < cacheLogComparerCount)
                {
                    has = _cacheLogComparer[i];
                }
                else
                {
                    has = ShouldLog(log, i);
                }
                if (has)
                {
                    cntLogs++;
                    rows[index]   = i;
                    logs[index++] = log;
                }
            }

            _qtLogs = cntLogs;

            UnityLoggerServer.StopGettingsLogs();
        }
        private BluLog GetSimpleLog(int row)
        {
            int realCount = _cacheLog.Count;
            var log       = UnityLoggerServer.GetSimpleLog(row);

            if (realCount > row)
            {
                _cacheLog[row] = log;
            }
            else
            {
                _cacheLog.Add(log);
            }
            return(_cacheLog[row]);
        }
Esempio n. 4
0
        private BluLogType GetLogType(
            BluLog log)
        {
            int mode = log.Mode;

            if (UnityLoggerServer.HasMode(mode, (ConsoleWindowMode)GetLogMask(BluLogType.Error)))
            {
                return(BluLogType.Error);
            }
            else
            if (UnityLoggerServer.HasMode(mode, (ConsoleWindowMode)GetLogMask(BluLogType.Warning)))
            {
                return(BluLogType.Warning);
            }
            else
            {
                return(BluLogType.Normal);
            }
        }
        public void OnGUI(int id)
        {
            float height = BluConsoleSkin.ToolbarButtonStyle.CalcSize("Clear".GUIContent()).y;

            GUILayout.BeginHorizontal(BluConsoleSkin.ToolbarStyle, GUILayout.Height(height));

            if (GetButtonClamped("Clear".GUIContent(), BluConsoleSkin.ToolbarButtonStyle))
            {
                UnityLoggerServer.Clear();
                SetDirtyLogs();
                ListWindow.SelectedMessage   = -1;
                DetailWindow.SelectedMessage = -1;
            }

            GUILayout.Space(6.0f);

            var actualCollapse = UnityLoggerServer.HasFlag(ConsoleWindowFlag.Collapse);
            var newCollapse    = GetToggleClamped(_isCollapse, "Collapse".GUIContent(), BluConsoleSkin.ToolbarButtonStyle);

            if (newCollapse != _isCollapse)
            {
                SetDirtyLogs();
                _isCollapse = newCollapse;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.Collapse, newCollapse);
            }
            else if (newCollapse != actualCollapse)
            {
                SetDirtyLogs();
                _isCollapse = actualCollapse;
            }


            var actualClearOnPlay = UnityLoggerServer.HasFlag(ConsoleWindowFlag.ClearOnPlay);
            var newClearOnPlay    = GetToggleClamped(_isClearOnPlay, "Clear on Play".GUIContent(), BluConsoleSkin.ToolbarButtonStyle);

            if (newClearOnPlay != _isClearOnPlay)
            {
                _isClearOnPlay = newClearOnPlay;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.ClearOnPlay, newClearOnPlay);
            }
            else if (newClearOnPlay != actualClearOnPlay)
            {
                _isClearOnPlay = actualClearOnPlay;
            }


            var actualPauseOnError = UnityLoggerServer.HasFlag(ConsoleWindowFlag.ErrorPause);
            var newPauseOnError    = GetToggleClamped(_isPauseOnError, "Pause on Error".GUIContent(), BluConsoleSkin.ToolbarButtonStyle);

            if (newPauseOnError != _isPauseOnError)
            {
                _isPauseOnError = newPauseOnError;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.ErrorPause, newPauseOnError);
            }
            else if (newPauseOnError != actualPauseOnError)
            {
                _isPauseOnError = actualPauseOnError;
            }


            GUILayout.FlexibleSpace();


            // Search Area
            var oldString = _searchString;

            _searchString = EditorGUILayout.TextArea(_searchString,
                                                     BluConsoleSkin.ToolbarSearchTextFieldStyle,
                                                     GUILayout.Width(Configuration.SearchStringBoxWidth));
            if (_searchString != oldString)
            {
                SetDirtyComparer();
            }

            if (GUILayout.Button("", BluConsoleSkin.ToolbarSearchCancelButtonStyle))
            {
                _searchString = "";
                SetDirtyComparer();
                GUI.FocusControl(null);
            }

            SearchStringPatterns = _searchString.Trim().ToLower().Split(' ');


            GUILayout.Space(10.0f);


            // Info/Warning/Error buttons Area
            int qtNormalLogs = 0, qtWarningLogs = 0, qtErrorLogs = 0;

            UnityLoggerServer.GetCount(ref qtNormalLogs, ref qtWarningLogs, ref qtErrorLogs);

            var qtNormalLogsStr = qtNormalLogs.ToString();

            if (qtNormalLogs >= Configuration.MaxAmountOfLogs)
            {
                qtNormalLogsStr = Configuration.MaxAmountOfLogs + "+";
            }

            var qtWarningLogsStr = qtWarningLogs.ToString();

            if (qtWarningLogs >= Configuration.MaxAmountOfLogs)
            {
                qtWarningLogsStr = Configuration.MaxAmountOfLogs + "+";
            }

            var qtErrorLogsStr = qtErrorLogs.ToString();

            if (qtErrorLogs >= Configuration.MaxAmountOfLogs)
            {
                qtErrorLogsStr = Configuration.MaxAmountOfLogs + "+";
            }


            var actualIsShowNormal = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelLog);
            var newIsShowNormal    = GetToggleClamped(_isShowNormal,
                                                      new GUIContent(qtNormalLogsStr, BluConsoleSkin.InfoIconSmall),
                                                      BluConsoleSkin.ToolbarButtonStyle);

            if (newIsShowNormal != _isShowNormal)
            {
                SetDirtyLogs();
                _isShowNormal = newIsShowNormal;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelLog, newIsShowNormal);
            }
            else if (newIsShowNormal != actualIsShowNormal)
            {
                SetDirtyLogs();
                _isShowNormal = actualIsShowNormal;
            }


            var actualIsShowWarning = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelWarning);
            var newIsShowWarning    = GetToggleClamped(_isShowWarning,
                                                       new GUIContent(qtWarningLogsStr, BluConsoleSkin.WarningIconSmall),
                                                       BluConsoleSkin.ToolbarButtonStyle);

            if (newIsShowWarning != _isShowWarning)
            {
                SetDirtyLogs();
                _isShowWarning = newIsShowWarning;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelWarning, newIsShowWarning);
            }
            else if (newIsShowWarning != actualIsShowWarning)
            {
                SetDirtyLogs();
                _isShowWarning = actualIsShowWarning;
            }


            var actualIsShowError = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelError);
            var newIsShowError    = GetToggleClamped(_isShowError,
                                                     new GUIContent(qtErrorLogsStr, BluConsoleSkin.ErrorIconSmall),
                                                     BluConsoleSkin.ToolbarButtonStyle);

            if (newIsShowError != _isShowError)
            {
                SetDirtyLogs();
                _isShowError = newIsShowError;
                UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelError, newIsShowError);
            }
            else if (newIsShowError != actualIsShowError)
            {
                SetDirtyLogs();
                _isShowError = actualIsShowError;
            }

            for (var i = 0; i < Settings.Filters.Count; i++)
            {
                var  name  = Settings.Filters[i].Name;
                var  style = BluConsoleSkin.ToolbarButtonStyle;
                bool oldAdditionalFilter = ToggledFilters[i];
                ToggledFilters[i] = GUILayout.Toggle(ToggledFilters[i],
                                                     name,
                                                     style,
                                                     GUILayout.MaxWidth(style.CalcSize(new GUIContent(name)).x));
                if (oldAdditionalFilter != ToggledFilters[i])
                {
                    SetDirtyLogs();
                }
            }

            GUILayout.EndHorizontal();
        }
Esempio n. 6
0
        private void DrawLogList()
        {
            _qtLogs        = UnityLoggerServer.StartGettingLogs();
            _cacheLogCount = _qtLogs;

            int           cntLogs = 0;
            List <int>    rows    = new List <int>(_qtLogs);
            List <BluLog> logs    = new List <BluLog>(_qtLogs);

            for (int i = 0; i < _qtLogs; i++)
            {
                var log = GetSimpleLog(i);
                if (HasPattern(log, i))
                {
                    cntLogs++;
                    rows.Add(i);
                    logs.Add(log);
                }
            }

            _qtLogs = cntLogs;

            float windowWidth  = WindowWidth;
            float windowHeight = _topPanelHeight - DrawYPos;

            float buttonWidth = ButtonWidth;

            if (_qtLogs * ButtonHeight > windowHeight)
            {
                buttonWidth -= 15f;
            }

            float viewWidth  = buttonWidth;
            float viewHeight = _qtLogs * ButtonHeight;

            Rect scrollViewPosition = new Rect(x: 0f, y: DrawYPos, width: windowWidth, height: windowHeight);
            Rect scrollViewViewRect = new Rect(x: 0f, y: 0f, width: viewWidth, height: viewHeight);

            GUI.DrawTexture(scrollViewPosition, BluConsoleSkin.EvenBackTexture);

            Vector2 oldScrollPosition = _logListScrollPosition;

            _logListScrollPosition = GUI.BeginScrollView(position: scrollViewPosition,
                                                         scrollPosition: _logListScrollPosition,
                                                         viewRect: scrollViewViewRect);

            int firstRenderLogIndex = (int)(_logListScrollPosition.y / ButtonHeight);

            firstRenderLogIndex = Mathf.Clamp(firstRenderLogIndex, 0, _qtLogs);

            int lastRenderLogIndex = firstRenderLogIndex + (int)(windowHeight / ButtonHeight) + 2;

            lastRenderLogIndex = Mathf.Clamp(lastRenderLogIndex, 0, _qtLogs);

            float buttonY      = firstRenderLogIndex * ButtonHeight;
            bool  hasSomeClick = false;

            int cnt = 0;

            for (int i = firstRenderLogIndex; i < lastRenderLogIndex; i++)
            {
                var row       = rows[i];
                var log       = logs[i];
                var styleBack = GetLogBackStyle(i);

                var    styleMessage   = GetLogListStyle(log);
                string showMessage    = GetTruncatedMessage(GetLogListMessage(log));
                var    contentMessage = new GUIContent(showMessage);
                var    rectMessage    = new Rect(x: 0,
                                                 y: buttonY,
                                                 width: viewWidth,
                                                 height: ButtonHeight);
                bool isSelected = i == _logListSelectedMessage ? true : false;
                DrawBack(rectMessage, styleBack, isSelected);
                if (IsRepaintEvent)
                {
                    styleMessage.Draw(rectMessage, contentMessage, false, false, isSelected, false);
                }

                bool messageClicked = IsClicked(rectMessage);
                bool isLeftClick    = messageClicked ? Event.current.button == 0 : false;

                if (UnityLoggerServer.HasFlag(ConsoleWindowFlag.Collapse))
                {
                    int quantity      = UnityLoggerServer.GetLogCount(row);
                    var collapseCount = Mathf.Min(quantity, MAX_LENGTH_COLLAPSE);
                    var collapseText  = collapseCount.ToString();
                    if (collapseCount >= MAX_LENGTH_COLLAPSE)
                    {
                        collapseText += "+";
                    }
                    var collapseContent = new GUIContent(collapseText);
                    var collapseSize    = BluConsoleSkin.CollapseStyle.CalcSize(collapseContent);

                    var collapseRect = new Rect(x: viewWidth - collapseSize.x - 5f,
                                                y: (buttonY + buttonY + ButtonHeight - collapseSize.y) * 0.5f,
                                                width: collapseSize.x,
                                                height: collapseSize.y);

                    GUI.Label(collapseRect, collapseContent, BluConsoleSkin.CollapseStyle);
                }

                if (messageClicked)
                {
                    _selectedLog = GetCompleteLog(row);

                    hasSomeClick = true;

                    if (!isLeftClick && i == _logListSelectedMessage)
                    {
                        DrawPopup(Event.current, log);
                    }

                    if (isLeftClick && i == _logListSelectedMessage)
                    {
                        if (IsDoubleClickLogListButton)
                        {
                            _logListLastTimeClicked = 0.0f;
                            var completeLog = GetCompleteLog(row);
                            JumpToSource(completeLog, 0);
                        }
                        else
                        {
                            PingLog(_selectedLog);
                            _logListLastTimeClicked = EditorApplication.timeSinceStartup;
                        }
                    }
                    else
                    {
                        PingLog(_selectedLog);
                        _logListSelectedMessage = i;
                    }

                    _logDetailSelectedFrame = -1;
                }

                buttonY += ButtonHeight;
                cnt++;
            }

            UnityLoggerServer.StopGettingsLogs();

            GUI.EndScrollView();

            if (_hasScrollWheelUp || hasSomeClick)
            {
                _isFollowScroll = false;
            }
            else if (_logListScrollPosition != oldScrollPosition)
            {
                _isFollowScroll = false;
                float topOffset = viewHeight - windowHeight;
                if (_logListScrollPosition.y >= topOffset)
                {
                    _isFollowScroll = true;
                }
            }

            if (!IsFollowScroll)
            {
                return;
            }

            float endY = viewHeight - windowHeight;

            _logListScrollPosition.y = endY;
        }
Esempio n. 7
0
        private float DrawTopToolbar()
        {
            float height = BluConsoleSkin.ToolbarButtonStyle.CalcSize(new GUIContent("Clear")).y;

            GUILayout.BeginHorizontal(BluConsoleSkin.ToolbarStyle, GUILayout.Height(height));

            if (GetButtonClamped("Clear", BluConsoleSkin.ToolbarButtonStyle))
            {
                UnityLoggerServer.Clear();
                SetDirtyLogs();
                _logListSelectedMessage = -1;
                _logDetailSelectedFrame = -1;
            }

            GUILayout.Space(6.0f);

            bool oldCollapse = UnityLoggerServer.HasFlag(ConsoleWindowFlag.Collapse);
            bool newCollapse = GetToggleClamped(oldCollapse, "Collapse", BluConsoleSkin.ToolbarButtonStyle);

            if (oldCollapse != newCollapse)
            {
                SetDirtyLogs();
            }
            UnityLoggerServer.SetFlag(ConsoleWindowFlag.Collapse, newCollapse);


            bool oldClearOnPlay = UnityLoggerServer.HasFlag(ConsoleWindowFlag.ClearOnPlay);
            bool newClearOnPlay = GetToggleClamped(oldClearOnPlay, "Clear on Play", BluConsoleSkin.ToolbarButtonStyle);

            UnityLoggerServer.SetFlag(ConsoleWindowFlag.ClearOnPlay, newClearOnPlay);


            bool oldPauseOnError = UnityLoggerServer.HasFlag(ConsoleWindowFlag.ErrorPause);
            bool newPauseOnError = GetToggleClamped(oldPauseOnError, "Pause on Error", BluConsoleSkin.ToolbarButtonStyle);

            UnityLoggerServer.SetFlag(ConsoleWindowFlag.ErrorPause, newPauseOnError);

            GUILayout.FlexibleSpace();

            // Search Area
            var oldString = _searchString;

            _searchString = EditorGUILayout.TextArea(_searchString,
                                                     BluConsoleSkin.ToolbarSearchTextFieldStyle,
                                                     GUILayout.Width(200.0f));
            if (_searchString != oldString)
            {
                SetDirtyComparer();
            }

            if (GUILayout.Button("", BluConsoleSkin.ToolbarSearchCancelButtonStyle))
            {
                _searchString = "";
                SetDirtyComparer();
                GUI.FocusControl(null);
            }

            _searchStringPatterns = _searchString.Trim().ToLower().Split(' ');

            GUILayout.Space(10.0f);


            // Info/Warning/Error buttons Area
            int qtNormalLogs = 0, qtWarningLogs = 0, qtErrorLogs = 0;

            UnityLoggerServer.GetCount(ref qtNormalLogs, ref qtWarningLogs, ref qtErrorLogs);

            int    maxLogs         = MAX_LOGS;
            string qtNormalLogsStr = qtNormalLogs.ToString();

            if (qtNormalLogs >= maxLogs)
            {
                qtNormalLogsStr = maxLogs.ToString() + "+";
            }

            string qtWarningLogsStr = qtWarningLogs.ToString();

            if (qtWarningLogs >= maxLogs)
            {
                qtWarningLogsStr = maxLogs.ToString() + "+";
            }

            string qtErrorLogsStr = qtErrorLogs.ToString();

            if (qtErrorLogs >= maxLogs)
            {
                qtErrorLogsStr = maxLogs.ToString() + "+";
            }


            bool oldIsShowNormal = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelLog);
            bool newIsShowNormal = GetToggleClamped(oldIsShowNormal,
                                                    GetInfoGUIContent(qtNormalLogsStr),
                                                    BluConsoleSkin.ToolbarButtonStyle);

            if (oldIsShowNormal != newIsShowNormal)
            {
                SetDirtyLogs();
            }
            UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelLog, newIsShowNormal);


            bool oldIsShowWarning = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelWarning);
            bool newIsShowWarning = GetToggleClamped(oldIsShowWarning,
                                                     GetWarningGUIContent(qtWarningLogsStr),
                                                     BluConsoleSkin.ToolbarButtonStyle);

            if (oldIsShowWarning != newIsShowWarning)
            {
                SetDirtyLogs();
            }
            UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelWarning, newIsShowWarning);


            bool oldIsShowError = UnityLoggerServer.HasFlag(ConsoleWindowFlag.LogLevelError);
            bool newIsShowError = GetToggleClamped(oldIsShowError,
                                                   GetErrorGUIContent(qtErrorLogsStr),
                                                   BluConsoleSkin.ToolbarButtonStyle);

            if (oldIsShowError != newIsShowError)
            {
                SetDirtyLogs();
            }
            UnityLoggerServer.SetFlag(ConsoleWindowFlag.LogLevelError, newIsShowError);

            for (int i = 0; i < _settings.Filters.Count; i++)
            {
                var  name  = _settings.Filters[i].Name;
                var  style = BluConsoleSkin.ToolbarButtonStyle;
                bool oldAdditionalFilter = _additionalFilters[i];
                _additionalFilters[i] = GUILayout.Toggle(_additionalFilters[i],
                                                         name,
                                                         style,
                                                         GUILayout.MaxWidth(style.CalcSize(new GUIContent(name)).x));
                if (oldAdditionalFilter != _additionalFilters[i])
                {
                    SetDirtyLogs();
                }
            }

            GUILayout.EndHorizontal();

            return(height);
        }
Esempio n. 8
0
        public override void OnGUI(int id)
        {
            base.OnGUI(id);

            UnityLoggerServer.StartGettingLogs();

            GUI.DrawTexture(WindowRect, BluConsoleSkin.OddBackTexture);

            if (ListWindowSelectedMessage != -1 &&
                ListWindowSelectedMessage >= 0 &&
                ListWindowSelectedMessage < QtLogs)
            {
                _selectedLog = GetCompleteLog(Rows[ListWindowSelectedMessage]);
            }

            if (_selectedLog != null)
            {
                SelectedMessage = Mathf.Clamp(SelectedMessage, 0, _selectedLog.StackTrace.Count);
            }
            else
            {
                SelectedMessage = -1;
            }

            if (ListWindowSelectedMessage == -1 ||
                QtLogs == 0 ||
                ListWindowSelectedMessage >= QtLogs ||
                _selectedLog == null ||
                _selectedLog.StackTrace == null)
            {
                UnityLoggerServer.StopGettingsLogs();
                return;
            }

            float buttonWidth = DefaultButtonWidth;

            var cells = GetCells(_selectedLog);

            foreach (var cell in cells)
            {
                cell.Message = GetTruncatedDetailMessage(cell.Message);
            }
            sums    = new float[cells.Count + 1];
            sums[0] = 0;
            for (int i = 1; i <= cells.Count; i++)
            {
                sums[i] = cells[i - 1].GetHeight(buttonWidth) + sums[i - 1];
            }

            float viewHeight = sums[cells.Count];

            if (viewHeight > WindowRect.height)
            {
                buttonWidth -= 15f;
            }

            for (int i = 1; i <= cells.Count; i++)
            {
                sums[i] = cells[i - 1].GetHeight(buttonWidth) + sums[i - 1];
            }
            viewHeight = sums[cells.Count];

            float viewWidth = buttonWidth;

            Rect scrollViewPosition = WindowRect;
            Rect scrollViewViewRect = new Rect(x: 0f, y: 0f, width: viewWidth, height: viewHeight);

            ScrollPosition = GUI.BeginScrollView(position: scrollViewPosition,
                                                 scrollPosition: ScrollPosition,
                                                 viewRect: scrollViewViewRect);

            int firstRenderLogIndex = GetFirstGreaterCellIndex(cells, ScrollPosition.y, 0f) - 1;

            firstRenderLogIndex = Mathf.Clamp(firstRenderLogIndex, 0, cells.Count - 1);
            int lastRenderLogIndex = GetFirstGreaterCellIndex(cells, ScrollPosition.y, WindowRect.height);

            lastRenderLogIndex = Mathf.Clamp(lastRenderLogIndex, 0, cells.Count - 1);

            float buttonY = sums[firstRenderLogIndex];

            // Handling up/down arrow keys
            if (HasKeyboardArrowKeyInput)
            {
                float lo = ScrollPosition.y;
                float hi = ScrollPosition.y + WindowRect.height;
                float selectedMessageLo = sums[SelectedMessage];
                float selectedMessageHi = sums[SelectedMessage + 1];

                bool isFrameOutsideOfRange = !(selectedMessageLo >= lo && selectedMessageHi <= hi);
                if (isFrameOutsideOfRange && KeyboardArrowKeyDirection == Direction.Up)
                {
                    ScrollPosition.y = selectedMessageLo;
                }
                else if (isFrameOutsideOfRange && KeyboardArrowKeyDirection == Direction.Down)
                {
                    ScrollPosition.y = selectedMessageHi - WindowRect.height;
                }
            }

            for (int i = firstRenderLogIndex; i <= lastRenderLogIndex; i++)
            {
                float cellHeight = sums[i + 1] - sums[i];
                var   rectButton = new Rect(x: 0, y: buttonY, width: viewWidth, height: cellHeight);
                var   isSelected = cells[i].SelectedMessageWhenClicked == SelectedMessage;
                DrawBackground(rectButton, cells[i].BackgroundStyle, isSelected);
                if (IsRepaintEvent)
                {
                    cells[i].MessageStyle.Draw(rectButton, cells[i].Message, false, false, isSelected, false);
                }

                bool messageClicked = IsClicked(rectButton);
                if (messageClicked)
                {
                    bool isLeftClick = Event.current.button == 0;
                    if (!isSelected)
                    {
                        LastTimeClicked = 0.0f;
                    }
                    if (isLeftClick && !IsDoubleClick)
                    {
                        SelectedMessage = cells[i].SelectedMessageWhenClicked;
                    }
                    if (!isLeftClick)
                    {
                        DrawPopup(cells[i].Message);
                    }
                    if (isLeftClick && SelectedMessage == cells[i].SelectedMessageWhenClicked)
                    {
                        if (IsDoubleClick)
                        {
                            LastTimeClicked = 0.0f;
                            BluUtils.JumpToSourceFile(_selectedLog, cells[i].StackTraceIndex);
                        }
                        else
                        {
                            LastTimeClicked = EditorApplication.timeSinceStartup;
                        }
                    }
                }

                buttonY += cellHeight;
            }

            GUI.EndScrollView();

            UnityLoggerServer.StopGettingsLogs();
        }
        public override void OnGUI(int id)
        {
            base.OnGUI(id);

            UnityLoggerServer.StartGettingLogs();

            SelectedMessage = Mathf.Clamp(SelectedMessage, -1, QtLogs - 1);

            float buttonWidth = DefaultButtonWidth;

            if (QtLogs * DefaultButtonHeight > WindowRect.height)
            {
                buttonWidth -= 15f;
            }

            float viewWidth  = buttonWidth;
            float viewHeight = QtLogs * DefaultButtonHeight;

            Rect scrollWindowRect = WindowRect;
            Rect scrollViewRect   = new Rect(x: 0f, y: 0f, width: viewWidth, height: viewHeight);

            GUI.DrawTexture(scrollWindowRect, BluConsoleSkin.EvenBackTexture);

            Vector2 oldScrollPosition = ScrollPosition;

            ScrollPosition = GUI.BeginScrollView(position: scrollWindowRect,
                                                 scrollPosition: ScrollPosition,
                                                 viewRect: scrollViewRect);

            GUI.DrawTexture(WindowRect, BluConsoleSkin.OddBackTexture);

            int firstRenderLogIndex = (int)(ScrollPosition.y / DefaultButtonHeight);

            firstRenderLogIndex = Mathf.Clamp(firstRenderLogIndex, 0, QtLogs);

            int lastRenderLogIndex = firstRenderLogIndex + (int)(WindowRect.height / DefaultButtonHeight) + 2;

            lastRenderLogIndex = Mathf.Clamp(lastRenderLogIndex, 0, QtLogs);

            // Handling up/down arrow keys
            if (HasKeyboardArrowKeyInput)
            {
                bool isFrameOutsideOfRange = SelectedMessage <firstRenderLogIndex + 1 ||
                                                              SelectedMessage> lastRenderLogIndex - 3;
                if (isFrameOutsideOfRange && KeyboardArrowKeyDirection == Direction.Up)
                {
                    ScrollPosition.y = DefaultButtonHeight * SelectedMessage;
                }
                else if (isFrameOutsideOfRange && KeyboardArrowKeyDirection == Direction.Down)
                {
                    int   md = lastRenderLogIndex - firstRenderLogIndex - 3;
                    float ss = md * DefaultButtonHeight;
                    float sd = WindowRect.height - ss;
                    ScrollPosition.y = (DefaultButtonHeight * (SelectedMessage + 1) - ss - sd);
                }
            }

            float buttonY      = firstRenderLogIndex * DefaultButtonHeight;
            bool  hasCollapse  = UnityLoggerServer.HasFlag(ConsoleWindowFlag.Collapse);
            bool  hasSomeClick = false;

            for (int i = firstRenderLogIndex; i < lastRenderLogIndex; i++)
            {
                int    row       = Rows[i];
                BluLog log       = Logs[i];
                var    styleBack = BluConsoleSkin.GetLogBackStyle(i);

                var    styleMessage   = BluConsoleSkin.GetLogListStyle(log.LogType);
                string showMessage    = GetTruncatedListMessage(log);
                var    contentMessage = new GUIContent(showMessage);
                var    rectMessage    = new Rect(x: 0, y: buttonY, width: viewWidth, height: DefaultButtonHeight);
                bool   isSelected     = i == SelectedMessage;

                DrawBackground(rectMessage, styleBack, isSelected);
                if (IsRepaintEvent)
                {
                    styleMessage.Draw(rectMessage, contentMessage, false, false, isSelected, false);
                }

                bool messageClicked = IsClicked(rectMessage);
                bool isLeftClick    = messageClicked && Event.current.button == 0;

                if (hasCollapse)
                {
                    int quantity      = UnityLoggerServer.GetLogCount(row);
                    var collapseCount = Mathf.Min(quantity, LogConfiguration.MaxAmountOfLogsCollapse);
                    var collapseText  = collapseCount.ToString();
                    if (collapseCount >= LogConfiguration.MaxAmountOfLogsCollapse)
                    {
                        collapseText += "+";
                    }
                    var collapseContent = new GUIContent(collapseText);
                    var collapseSize    = BluConsoleSkin.CollapseStyle.CalcSize(collapseContent);

                    var collapseRect = new Rect(x: viewWidth - collapseSize.x - 5f,
                                                y: (buttonY + buttonY + DefaultButtonHeight - collapseSize.y) * 0.5f,
                                                width: collapseSize.x,
                                                height: collapseSize.y);

                    GUI.Label(collapseRect, collapseContent, BluConsoleSkin.CollapseStyle);
                }

                if (messageClicked)
                {
                    hasSomeClick = true;
                    if (SelectedMessage != i)
                    {
                        LastTimeClicked = 0.0f;
                    }
                    if (isLeftClick)
                    {
                        BluUtils.PingLog(GetCompleteLog(row));
                        SelectedMessage = i;
                    }
                    if (!isLeftClick)
                    {
                        DrawPopup(log);
                    }
                    if (isLeftClick && i == SelectedMessage)
                    {
                        if (IsDoubleClick)
                        {
                            LastTimeClicked = 0.0f;
                            var completeLog = GetCompleteLog(row);
                            BluUtils.JumpToSourceFile(completeLog, 0);
                        }
                        else
                        {
                            LastTimeClicked = EditorApplication.timeSinceStartup;
                        }
                    }
                }

                buttonY += DefaultButtonHeight;
            }

            GUI.EndScrollView();

            if (IsScrollUp || hasSomeClick)
            {
                IsFollowScroll = false;
            }
            else if (ScrollPosition != oldScrollPosition)
            {
                IsFollowScroll = false;
                float topOffset = viewHeight - WindowRect.height;
                if (ScrollPosition.y >= topOffset)
                {
                    IsFollowScroll = true;
                }
            }

            if (IsFollowScroll)
            {
                ScrollPosition.y = viewHeight - WindowRect.height;
            }

            UnityLoggerServer.StopGettingsLogs();
        }