示例#1
0
    public static void DrawThumbnailEndUsersTooltip(Rect position, string assetPath, GUIContent label,
                                                    List <GUIContent> endUsers, Rect assetRect)
    {
        var thumbnailImage = BRT_BuildReportWindow.GetAssetPreview(assetPath);

        if (thumbnailImage != null)
        {
            var usedBySpacing = 5;

            var thumbnailSize = BRT_BuildReportWindow.GetThumbnailSize();

            // compute end users height and width
            // then create a tooltip size that encompasses both thumbnail and end users list

            Vector2 endUsersSize = BRT_BuildReportWindow.GetEndUsersListSize(label, endUsers);
            endUsersSize.y += usedBySpacing;

            Vector2 tooltipSize = new Vector2(Mathf.Max(thumbnailSize.x, endUsersSize.x),
                                              thumbnailSize.y + endUsersSize.y);

            var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, assetRect,
                                                                tooltipSize.x, tooltipSize.y);

            // --------
            // now draw the contents

            BRT_BuildReportWindow.DrawThumbnail(tooltipRect.x, tooltipRect.y, thumbnailSize, thumbnailImage);

            var endUsersPos = tooltipRect.position;
            endUsersPos.y += thumbnailSize.y + usedBySpacing;
            BRT_BuildReportWindow.DrawEndUsersList(endUsersPos, label, endUsers);
        }
    }
示例#2
0
    public static void DrawEndUsersTooltip(Rect position, GUIContent label, List <GUIContent> endUsers, Rect assetRect)
    {
        var endUsersSize = BRT_BuildReportWindow.GetEndUsersListSize(label, endUsers);

        var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, assetRect,
                                                            endUsersSize.x, endUsersSize.y);

        BRT_BuildReportWindow.DrawEndUsersList(tooltipRect.position, label, endUsers);
    }
示例#3
0
    public static void DrawThumbnailTooltip(Rect position, string assetPath, Rect assetRect)
    {
        var thumbnailImage = BRT_BuildReportWindow.GetAssetPreview(assetPath);

        if (thumbnailImage != null)
        {
            var thumbnailSize = BRT_BuildReportWindow.GetThumbnailSize();

            var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, assetRect,
                                                                thumbnailSize.x, thumbnailSize.y);

            DrawThumbnail(tooltipRect.x, tooltipRect.y, thumbnailSize, thumbnailImage);
        }
    }
示例#4
0
        void DrawAssetList(BuildReportTool.AssetList assetList, bool usedAssets, BuildInfo buildReportToDisplay,
                           AssetDependencies assetDependencies)
        {
            if (assetList == null || assetList.TopLargest == null)
            {
                //Debug.LogError("no top ten largest");
                return;
            }

            BuildReportTool.SizePart[] assetsToShow = assetList.TopLargest;

            if (assetsToShow == null)
            {
                //Debug.LogError("no top ten largest");
                return;
            }

            bool useAlt = true;

            var newEntryHoveredIdx = -1;

            BuildReportTool.SizePart newEntryHovered = null;
            Rect newEntryHoveredRect = new Rect();
            Rect iconRect            = new Rect();
            var  hoveringOverIcon    = false;

            //var hoveringOverLabel = false;

            GUILayout.BeginHorizontal();

            // 1st column: name
            GUILayout.BeginVertical();
            for (int n = 0; n < assetsToShow.Length; ++n)
            {
                BuildReportTool.SizePart b = assetsToShow[n];

                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME;
                string iconStyleToUse = useAlt
                                                                ? BuildReportTool.Window.Settings.LIST_ICON_ALT_STYLE_NAME
                                                                : BuildReportTool.Window.Settings.LIST_ICON_STYLE_NAME;

                Texture icon = AssetDatabase.GetCachedIcon(b.Name);

                GUILayout.BeginHorizontal();
                if (icon == null)
                {
                    // no icon, just add space so it aligns with the other entries
                    GUILayout.Label(string.Empty, iconStyleToUse, GUILayout.Width(28), GUILayout.Height(30));
                }
                else
                {
                    GUILayout.Button(icon, iconStyleToUse, GUILayout.Width(28), GUILayout.Height(30));
                }

                if (Event.current.type == EventType.Repaint)
                {
                    iconRect = GUILayoutUtility.GetLastRect();

                    // if mouse is hovering over asset entry's icon (not the label)
                    // draw a border on the asset icon
                    if (iconRect.Contains(Event.current.mousePosition))
                    {
                        hoveringOverIcon    = true;
                        newEntryHoveredIdx  = n;
                        newEntryHovered     = b;
                        newEntryHoveredRect = iconRect;

                        GUI.Box(iconRect, icon, "IconHovered");
                    }
                }

                string prettyName = string.Format(" {0}. {1}", (n + 1).ToString(), BuildReportTool.Util.GetAssetFilename(b.Name));
                if (GUILayout.Button(prettyName, styleToUse, GUILayout.MinWidth(100), GUILayout.MaxWidth(400),
                                     GUILayout.Height(30)))
                {
                    Utility.PingAssetInProject(b.Name);
                }

                if (newEntryHoveredIdx == -1 && Event.current.type == EventType.Repaint)
                {
                    var labelRect = GUILayoutUtility.GetLastRect();

                    // if mouse is hovering over asset entry's label
                    // draw a border on the asset icon
                    if (labelRect.Contains(Event.current.mousePosition))
                    {
                        //hoveringOverLabel = true;
                        newEntryHoveredIdx  = n;
                        newEntryHovered     = b;
                        newEntryHoveredRect = labelRect;

                        GUI.Box(iconRect, icon, "IconHovered");
                    }
                }

                GUILayout.EndHorizontal();

                useAlt = !useAlt;
            }

            GUILayout.EndVertical();


            if (Event.current.type == EventType.Repaint)
            {
                if (usedAssets)
                {
                    _assetUsedEntryHoveredIdx = newEntryHoveredIdx;
                }
                else
                {
                    _assetUnusedEntryHoveredIdx = newEntryHoveredIdx;
                }

                if (newEntryHoveredIdx != -1)
                {
                    string hoveredAssetPath = newEntryHovered != null ? newEntryHovered.Name : null;

                    // ----------------
                    // update what is considered the hovered asset, for use later on
                    // when the tooltip will be drawn
                    BRT_BuildReportWindow.UpdateHoveredAsset(hoveredAssetPath, newEntryHoveredRect,
                                                             usedAssets, buildReportToDisplay, assetDependencies);

                    // ----------------
                    // if mouse is hovering over the correct area, we signify that
                    // the tooltip thumbnail should be drawn
                    if (BuildReportTool.Options.ShowTooltipThumbnail &&
                        (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || hoveringOverIcon) &&
                        BRT_BuildReportWindow.GetAssetPreview(hoveredAssetPath) != null)
                    {
                        _shouldShowThumbnailOnHoveredAsset = true;
                    }
                    else
                    {
                        _shouldShowThumbnailOnHoveredAsset = false;
                    }
                }
            }

            // 2nd column: size

            var useRawSize = (usedAssets && !BuildReportTool.Options.ShowImportedSizeForUsedAssets) || !usedAssets;

            useAlt = true;
            GUILayout.BeginVertical();
            for (int n = 0; n < assetsToShow.Length; ++n)
            {
                BuildReportTool.SizePart b = assetsToShow[n];

                string styleToUse = useAlt
                                                            ? BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME
                                                            : BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME;

                GUILayout.Label(useRawSize ? b.RawSize : b.ImportedSize, styleToUse, GUILayout.MaxWidth(100),
                                GUILayout.Height(30));

                useAlt = !useAlt;
            }

            GUILayout.EndVertical();
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
        }
示例#5
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);
                }
            }
        }