Esempio n. 1
0
        private List <BluDetailWindowCell> GetCells(BluLog log)
        {
            var cells = new List <BluDetailWindowCell>(1 + log.StackTrace.Count);

            cells.Add(new BluDetailWindowCell(
                          message: log.Message,
                          selectedMessageWhenClicked: 0,
                          stackTraceIndex: 0,
                          messageStyle: BluConsoleSkin.MessageDetailCallstackStyle,
                          backgroundStyle: BluConsoleSkin.GetLogBackStyle(1)
                          ));

            for (int i = 0; i < log.StackTrace.Count; i++)
            {
                cells.Add(new BluDetailWindowCell(
                              message: log.StackTrace[i].FrameInformation,
                              selectedMessageWhenClicked: i + 1,
                              stackTraceIndex: i,
                              messageStyle: BluConsoleSkin.MessageDetailCallstackStyle,
                              backgroundStyle: BluConsoleSkin.GetLogBackStyle(1)
                              ));
            }

            return(cells);
        }
        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();
        }