static void PackAllSpriteAtlases()
        {
            ConfigRoot config = LoadAtlasConfig();

            if (config == null)
            {
                return;
            }
            AtlasSetting[] settings = config.atlasSettings;
            if (settings == null)
            {
                return;
            }
            for (int i = 0, imax = settings.Length; i < imax; i++)
            {
                AtlasSetting setting = settings[i];
                Pack(true, setting.texturesFolder, setting.atlasPath, setting.padding, setting.maxSize,
                     setting.trimAlpha, setting.unityPacking, setting.forceSquare);
            }
        }
        void OnGUI()
        {
            if (!mGUIStyleInited)
            {
                mGUIStyleInited    = true;
                mStyleTextArea     = GUI.skin.FindStyle("TextArea") ?? GUI.skin.FindStyle("AS TextArea");
                mStyleBoldLabel    = "BoldLabel";
                mStyleSearch       = "SearchTextField";
                mStyleSearchCancel = "SearchCancelButton";
                mStyleWhiteLabel   = "WhiteLabel";
            }
            if (mSettings == null)
            {
                mSettings = new List <AtlasSetting>();
                mSettings.AddRange(LoadAtlasConfig().atlasSettings);
                mDefaultUnityPacking = default_unity_packing;
                mDefaultForceSquare  = default_force_square;
                mDefaultTrimAlpha    = default_trim_alpha;
                mDefaultPadding      = default_padding;
                mDefaultMaxSize      = default_max_size;
            }
            Color cachedColor;

            GUILayout.Space(2f);
            EditorGUILayout.LabelField("Default Settings :", mStyleBoldLabel);
            EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(10f));
            GUILayout.Space(12f);
            EditorGUILayout.BeginHorizontal(mStyleTextArea, GUILayout.MinHeight(10f));
            GUILayout.Space(4f);
            EditorGUILayout.BeginVertical();
            EditorGUI.BeginChangeCheck();
            mDefaultUnityPacking = EditorGUILayout.ToggleLeft(" unity packing", mDefaultUnityPacking, GUILayout.Width(140f));
            if (EditorGUI.EndChangeCheck())
            {
                default_unity_packing = mDefaultUnityPacking;
            }
            EditorGUI.BeginDisabledGroup(mDefaultUnityPacking);
            EditorGUI.BeginChangeCheck();
            mDefaultForceSquare = EditorGUILayout.ToggleLeft(" force square atlas", mDefaultForceSquare, GUILayout.Width(140f));
            if (EditorGUI.EndChangeCheck())
            {
                default_force_square = mDefaultForceSquare;
            }
            EditorGUI.EndDisabledGroup();
            EditorGUI.BeginChangeCheck();
            mDefaultTrimAlpha = EditorGUILayout.ToggleLeft(" trim alpha", mDefaultTrimAlpha, GUILayout.Width(140f));
            if (EditorGUI.EndChangeCheck())
            {
                default_trim_alpha = mDefaultTrimAlpha;
            }
            EditorGUILayout.EndVertical();
            GUILayout.FlexibleSpace();
            GUILayout.FlexibleSpace();
            EditorGUILayout.BeginVertical();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Padding", GUILayout.Width(56f));
            cachedColor         = GUI.backgroundColor;
            GUI.backgroundColor = mDefaultPadding < 0 ? Color.red : cachedColor;
            EditorGUI.BeginChangeCheck();
            mDefaultPadding = EditorGUILayout.IntField(mDefaultPadding, GUILayout.Width(64f));
            if (EditorGUI.EndChangeCheck() && mDefaultPadding >= 0)
            {
                default_padding = mDefaultPadding;
            }
            GUI.backgroundColor = cachedColor;
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("Max Size", GUILayout.Width(56f));
            cachedColor         = GUI.backgroundColor;
            GUI.backgroundColor = mDefaultMaxSize < 32 || ((mDefaultMaxSize - 1) & mDefaultMaxSize) != 0 ? Color.red : cachedColor;
            EditorGUI.BeginChangeCheck();
            mDefaultMaxSize = EditorGUILayout.IntField(mDefaultMaxSize, GUILayout.Width(64f));
            if (EditorGUI.EndChangeCheck() && mDefaultMaxSize >= 32 && ((mDefaultMaxSize - 1) & mDefaultMaxSize) == 0)
            {
                default_max_size = mDefaultMaxSize;
            }
            GUI.backgroundColor = cachedColor;
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
            GUILayout.FlexibleSpace();
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(2f);
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(6f);
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(4f);
            EditorGUILayout.LabelField("Sprite Atlas :", mStyleBoldLabel, GUILayout.Width(90f));
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Find : ", GUILayout.Width(36f));
            EditorGUI.BeginChangeCheck();
            mSearchKey = GUILayout.TextField(mSearchKey, mStyleSearch, GUILayout.Width(190f));
            if (EditorGUI.EndChangeCheck())
            {
                mSearchKeyLower = mSearchKey.ToLower();
            }
            if (GUILayout.Button("", mStyleSearchCancel))
            {
                mSearchKey = ""; mSearchKeyLower = "";
            }
            EditorGUILayout.EndHorizontal();
            bool isDirty = false;

            mAtlasesScroll = EditorGUILayout.BeginScrollView(mAtlasesScroll, false, false);
            EditorGUILayout.BeginHorizontal();            //h1
            GUILayout.Space(4f);
            EditorGUILayout.BeginVertical();
            int removeAt = -1;
            int insertAt = -1;

            for (int i = 0; i < mSettings.Count; i++)
            {
                bool         changed = false;
                AtlasSetting setting = mSettings[i];
                if (setting.atlasPath.StartsWith("Assets/") ?
                    setting.atlasPath.IndexOf(mSearchKeyLower, 7, StringComparison.OrdinalIgnoreCase) < 0 :
                    setting.atlasPath.IndexOf(mSearchKeyLower, StringComparison.OrdinalIgnoreCase) < 0 &&
                    setting.texturesFolder.IndexOf(mSearchKeyLower, StringComparison.OrdinalIgnoreCase) < 0)
                {
                    continue;
                }
                GUILayout.Space(3f);
                cachedColor         = GUI.backgroundColor;
                GUI.backgroundColor = (i & 1) == 0 ? new Color(0.5f, 0.5f, 0.5f) : new Color(0.7f, 0.7f, 0.7f);
                EditorGUILayout.BeginVertical(mStyleTextArea, GUILayout.MinHeight(20f));
                GUI.backgroundColor = cachedColor;
                EditorGUILayout.BeginHorizontal();                //h2
                int      hashSetting = setting.GetHashCode();
                AnimBool show;
                if (!mHideAtlases.TryGetValue(hashSetting, out show))
                {
                    show = mDefaultAtlasShow;
                }
                string atlasLabel = (show.value ? "\u25BC " : "\u25BA ") + setting.atlasPath;
                if (GUILayout.Button(atlasLabel, mStyleWhiteLabel))
                {
                    if (show == mDefaultAtlasShow)
                    {
                        show = new AnimBool(mDefaultAtlasShow.value, Repaint);
                        mHideAtlases.Add(hashSetting, show);
                    }
                    show.target = !show.target;
                }
                bool packable = IsAtlasPathValid(setting.atlasPath) && !string.IsNullOrEmpty(setting.texturesFolder) &&
                                setting.padding >= 0 && setting.maxSize >= 32 && ((setting.maxSize - 1) & setting.maxSize) == 0;
                cachedColor         = GUI.backgroundColor;
                GUI.backgroundColor = packable ? Color.green : cachedColor;
                EditorGUI.BeginDisabledGroup(!packable);
                if (GUILayout.Button("Pack", GUILayout.Width(64f)))
                {
                    PackSingleAtlas(setting);
                }
                EditorGUI.EndDisabledGroup();
                GUI.backgroundColor = Color.red;
                if (GUILayout.Button("X", GUILayout.Width(20f)))
                {
                    removeAt = i;
                }
                GUI.backgroundColor = cachedColor;
                EditorGUILayout.EndHorizontal();                //h2
                GUILayout.Space(4f);
                if (EditorGUILayout.BeginFadeGroup(show.faded))
                {
                    EditorGUILayout.BeginHorizontal();                    //h2
                    GUILayout.Space(2f);
                    EditorGUILayout.BeginHorizontal(mStyleTextArea);      //h3
                    GUILayout.Space(8f);
                    EditorGUILayout.BeginVertical();
                    GUILayout.Space(2f);
                    EditorGUI.BeginChangeCheck();
                    EditorGUILayout.BeginHorizontal();                    //h4
                    EditorGUILayout.LabelField("Textures Folder", GUILayout.Width(96f));
                    cachedColor            = GUI.backgroundColor;
                    GUI.backgroundColor    = string.IsNullOrEmpty(setting.texturesFolder) ? Color.red : cachedColor;
                    setting.texturesFolder = EditorGUILayout.TextField(setting.texturesFolder);
                    GUI.backgroundColor    = cachedColor;
                    if (GUILayout.Button("Browse", GUILayout.Width(60f)))
                    {
                        string t = EditorUtility.OpenFolderPanel("Textures Folder", setting.texturesFolder, "");
                        if (!string.IsNullOrEmpty(t))
                        {
                            prev_sprites_folder = Path.GetDirectoryName(t).Replace('\\', '/');
                            string projPath = Application.dataPath;
                            projPath = projPath.Substring(0, projPath.Length - 7);
                            if (t.StartsWith(projPath))
                            {
                                t = t.Substring(projPath.Length + 1);
                            }
                            setting.texturesFolder = t;
                            changed = true;
                        }
                    }
                    EditorGUILayout.EndHorizontal();                    //h4
                    EditorGUILayout.BeginHorizontal();                  //h4
                    EditorGUILayout.LabelField("SpriteAtals Path", GUILayout.Width(96f));
                    cachedColor         = GUI.backgroundColor;
                    GUI.backgroundColor = IsAtlasPathValid(setting.atlasPath) ? cachedColor : Color.red;
                    setting.atlasPath   = EditorGUILayout.TextField(setting.atlasPath);
                    GUI.backgroundColor = cachedColor;
                    if (GUILayout.Button("Browse", GUILayout.Width(60f)))
                    {
                        string t = EditorUtility.SaveFilePanelInProject("Atlas Folder", setting.atlasPath, "png", "", prev_atlas_folder);
                        if (!string.IsNullOrEmpty(t))
                        {
                            prev_atlas_folder = Path.GetDirectoryName(t).Replace('\\', '/');
                            setting.atlasPath = t;
                            changed           = true;
                        }
                    }
                    EditorGUILayout.EndHorizontal();                           //h4
                    EditorGUILayout.BeginHorizontal(GUILayout.MinHeight(10f)); //h4
                    EditorGUILayout.BeginVertical();
                    setting.unityPacking = GUILayout.Toggle(setting.unityPacking, " unity packing", GUILayout.Width(140f));
                    EditorGUI.BeginDisabledGroup(setting.unityPacking);
                    setting.forceSquare = GUILayout.Toggle(setting.forceSquare, " force square atlas", GUILayout.Width(140f));
                    EditorGUI.EndDisabledGroup();
                    setting.trimAlpha = GUILayout.Toggle(setting.trimAlpha, " trim alpha", GUILayout.Width(140f));
                    EditorGUILayout.EndVertical();
                    GUILayout.FlexibleSpace();
                    GUILayout.FlexibleSpace();
                    EditorGUILayout.BeginVertical();
                    EditorGUILayout.BeginHorizontal();                    //h5
                    EditorGUILayout.LabelField("Padding", GUILayout.Width(56f));
                    cachedColor         = GUI.backgroundColor;
                    GUI.backgroundColor = setting.padding < 0 ? Color.red : cachedColor;
                    setting.padding     = EditorGUILayout.IntField(setting.padding, GUILayout.Width(64f));
                    GUI.backgroundColor = cachedColor;
                    EditorGUILayout.EndHorizontal();                    //h5
                    EditorGUILayout.BeginHorizontal();                  //h5
                    EditorGUILayout.LabelField("Max Size", GUILayout.Width(56f));
                    cachedColor         = GUI.backgroundColor;
                    GUI.backgroundColor = setting.maxSize < 32 || ((setting.maxSize - 1) & setting.maxSize) != 0 ? Color.red : cachedColor;
                    setting.maxSize     = EditorGUILayout.IntField(setting.maxSize, GUILayout.Width(64f));
                    GUI.backgroundColor = cachedColor;
                    EditorGUILayout.EndHorizontal();                    //h5
                    EditorGUILayout.EndVertical();
                    GUILayout.FlexibleSpace();
                    EditorGUILayout.EndHorizontal();                    //h4
                    GUILayout.Space(2f);
                    EditorGUILayout.EndVertical();
                    EditorGUILayout.EndHorizontal();                    //h3
                    if (EditorGUI.EndChangeCheck())
                    {
                        changed = true;
                    }
                    GUILayout.Space(2f);
                    EditorGUILayout.EndHorizontal();                    //h2
                }
                EditorGUILayout.EndFadeGroup();
                EditorGUILayout.EndVertical();
                if (changed)
                {
                    isDirty = true;
                }
            }
            EditorGUILayout.EndVertical();
            GUILayout.Space(2f);
            EditorGUILayout.EndHorizontal();
            GUILayout.Space(2f);
            cachedColor         = GUI.backgroundColor;
            GUI.backgroundColor = Color.green;
            if (GUILayout.Button("Add Atlas"))
            {
                insertAt = mSettings.Count;
            }
            GUI.backgroundColor = cachedColor;
            if (insertAt >= 0)
            {
                AtlasSetting setting = new AtlasSetting();
                setting.texturesFolder = "";
                setting.atlasPath      = "";
                setting.padding        = default_padding;
                setting.maxSize        = default_max_size;
                setting.unityPacking   = default_unity_packing;
                setting.forceSquare    = default_force_square;
                setting.trimAlpha      = default_trim_alpha;
                mSettings.Insert(insertAt, setting);
                isDirty = true;
            }
            if (removeAt >= 0)
            {
                mSettings.RemoveAt(removeAt);
                isDirty = true;
            }
            EditorGUILayout.EndScrollView();
            if (isDirty)
            {
                SaveAtlasConfig(mSettings);
            }
            Color cacheBgColor = GUI.backgroundColor;

            GUI.backgroundColor = Color.green;
            if (GUILayout.Button("Pack All Atlas", GUILayout.Height(28f)))
            {
                for (int i = 0, imax = mSettings.Count; i < imax; i++)
                {
                    AtlasSetting setting = mSettings[i];
                    Pack(true, setting.texturesFolder, setting.atlasPath, setting.padding, setting.maxSize,
                         setting.trimAlpha, setting.unityPacking, setting.forceSquare);
                }
            }
            GUI.backgroundColor = cacheBgColor;
        }
 private static void PackSingleAtlas(AtlasSetting setting)
 {
     Pack(false, setting.texturesFolder, setting.atlasPath, setting.padding, setting.maxSize,
          setting.trimAlpha, setting.unityPacking, setting.forceSquare);
 }