Beispiel #1
0
 public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, TextureData textureData,
                                  UnityBuildReport unityBuildReport)
 {
     if (unityBuildReport != null)
     {
         SelectStep(-1, unityBuildReport.BuildProcessSteps);
     }
 }
Beispiel #2
0
        public override void DrawGUI(Rect position,
                                     BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, TextureData textureData,
                                     UnityBuildReport unityBuildReport,
                                     out bool requestRepaint
                                     )
        {
            if (buildReportToDisplay == null)
            {
                requestRepaint = false;
                return;
            }

            requestRepaint = false;

            if (Event.current.type == EventType.Layout)
            {
                _hasTotalBuildSize = !string.IsNullOrEmpty(buildReportToDisplay.TotalBuildSize) &&
                                     !string.IsNullOrEmpty(buildReportToDisplay.BuildFilePath);

                _hasUsedAssetsTotalSize = !string.IsNullOrEmpty(buildReportToDisplay.UsedTotalSize);
                _hasCompressedBuildSize = !string.IsNullOrEmpty(buildReportToDisplay.CompressedBuildSize);
                _hasBuildSizes          = buildReportToDisplay.BuildSizes != null;
                _hasMonoDLLsToDisplay   = buildReportToDisplay.MonoDLLs != null && buildReportToDisplay.MonoDLLs.Length > 0;

                _hasUnityEngineDLLsToDisplay = buildReportToDisplay.UnityEngineDLLs != null &&
                                               buildReportToDisplay.UnityEngineDLLs.Length > 0;

                _hasScriptDLLsToDisplay =
                    buildReportToDisplay.ScriptDLLs != null && buildReportToDisplay.ScriptDLLs.Length > 0;
            }


            GUILayout.Space(2);             // top padding for scrollbar

            _assetListScrollPos = GUILayout.BeginScrollView(_assetListScrollPos);

            GUILayout.Space(10);             // top padding for content

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);             // extra left padding

            DrawTotalSize(buildReportToDisplay);

            GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_HORIZONTAL_SPACING);
            GUILayout.BeginVertical();

            DrawBuildSizes(buildReportToDisplay);

            GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING);

            DrawDLLList(buildReportToDisplay);

            GUILayout.EndVertical();
            GUILayout.Space(20);             // extra right padding
            GUILayout.EndHorizontal();

            GUILayout.EndScrollView();
        }
Beispiel #3
0
        public override void DrawGUI(Rect position,
                                     BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, TextureData textureData,
                                     UnityBuildReport unityBuildReport,
                                     out bool requestRepaint
                                     )
        {
            requestRepaint = false;

            GUI.SetNextControlName("BRT_HelpUnfocuser");
            GUI.TextField(new Rect(-100, -100, 10, 10), "");

            GUILayout.Space(10);             // extra top padding

            GUILayout.BeginHorizontal();
            int newSelectedHelpIdx = GUILayout.SelectionGrid(_selectedHelpContentsIdx, _helpTypeLabels, 1);

            if (newSelectedHelpIdx != _selectedHelpContentsIdx)
            {
                GUI.FocusControl("BRT_HelpUnfocuser");
            }

            _selectedHelpContentsIdx = newSelectedHelpIdx;

            //GUILayout.Space((position.width - HELP_CONTENT_WIDTH) * 0.5f);

            if (_selectedHelpContentsIdx == HELP_TYPE_README_IDX)
            {
                _readmeScrollPos = GUILayout.BeginScrollView(
                    _readmeScrollPos);

                float readmeHeight = GUI.skin.GetStyle(HELP_CONTENT_GUI_STYLE)
                                     .CalcHeight(_readmeGuiContent, HELP_CONTENT_WIDTH);

                EditorGUILayout.SelectableLabel(_readmeContents, HELP_CONTENT_GUI_STYLE,
                                                GUILayout.Width(HELP_CONTENT_WIDTH), GUILayout.Height(readmeHeight));

                GUILayout.EndScrollView();
            }
            else if (_selectedHelpContentsIdx == HELP_TYPE_CHANGELOG_IDX)
            {
                _changelogScrollPos = GUILayout.BeginScrollView(
                    _changelogScrollPos);

                float changelogHeight = GUI.skin.GetStyle(HELP_CONTENT_GUI_STYLE)
                                        .CalcHeight(_changelogGuiContent, HELP_CONTENT_WIDTH);

                EditorGUILayout.SelectableLabel(_changelogContents, HELP_CONTENT_GUI_STYLE,
                                                GUILayout.Width(HELP_CONTENT_WIDTH), GUILayout.Height(changelogHeight));

                GUILayout.EndScrollView();
            }

            GUILayout.EndHorizontal();
        }
Beispiel #4
0
        public override void DrawGUI(Rect position,
                                     BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, TextureData textureData,
                                     UnityBuildReport unityBuildReport,
                                     out bool requestRepaint
                                     )
        {
            if (buildReportToDisplay == null)
            {
                requestRepaint = false;
                return;
            }

            GUILayout.Space(2);             // top padding for scrollbar

            _scrollPos = GUILayout.BeginScrollView(_scrollPos);

            GUILayout.BeginHorizontal();
            GUILayout.Space(10);             // extra left padding


            GUILayout.BeginVertical();

            GUILayout.Space(10);             // top padding


            // report title
            GUILayout.Label(buildReportToDisplay.SuitableTitle, BuildReportTool.Window.Settings.MAIN_TITLE_STYLE_NAME);


            GUILayout.Space(10);


            // two-column layout
            GUILayout.BeginVertical();

            GUILayout.BeginHorizontal();
            // 1st column
            GUILayout.BeginVertical(GUILayout.MaxWidth(350));
            GUILayout.Label(Labels.TIME_OF_BUILD_LABEL, BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);
            GUILayout.Label(buildReportToDisplay.GetTimeReadable(),
                            BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME);

            GUILayout.Label("Project building took:", BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);
            GUILayout.Label("How long the project building took. This is the time between OnPreprocessBuild and OnPostprocessBuild.",
                            BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME);
            GUILayout.Label(buildReportToDisplay.BuildDurationTime.ToString(),
                            BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME);

            GUILayout.Label("Report generation took:", BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);
            GUILayout.Label("How long the Build Report Generation took.",
                            BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME);
            GUILayout.Label(buildReportToDisplay.ReportGenerationTime.ToString(),
                            BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME);

            if (!string.IsNullOrEmpty(buildReportToDisplay.TotalBuildSize) &&
                !string.IsNullOrEmpty(buildReportToDisplay.BuildFilePath))
            {
                GUILayout.BeginVertical();
                GUILayout.Label(Labels.BUILD_TOTAL_SIZE_LABEL, BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);

                GUILayout.Label(BuildReportTool.Util.GetBuildSizePathDescription(buildReportToDisplay),
                                BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME);

                GUILayout.Label(buildReportToDisplay.TotalBuildSize, BuildReportTool.Window.Settings.BIG_NUMBER_STYLE_NAME);
                GUILayout.EndVertical();
            }

            GUILayout.Space(20);

            string emphasisColor = "black";

            if (EditorGUIUtility.isProSkin || BRT_BuildReportWindow.FORCE_USE_DARK_SKIN)
            {
                emphasisColor = "white";
            }

            string largestAssetCategoryLabel = string.Format(
                "<color={0}><size=20><b>{1}</b></size></color> are the largest,\ntaking up <color={0}><size=20><b>{2}%</b></size></color> of the build{3}",
                emphasisColor, buildReportToDisplay.BuildSizes[0].Name,
                buildReportToDisplay.BuildSizes[0].Percentage.ToString(CultureInfo.InvariantCulture),
                (!buildReportToDisplay.HasStreamingAssets
                                         ? "\n<size=12>(not counting streaming assets)</size>"
                                         : ""));

            GUILayout.Label(largestAssetCategoryLabel, BuildReportTool.Window.Settings.INFO_TEXT_STYLE_NAME);
            GUILayout.Space(20);
            GUILayout.EndVertical();

            // 2nd column
            GUILayout.BeginVertical(GUILayout.MaxWidth(250));
            GUILayout.Label("Made for:", BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);
            GUILayout.Label(buildReportToDisplay.BuildType, BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME);

            GUILayout.Label("Built in:", BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);
            GUILayout.Label(buildReportToDisplay.UnityVersionDisplayed,
                            BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME);
            GUILayout.EndVertical();

            DrawScenesInBuild(buildReportToDisplay.ScenesInBuild);

            GUILayout.EndHorizontal();


            GUILayout.BeginHorizontal();

            var numberOfTopUsed =
                buildReportToDisplay.HasUsedAssets ? buildReportToDisplay.UsedAssets.NumberOfTopLargest : 0;
            var numberOfTopUnused = buildReportToDisplay.HasUnusedAssets
                                                        ? buildReportToDisplay.UnusedAssets.NumberOfTopLargest
                                                        : 0;

            if (Event.current.type == EventType.Layout)
            {
                _showTopUsed   = numberOfTopUsed > 0 && buildReportToDisplay.UsedAssets.TopLargest != null;
                _showTopUnused = numberOfTopUnused > 0 && buildReportToDisplay.UnusedAssets.TopLargest != null;
            }

            // 1st column
            GUILayout.BeginVertical();
            if (_showTopUsed)
            {
                GUILayout.Label(string.Format("Top {0} largest in build:", numberOfTopUsed.ToString()),
                                BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);

                if (!BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus &&
                    GUILayout.Button("Refresh", GUILayout.Height(20), GUILayout.MaxWidth(520)))
                {
                    buildReportToDisplay.RecategorizeUsedAssets();
                    buildReportToDisplay.FlagOkToRefresh();
                }

                DrawAssetList(buildReportToDisplay.UsedAssets, true, buildReportToDisplay, assetDependencies);
            }

            GUILayout.EndVertical();

            GUILayout.Space(50);

            // 2nd column
            GUILayout.BeginVertical();
            if (_showTopUnused)
            {
                GUILayout.Label(string.Format("Top {0} largest not in build:", numberOfTopUnused.ToString()),
                                BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME);

                if (!BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus &&
                    GUILayout.Button("Refresh", GUILayout.Height(20), GUILayout.MaxWidth(520)))
                {
                    buildReportToDisplay.RecategorizeUnusedAssets();
                    buildReportToDisplay.FlagOkToRefresh();
                }

                DrawAssetList(buildReportToDisplay.UnusedAssets, false, buildReportToDisplay, assetDependencies);
            }

            GUILayout.EndVertical();
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();


            GUILayout.Space(20);

            if (assetDependencies != null && !string.IsNullOrEmpty(assetDependencies.SavedPath))
            {
                GUILayout.Label("Asset Dependencies file used:",
                                BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME);
                GUILayout.Label(assetDependencies.SavedPath,
                                BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME);

                GUILayout.Space(10);
            }

            if (textureData != null && !string.IsNullOrEmpty(textureData.SavedPath))
            {
                GUILayout.Label("Texture Data file used:",
                                BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME);
                GUILayout.Label(textureData.SavedPath,
                                BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME);

                GUILayout.Space(10);
            }

            if (unityBuildReport != null && !string.IsNullOrEmpty(unityBuildReport.SavedPath))
            {
                GUILayout.Label("Additional Unity Build Report file used:",
                                BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME);
                GUILayout.Label(unityBuildReport.SavedPath,
                                BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME);

                GUILayout.Space(10);
            }

            GUILayout.Space(20);

            GUILayout.EndVertical();

            GUILayout.Space(20);             // extra right padding
            GUILayout.EndHorizontal();

            GUILayout.EndScrollView();

            // ------------------------------------------------------

            // Continually request repaint, since we need to check the rects
            // generated by the GUILayout (using GUILayoutUtility.GetLastRect())
            // to make the hover checks work. That's because GetLastRect() only
            // works during repaint event.
            //
            // Later checks below can set requestRepaint to false if there's no
            // need to repaint, to help lessen cpu usage.
            requestRepaint = true;

            if (Event.current.mousePosition.y >= position.height ||
                Event.current.mousePosition.y <= 0 ||
                Event.current.mousePosition.x <= 0 ||
                Event.current.mousePosition.x >= position.width)
            {
                // mouse is outside the window, no need to repaint, can't show tooltip anyway
                // set requestRepaint to false to help lessen cpu usage
                requestRepaint = false;
            }

            var showThumbnailNow = BuildReportTool.Options.ShowTooltipThumbnail &&
                                   _shouldShowThumbnailOnHoveredAsset &&
                                   (_assetUsedEntryHoveredIdx != -1 || _assetUnusedEntryHoveredIdx != -1);

            var zoomInChanged = false;

            if (showThumbnailNow)
            {
                var prevZoomedIn = BRT_BuildReportWindow.ZoomedInThumbnails;

                // if thumbnail is currently showing, we process the inputs
                // (ctrl zooms in on thumbnail, alt toggles alpha blend)
                BRT_BuildReportWindow.ProcessThumbnailControls();

                if (prevZoomedIn != BRT_BuildReportWindow.ZoomedInThumbnails)
                {
                    zoomInChanged = true;
                }
            }
            else
            {
                // no thumbnail currently shown. ensure the controls that
                // need to be reset to initial state are reset
                BRT_BuildReportWindow.ResetThumbnailControls();
            }

            if (!zoomInChanged && !Event.current.alt &&
                !BRT_BuildReportWindow.MouseMovedNow && !BRT_BuildReportWindow.LastMouseMoved)
            {
                // mouse hasn't moved, and no request to zoom-in thumbnail or toggle thumbnail alpha
                // no need to repaint because nothing has changed
                // set requestRepaint to false to help lessen cpu usage
                requestRepaint = false;
            }

            var shouldShowAssetEndUsersTooltipNow = BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable &&
                                                    BRT_BuildReportWindow.ShouldHoveredAssetShowEndUserTooltip(
                assetDependencies) &&
                                                    (_assetUsedEntryHoveredIdx != -1 || _assetUnusedEntryHoveredIdx != -1);

            if (Event.current.type == EventType.Repaint)
            {
                if (showThumbnailNow && shouldShowAssetEndUsersTooltipNow)
                {
                    // draw thumbnail and end users below it
                    BRT_BuildReportWindow.DrawThumbnailEndUsersTooltip(position, assetDependencies, textureData);
                }
                else if (shouldShowAssetEndUsersTooltipNow)
                {
                    // draw only end users in tooltip
                    BRT_BuildReportWindow.DrawEndUsersTooltip(position, assetDependencies);
                }
                else if (showThumbnailNow)
                {
                    // draw only thumbnail in tooltip
                    BRT_BuildReportWindow.DrawThumbnailTooltip(position, textureData);
                }
            }
        }
Beispiel #5
0
 public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, TextureData textureData, UnityBuildReport unityBuildReport)
 {
 }
Beispiel #6
0
 public abstract void DrawGUI(Rect position,
                              BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, TextureData textureData,
                              UnityBuildReport unityBuildReport,
                              out bool requestRepaint
                              );
Beispiel #7
0
 public abstract void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, TextureData textureData, UnityBuildReport unityBuildReport);
Beispiel #8
0
        public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, TextureData textureData, UnityBuildReport unityBuildReport)
        {
            const string README_FILENAME = "README.txt";

            _readmeContents = BuildReportTool.Util.GetPackageFileContents(README_FILENAME);

            const string CHANGELOG_FILENAME = "VERSION.txt";

            _changelogContents = BuildReportTool.Util.GetPackageFileContents(CHANGELOG_FILENAME);


            if (_readmeContents.Length > LABEL_LENGTH)
            {
                _readmeContents = _readmeContents.Substring(0, LABEL_LENGTH);
            }

            if (_changelogContents.Length > LABEL_LENGTH)
            {
                _changelogContents = _changelogContents.Substring(0, LABEL_LENGTH);
            }

            if (_readmeGuiContent == null)
            {
                _readmeGuiContent = new GUIContent(_readmeContents);
            }

            if (_changelogGuiContent == null)
            {
                _changelogGuiContent = new GUIContent(_changelogContents);
            }
        }
Beispiel #9
0
        // ================================================================================================

        public override void DrawGUI(Rect position, BuildInfo buildReportToDisplay, AssetDependencies assetDependencies,
                                     TextureData textureData, UnityBuildReport unityBuildReport, out bool requestRepaint)
        {
            requestRepaint = false;
            if (unityBuildReport == null)
            {
                return;
            }

            if (_logIcon == null)
            {
                var logIcons = GUI.skin.FindStyle("LogMessageIcons");
                if (logIcons != null)
                {
                    _logIcon   = logIcons.normal.background;
                    _warnIcon  = logIcons.hover.background;
                    _errorIcon = logIcons.active.background;

                    _logFilterLabel.image   = _logIcon;
                    _warnFilterLabel.image  = _warnIcon;
                    _errorFilterLabel.image = _errorIcon;
                }
            }

            if (_indentLine == null)
            {
                _indentLine = GUI.skin.GetStyle("IndentStyle1").normal.background;
            }
            Texture2D prevArrow = GUI.skin.GetStyle(BuildReportTool.Window.Settings.BIG_LEFT_ARROW_ICON_STYLE_NAME).normal.background;
            Texture2D nextArrow = GUI.skin.GetStyle(BuildReportTool.Window.Settings.BIG_RIGHT_ARROW_ICON_STYLE_NAME).normal.background;

            var steps = unityBuildReport.BuildProcessSteps;

            if (steps == null)
            {
                return;
            }

            // --------------------------------

            #region Steps
            float height    = position.height * _buildStepsHeightPercent;
            var   maxHeight = (steps.Length + 1) * 20;
            if (height > maxHeight)
            {
                height = maxHeight;
            }
            GUILayout.BeginHorizontal(GUILayout.Height(height));

            #region Column 1 (Step Name)
            GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone);
            GUILayout.Label("Step", BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME);
            _scrollPos = GUILayout.BeginScrollView(_scrollPos,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME, BRT_BuildReportWindow.LayoutNone);

            bool useAlt = true;
            for (int i = 0; i < steps.Length; ++i)
            {
                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME;
                if (i == _selectedStepIdx)
                {
                    styleToUse = BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME;
                }

                GUILayout.BeginHorizontal(styleToUse);
                GUILayout.Space(steps[i].Depth * 20);
                if (GUILayout.Button(steps[i].Name, styleToUse, BRT_BuildReportWindow.LayoutListHeight))
                {
                    SelectStep(i, steps);
                }
                GUILayout.EndHorizontal();
                if (Event.current.type == EventType.Repaint)
                {
                    Rect labelRect = GUILayoutUtility.GetLastRect();

                    var prevColor = GUI.color;
                    GUI.color = new Color(0, 0, 0, 0.5f);
                    for (int indentN = 0, indentLen = steps[i].Depth;
                         indentN < indentLen;
                         ++indentN)
                    {
                        var indentRect = new Rect((indentN * 20), labelRect.y, 20, labelRect.height);
                        GUI.DrawTexture(indentRect, _indentLine, ScaleMode.ScaleAndCrop);
                    }

                    GUI.color = prevColor;
                }

                useAlt = !useAlt;
            }

            GUILayout.EndScrollView();
            GUILayout.EndVertical();
            #endregion

            #region Column 2 (Warning Count)
            GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone);
            GUILayout.Label("Warning Count", BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME);
            _scrollPos = GUILayout.BeginScrollView(_scrollPos,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME, BRT_BuildReportWindow.LayoutNone);
            useAlt = true;
            for (int i = 0; i < steps.Length; ++i)
            {
                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME;
                if (i == _selectedStepIdx)
                {
                    styleToUse = BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME;
                }

                if (steps[i].WarnLogCount > 0)
                {
                    if (GUILayout.Button(steps[i].WarnLogCount.ToString(), styleToUse, BRT_BuildReportWindow.LayoutListHeight))
                    {
                        SelectStep(i, steps);
                    }
                }
                else
                {
                    GUILayout.Label(GUIContent.none, styleToUse, BRT_BuildReportWindow.LayoutListHeight);
                }
                useAlt = !useAlt;
            }
            GUILayout.EndScrollView();
            GUILayout.EndVertical();
            #endregion

            #region Column 3 (Error Count)
            GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone);
            GUILayout.Label("Error Count", BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME);
            _scrollPos = GUILayout.BeginScrollView(_scrollPos,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME, BRT_BuildReportWindow.LayoutNone);
            useAlt = true;
            for (int i = 0; i < steps.Length; ++i)
            {
                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME;
                if (i == _selectedStepIdx)
                {
                    styleToUse = BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME;
                }

                if (steps[i].ErrorLogCount > 0)
                {
                    if (GUILayout.Button(steps[i].ErrorLogCount.ToString(), styleToUse, BRT_BuildReportWindow.LayoutListHeight))
                    {
                        SelectStep(i, steps);
                    }
                }
                else
                {
                    GUILayout.Label(GUIContent.none, styleToUse, BRT_BuildReportWindow.LayoutListHeight);
                }
                useAlt = !useAlt;
            }
            GUILayout.EndScrollView();
            GUILayout.EndVertical();
            #endregion

            #region Last Column (Duration)
            GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone);
            GUILayout.Label("Duration", BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME);
            _scrollPos = GUILayout.BeginScrollView(_scrollPos,
                                                   BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME,
                                                   "verticalscrollbar", BRT_BuildReportWindow.LayoutNone);


            useAlt = true;
            for (int i = 0; i < steps.Length; ++i)
            {
                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME;
                if (i == _selectedStepIdx)
                {
                    styleToUse = BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME;
                }

                string duration;
                if (i == 0)
                {
                    duration = unityBuildReport.TotalBuildTime.ToReadableString();
                }
                else
                {
                    duration = steps[i].Duration.ToReadableString();
                }

                GUILayout.Label(duration, styleToUse, BRT_BuildReportWindow.LayoutListHeight);

                useAlt = !useAlt;
            }

            GUILayout.EndScrollView();
            GUILayout.EndVertical();
            #endregion

            GUILayout.EndHorizontal();
            if (Event.current.type == EventType.Repaint)
            {
                _stepsViewRect = GUILayoutUtility.GetLastRect();
            }
            #endregion

            // --------------------------------

            #region Logs
            GUILayout.BeginHorizontal();

            GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone);

            #region Logs Toolbar
            GUILayout.BeginHorizontal(BuildReportTool.Window.Settings.TOP_BAR_BG_STYLE_NAME, BRT_BuildReportWindow.LayoutHeight18);
            GUILayout.Space(10);
            string logMessagesTitle;
            bool   hasStepSelected = _selectedStepIdx != -1 &&
                                     steps[_selectedStepIdx].BuildLogMessages != null &&
                                     steps[_selectedStepIdx].BuildLogMessages.Length > 0;
            if (hasStepSelected)
            {
                logMessagesTitle = string.Format("Log Messages of: <i>{0}</i>", steps[_selectedStepIdx].Name);
            }
            else
            {
                logMessagesTitle = "Log Messages (Total)";
            }
            GUILayout.Label(logMessagesTitle, BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME, BRT_BuildReportWindow.LayoutNoExpandWidth);
            if (Event.current.type == EventType.Repaint)
            {
                _dividerRect = GUILayoutUtility.GetLastRect();
            }
            GUILayout.FlexibleSpace();

            int messagePaginationLength = BuildReportTool.Options.LogMessagePaginationLength;

            if (GUILayout.Button(prevArrow, BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME,
                                 BRT_BuildReportWindow.LayoutNone) &&
                (_logMessageToShowStartOffset - messagePaginationLength >= 0))
            {
                _logMessageToShowStartOffset -= messagePaginationLength;
            }
            if (Event.current.type == EventType.Repaint)
            {
                var prevArrowRect = GUILayoutUtility.GetLastRect();
                _dividerRect.xMax = prevArrowRect.x;
            }

            string paginateLabel;
            if (_showPageNumbers)
            {
                int totalPageNumbers = _totalVisibleMessageCount / messagePaginationLength;
                if (_totalVisibleMessageCount % messagePaginationLength > 0)
                {
                    ++totalPageNumbers;
                }

                // the max number of digits for the displayed offset counters
                string assetCountDigitNumFormat = string.Format("D{0}", totalPageNumbers.ToString().Length.ToString());

                paginateLabel = string.Format("Page {0} of {1}",
                                              ((_logMessageToShowStartOffset / messagePaginationLength) + 1).ToString(assetCountDigitNumFormat),
                                              totalPageNumbers.ToString());
            }
            else
            {
                // number of assets in current page
                int pageLength = Mathf.Min(_logMessageToShowStartOffset + messagePaginationLength, _totalVisibleMessageCount);

                int offsetNonZeroBased = _logMessageToShowStartOffset + (pageLength > 0 ? 1 : 0);

                // the max number of digits for the displayed offset counters
                string assetCountDigitNumFormat = string.Format("D{0}", _totalVisibleMessageCount.ToString().Length.ToString());

                paginateLabel = string.Format("Page {0} - {1} of {2}",
                                              offsetNonZeroBased.ToString(assetCountDigitNumFormat),
                                              pageLength.ToString(assetCountDigitNumFormat),
                                              _totalVisibleMessageCount.ToString(assetCountDigitNumFormat));
            }

            if (GUILayout.Button(paginateLabel, BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME,
                                 BRT_BuildReportWindow.LayoutNone))
            {
                _showPageNumbers = !_showPageNumbers;
            }

            if (GUILayout.Button(nextArrow, BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME,
                                 BRT_BuildReportWindow.LayoutNone) &&
                (_logMessageToShowStartOffset + messagePaginationLength < _totalVisibleMessageCount))
            {
                _logMessageToShowStartOffset += messagePaginationLength;
            }

            GUILayout.Space(8);

            var newShowLogMessagesCollapsed = GUILayout.Toggle(_showLogMessagesCollapsed, "Collapse",
                                                               BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME, BRT_BuildReportWindow.LayoutNoExpandWidth);
            if (newShowLogMessagesCollapsed != _showLogMessagesCollapsed)
            {
                _showLogMessagesCollapsed = newShowLogMessagesCollapsed;
                RefreshTotalVisibleMessageCount();
            }
            GUILayout.Space(8);
            bool newShowLogMessages = GUILayout.Toggle(_showLogMessages, _logFilterLabel,
                                                       BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME, BRT_BuildReportWindow.LayoutNoExpandWidth);
            bool newShowWarnMessages = GUILayout.Toggle(_showWarnMessages, _warnFilterLabel,
                                                        BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME, BRT_BuildReportWindow.LayoutNoExpandWidth);
            bool newShowErrorMessages = GUILayout.Toggle(_showErrorMessages, _errorFilterLabel,
                                                         BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME, BRT_BuildReportWindow.LayoutNoExpandWidth);
            if (newShowLogMessages != _showLogMessages)
            {
                _showLogMessages = newShowLogMessages;
                RefreshTotalVisibleMessageCount();
            }
            if (newShowWarnMessages != _showWarnMessages)
            {
                _showWarnMessages = newShowWarnMessages;
                RefreshTotalVisibleMessageCount();
            }
            if (newShowErrorMessages != _showErrorMessages)
            {
                _showErrorMessages = newShowErrorMessages;
                RefreshTotalVisibleMessageCount();
            }
            GUILayout.Space(8);
            GUILayout.EndHorizontal();

            EditorGUIUtility.AddCursorRect(_dividerRect, MouseCursor.ResizeVertical);
            #endregion

            if (Event.current.type == EventType.MouseDown &&
                Event.current.button == 0 &&
                _dividerRect.Contains(Event.current.mousePosition))
            {
                _draggingDivider          = true;
                _mouseYOnDividerDragStart = Event.current.mousePosition.y;
                _heightOnDividerDragStart = height;
                requestRepaint            = true;
            }

            if (Event.current.type == EventType.MouseUp)
            {
                _draggingDivider = false;
                requestRepaint   = true;
            }

            if (_draggingDivider)
            {
                var newHeight = _heightOnDividerDragStart + (Event.current.mousePosition.y - _mouseYOnDividerDragStart);
                _buildStepsHeightPercent = newHeight / position.height;
                requestRepaint           = true;
            }

            _logMessagesScrollPos = GUILayout.BeginScrollView(_logMessagesScrollPos,
                                                              BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME,
                                                              "verticalscrollbar", BRT_BuildReportWindow.LayoutNone);

            if (_showLogMessages || _showWarnMessages || _showErrorMessages)
            {
                if (hasStepSelected)
                {
                    BuildLogMessage[] messages;
                    if (_showLogMessagesCollapsed)
                    {
                        messages = steps[_selectedStepIdx].CollapsedBuildLogMessages;
                    }
                    else
                    {
                        messages = steps[_selectedStepIdx].BuildLogMessages;
                    }

                    int totalToShow = 0;
                    if (_showLogMessages)
                    {
                        totalToShow += steps[_selectedStepIdx].InfoLogCount;
                    }
                    if (_showWarnMessages)
                    {
                        totalToShow += steps[_selectedStepIdx].WarnLogCount;
                    }
                    if (_showErrorMessages)
                    {
                        totalToShow += steps[_selectedStepIdx].ErrorLogCount;
                    }

                    if (totalToShow > 0)
                    {
                        useAlt = true;

                        int messageToStartIdx = 0;

                        int messageToStartCount = 0;
                        for (int m = 0; m < messages.Length; ++m)
                        {
                            var logTypeIcon = GetLogIcon(messages[m].LogType);
                            if (logTypeIcon == _logIcon && !_showLogMessages)
                            {
                                continue;
                            }
                            if (logTypeIcon == _warnIcon && !_showWarnMessages)
                            {
                                continue;
                            }
                            if (logTypeIcon == _errorIcon && !_showErrorMessages)
                            {
                                continue;
                            }

                            ++messageToStartCount;
                            if (messageToStartCount - 1 == _logMessageToShowStartOffset)
                            {
                                messageToStartIdx = m;
                                break;
                            }
                        }

                        DrawMessages(messages, messageToStartIdx, messagePaginationLength,
                                     _selectedStepIdx, 0, ref useAlt, ref requestRepaint);
                    }
                }
                else
                {
                    useAlt = true;

                    int messageToStartIdx = 0;
                    int stepToStartIdx    = 0;

                    int messageToStartCount = 0;
                    for (int s = 0; s < steps.Length; ++s)
                    {
                        var step = steps[s];

                        BuildLogMessage[] messages;
                        if (_showLogMessagesCollapsed)
                        {
                            messages = step.CollapsedBuildLogMessages;
                        }
                        else
                        {
                            messages = step.BuildLogMessages;
                        }

                        if (messages == null || messages.Length == 0)
                        {
                            continue;
                        }

                        int totalToShow = 0;
                        if (_showLogMessages)
                        {
                            totalToShow += step.InfoLogCount;
                        }

                        if (_showWarnMessages)
                        {
                            totalToShow += step.WarnLogCount;
                        }

                        if (_showErrorMessages)
                        {
                            totalToShow += step.ErrorLogCount;
                        }

                        if (totalToShow == 0)
                        {
                            continue;
                        }

                        for (int m = 0; m < messages.Length; ++m)
                        {
                            var logTypeIcon = GetLogIcon(messages[m].LogType);
                            if (logTypeIcon == _logIcon && !_showLogMessages)
                            {
                                continue;
                            }

                            if (logTypeIcon == _warnIcon && !_showWarnMessages)
                            {
                                continue;
                            }

                            if (logTypeIcon == _errorIcon && !_showErrorMessages)
                            {
                                continue;
                            }

                            ++messageToStartCount;
                            if (messageToStartCount - 1 == _logMessageToShowStartOffset)
                            {
                                messageToStartIdx = m;
                                stepToStartIdx    = s;
                                break;
                            }
                        }
                    }

                    int totalShownSoFar = 0;
                    for (int s = stepToStartIdx; s < steps.Length; ++s)
                    {
                        var step = steps[s];

                        BuildLogMessage[] messages;
                        if (_showLogMessagesCollapsed)
                        {
                            messages = step.CollapsedBuildLogMessages;
                        }
                        else
                        {
                            messages = step.BuildLogMessages;
                        }

                        if (messages == null || messages.Length == 0)
                        {
                            continue;
                        }

                        int totalToShow = 0;
                        if (_showLogMessages)
                        {
                            if (_showLogMessagesCollapsed)
                            {
                                totalToShow += step.CollapsedInfoLogCount;
                            }
                            else
                            {
                                totalToShow += step.InfoLogCount;
                            }
                        }
                        if (_showWarnMessages)
                        {
                            if (_showLogMessagesCollapsed)
                            {
                                totalToShow += step.CollapsedWarnLogCount;
                            }
                            else
                            {
                                totalToShow += step.WarnLogCount;
                            }
                        }
                        if (_showErrorMessages)
                        {
                            if (_showLogMessagesCollapsed)
                            {
                                totalToShow += step.CollapsedErrorLogCount;
                            }
                            else
                            {
                                totalToShow += step.ErrorLogCount;
                            }
                        }

                        if (totalToShow == 0)
                        {
                            continue;
                        }

                        string styleToUse = useAlt
                                                                            ? BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME
                                                                            : BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME;

                        GUILayout.BeginHorizontal(styleToUse, BRT_BuildReportWindow.LayoutNone);
                        GUILayout.Space(8);
                        GUILayout.Button(step.Name, styleToUse, BRT_BuildReportWindow.LayoutHeight25);
                        GUILayout.EndHorizontal();

                        useAlt = !useAlt;

                        DrawMessages(messages, messageToStartIdx, messagePaginationLength - totalShownSoFar,
                                     s, 20, ref useAlt, ref requestRepaint);

                        totalShownSoFar += totalToShow;

                        if (totalShownSoFar >= messagePaginationLength)
                        {
                            break;
                        }
                    }
                }
            }

            GUILayout.EndScrollView();
            GUILayout.EndVertical();

            GUILayout.EndHorizontal();
            #endregion

            // if clicked on nothing interactable, then remove selection
            if (GUI.Button(_stepsViewRect, GUIContent.none, "HiddenScrollbar"))
            {
                SelectStep(-1, steps);
            }
        }