public string GetTotalSizeString(HierarchyMode a_mode)
        {
            long size      = a_mode == HierarchyMode.Flat ? m_bytes : m_totalBytesWithDeps;
            long totalSize = size * References;

            if (m_cachedTotalSizeString == null || m_cachedTotalSize != totalSize)
            {
                m_cachedTotalSize       = totalSize;
                m_cachedTotalSizeString = IntToSizeString(totalSize);
            }

            return(m_cachedTotalSizeString);
        }
    private void UpdateAssetsOrdered(HierarchyMode a_mainPaneMode)
    {
        switch (a_mainPaneMode)
        {
        case HierarchyMode.Flat:
            CalculateAssetSize();
            break;

        case HierarchyMode.Recurse:
            CalculateAssetSizeRecursive();
            break;
        }
    }
    private void SelectedDeps()
    {
        GUILayout.BeginHorizontal(EditorStyles.toolbar);
        {
            m_assetListSearch.OnGUI();

            var hierarchyMode = (HierarchyMode)EditorGUILayout.EnumPopup(m_selectedDepsMode, EditorStyles.toolbarPopup);
            if (hierarchyMode != m_mainPaneMode)
            {
                m_selectedDepsMode = hierarchyMode;
                UpdateSelectedDeps();
            }
        }
        GUILayout.EndHorizontal();

        if (m_selectedDepsOrdered == null || !m_selectedDepsOrdered.Any())
        {
            GUILayout.BeginHorizontal();
            {
                GUILayout.FlexibleSpace();
            }
            GUILayout.EndHorizontal();
            GUILayout.FlexibleSpace();
            return;
        }

        int totalWidth     = m_upperHorizontalSplit.realSizes[2] - 36; // scrollbar width
        var assetWidth     = totalWidth * 0.8f;
        var totalSizeWidth = totalWidth * 0.2f;

        GUILayout.BeginHorizontal();
        {
            GUILayout.Label("Asset", m_columnHeaderStyle, GUILayout.Width(assetWidth));
            GUILayout.Label("Size", m_columnHeaderStyle, GUILayout.Width(totalSizeWidth));
            GUILayout.Label("", m_columnHeaderStyle);
        }
        GUILayout.EndHorizontal();

        m_scrollPositionSelectedDeps = EditorGUILayout.BeginScrollView(m_scrollPositionSelectedDeps);
        {
            foreach (var asset in m_selectedDepsOrdered)
            {
                GUILayout.BeginHorizontal();
                var assetPath = m_stripPath ? asset.m_strippedPath : asset.m_shortPath;
                GUILayout.Label(assetPath, GUILayout.Width(assetWidth));
                GUILayout.Label(asset.GetSizeString(m_selectedDepsMode), GUILayout.Width(totalSizeWidth));
                GUILayout.EndHorizontal();
            }
        }
        EditorGUILayout.EndScrollView();
    }
    private void AssetListPane()
    {
        GUILayout.BeginHorizontal(EditorStyles.toolbar);
        {
            m_assetListSearch.OnGUI();

            var mainPaneMode = (HierarchyMode)EditorGUILayout.EnumPopup(m_mainPaneMode, EditorStyles.toolbarPopup);
            if (mainPaneMode != m_mainPaneMode)
            {
                UpdateAssetsOrdered(mainPaneMode);
                m_mainPaneMode = mainPaneMode;
            }
        }
        GUILayout.EndHorizontal();

        if (m_assetsOrdered == null)
        {
            return;
        }

        int totalWidth     = m_upperHorizontalSplit.realSizes[1] - 40; // scrollbar width
        var assetWidth     = totalWidth * 0.8f;
        var refWidth       = totalWidth * 0.05f;
        var totalSizeWidth = totalWidth * 0.15f;

        GUILayout.BeginHorizontal();
        {
            GUILayout.Label("Asset", m_columnHeaderStyle, GUILayout.Width(assetWidth));
            GUILayout.Label("#", m_columnHeaderStyle, GUILayout.Width(refWidth));
            GUILayout.Label("Size", m_columnHeaderStyle, GUILayout.Width(totalSizeWidth));
            GUILayout.Label("", m_columnHeaderStyle);
        }
        GUILayout.EndHorizontal();

        m_scrollPositionLeftPane = EditorGUILayout.BeginScrollView(m_scrollPositionLeftPane);
        {
            var count     = Mathf.Min(m_assetsOrdered.Count, 100);
            var displayed = 0;
            for (var index = 0; index < m_assetsOrdered.Count && displayed < count; index++)
            {
                var asset = m_assetsOrdered[index];
                if (!m_showSingles && asset.References == 1)
                {
                    continue;
                }

                var assetPath = m_stripPath ? asset.m_strippedPath : asset.m_shortPath;
                if (!m_assetListSearch.Check(assetPath))
                {
                    continue;
                }

                displayed++;

                GUILayout.BeginHorizontal();
                {
                    var selected    = m_selected.Contains(asset);
                    var nowSelected = GUILayout.Toggle(selected, assetPath, GUILayout.Width(assetWidth));
                    GUILayout.Label(asset.ReferencesString, GUILayout.Width(refWidth));
                    GUILayout.Label(asset.GetTotalSizeString(m_mainPaneMode), GUILayout.Width(totalSizeWidth));

                    if (selected != nowSelected)
                    {
                        if (nowSelected)
                        {
                            UpdateSelected(asset, true);
                        }
                        else
                        {
                            UpdateSelected(asset, false);
                        }
                    }
                }
                GUILayout.EndHorizontal();
            }
        }
        EditorGUILayout.EndScrollView();
    }
    private void OnGUI()
    {
        if (m_assets == null)
        {
            if (GUILayout.Button("Load Data"))
            {
                EditorUtility.DisplayProgressBar("Loading", "Please Wait", 0f);

                CalculateAssetsAndBundles();
                LoadAssetSizes();
                CalculateReferencedBundles();
                UpdateAssetSizeRecursive();

                m_mainPaneMode = HierarchyMode.Recurse;
                UpdateAssetsOrdered(m_mainPaneMode);

                CalculateBundleSize();
                CalculateTotalBundleSize();
                CalculateTotalAssetSize();

                BuildGroupSizes();

                EditorUtility.ClearProgressBar();

                m_columnHeaderStyle           = new GUIStyle("dockArea");
                m_columnHeaderStyle.alignment = TextAnchor.MiddleLeft;
                m_columnHeaderStyle.padding   = new RectOffset(10, 0, 0, 0);
                m_columnHeaderStyle.fontStyle = FontStyle.Bold;

                m_foldoutStyle = new GUIStyle("IN Foldout");
            }
        }
        else
        {
            Toolbar();

            SplitterGUILayout.BeginVerticalSplit(m_mainVerticalSplit);
            {
                SplitterGUILayout.BeginHorizontalSplit(m_upperHorizontalSplit);
                {
                    EditorGUILayout.BeginVertical("box");
                    {
                        GroupPane();
                    }
                    EditorGUILayout.EndVertical();

                    EditorGUILayout.BeginVertical("box");
                    {
                        AssetListPane();
                    }
                    EditorGUILayout.EndVertical();

                    EditorGUILayout.BeginHorizontal();
                    {
                        if (!m_selected.Any())
                        {
                            EditorGUILayout.BeginVertical("box");
                            {
                                GUILayout.BeginHorizontal();
                                {
                                    GUILayout.FlexibleSpace();
                                }
                                GUILayout.EndHorizontal();
                                GUILayout.FlexibleSpace();
                            }
                            EditorGUILayout.EndVertical();
                        }
                        else
                        {
                            SplitterGUILayout.BeginVerticalSplit(m_depVerticalSplit);
                            {
                                EditorGUILayout.BeginVertical("box");
                                {
                                    ReverseDepTree();
                                }
                                EditorGUILayout.EndVertical();

                                EditorGUILayout.BeginVertical("box");
                                {
                                    SelectedDeps();
                                }
                                EditorGUILayout.EndVertical();

                                EditorGUILayout.BeginVertical("box");
                                {
                                    SelectedReferencedBundles();
                                }
                                EditorGUILayout.EndVertical();
                            }
                            SplitterGUILayout.EndVerticalSplit();
                        }
                    }
                    EditorGUILayout.EndHorizontal();
                }
                SplitterGUILayout.EndHorizontalSplit();

                SplitterGUILayout.BeginHorizontalSplit(m_lowerHorizontalSplit);
                {
                    EditorGUILayout.BeginVertical("box");
                    {
                        BundlePane();
                    }
                    EditorGUILayout.EndVertical();

                    EditorGUILayout.BeginVertical("box");
                    {
                        AssetPane();
                    }
                    EditorGUILayout.EndVertical();
                }
                SplitterGUILayout.EndHorizontalSplit();
            }
            SplitterGUILayout.EndVerticalSplit();

            DisplayBottomBar();
        }
    }
 public string GetSizeString(HierarchyMode a_mode)
 {
     return(a_mode == HierarchyMode.Flat ? FlatSizeString : RecurseSizeString);
 }
    private void AssetPane()
    {
        if (m_selectedAssetBundle == null)
        {
            GUILayout.BeginHorizontal();
            {
                GUILayout.FlexibleSpace();
            }
            GUILayout.EndHorizontal();
            GUILayout.FlexibleSpace();
            return;
        }

        GUILayout.BeginHorizontal(EditorStyles.toolbar);
        {
            m_assetSearch.OnGUI();

            var hierarchyMode = (HierarchyMode)EditorGUILayout.EnumPopup(m_assetPaneMode, EditorStyles.toolbarPopup);
            if (hierarchyMode != m_assetPaneMode)
            {
                m_assetPaneMode = hierarchyMode;
            }

            GUILayout.FlexibleSpace();
        }
        GUILayout.EndHorizontal();

        int totalWidth     = m_lowerHorizontalSplit.realSizes[1] - 54; // scrollbar width
        var assetWidth     = totalWidth * 0.8f;
        var refWidth       = totalWidth * 0.05f;
        var totalSizeWidth = totalWidth * 0.15f;

        GUILayout.BeginHorizontal();
        {
            GUILayout.Label("Asset", m_columnHeaderStyle, GUILayout.Width(assetWidth));
            GUILayout.Label("#", m_columnHeaderStyle, GUILayout.Width(refWidth));
            GUILayout.Label("Size", m_columnHeaderStyle, GUILayout.Width(totalSizeWidth));
            GUILayout.Label("", m_columnHeaderStyle);
        }
        GUILayout.EndHorizontal();

        m_scrollPositionAssetPane = EditorGUILayout.BeginScrollView(m_scrollPositionAssetPane);
        {
            for (var i = 0; i < m_selectedAssetBundle.m_directAssets.Count; ++i)
            {
                var asset = m_selectedAssetBundle.m_directAssets[i];

                var color = GUI.color;
                if (m_selectedAssetBundle.m_name.StartsWith("shared_") && asset.Parents == 0)
                {
                    GUI.color = Color.yellow;
                }

                AssetPaneAsset(asset, "", assetWidth, refWidth, totalSizeWidth, 0, m_assetCollapsed, m_assetVisited);

                GUI.color = color;
            }
            m_assetVisited.Clear();
        }
        EditorGUILayout.EndScrollView();
    }