void OnEnable()
 {
     if (!SpineSpriteAtlasAsset.AnySpriteAtlasNeedsRegionsLoaded())
     {
         return;
     }
     EditorApplication.update -= SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted;
     EditorApplication.update += SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted;
 }
        void OnEnable()
        {
            SpineEditorUtilities.ConfirmInitialization();
            atlasFile            = serializedObject.FindProperty("spriteAtlasFile");
            materials            = serializedObject.FindProperty("materials");
            materials.isExpanded = true;
            atlasAsset           = (SpineSpriteAtlasAsset)target;

            if (!SpineSpriteAtlasAsset.AnySpriteAtlasNeedsRegionsLoaded())
            {
                return;
            }
            EditorApplication.update -= SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted;
            EditorApplication.update += SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted;
        }
        override public void OnInspectorGUI()
        {
            if (serializedObject.isEditingMultipleObjects)
            {
                DrawDefaultInspector();
                return;
            }

            serializedObject.Update();
            atlasAsset = atlasAsset ?? (SpineSpriteAtlasAsset)target;

            if (atlasAsset.RegionsNeedLoading)
            {
                if (GUILayout.Button(SpineInspectorUtility.TempContent("Load regions by entering Play mode"), GUILayout.Height(20)))
                {
                    EditorApplication.isPlaying = true;
                }
            }

            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(atlasFile);
            EditorGUILayout.PropertyField(materials, true);
            if (EditorGUI.EndChangeCheck())
            {
                serializedObject.ApplyModifiedProperties();
                atlasAsset.Clear();
                atlasAsset.GetAtlas();
                atlasAsset.updateRegionsInPlayMode = true;
            }

            if (materials.arraySize == 0)
            {
                EditorGUILayout.HelpBox("No materials", MessageType.Error);
                return;
            }

            for (int i = 0; i < materials.arraySize; i++)
            {
                SerializedProperty prop = materials.GetArrayElementAtIndex(i);
                var material            = (Material)prop.objectReferenceValue;
                if (material == null)
                {
                    EditorGUILayout.HelpBox("Materials cannot be null.", MessageType.Error);
                    return;
                }
            }

            if (atlasFile.objectReferenceValue != null)
            {
                int baseIndent = EditorGUI.indentLevel;

                var regions      = SpineSpriteAtlasAssetInspector.GetRegions(atlasAsset.GetAtlas());
                int regionsCount = regions.Count;
                using (new EditorGUILayout.HorizontalScope()) {
                    EditorGUILayout.LabelField("Atlas Regions", EditorStyles.boldLabel);
                    EditorGUILayout.LabelField(string.Format("{0} regions total", regionsCount));
                }
                AtlasPage lastPage = null;
                for (int i = 0; i < regionsCount; i++)
                {
                    if (lastPage != regions[i].page)
                    {
                        if (lastPage != null)
                        {
                            EditorGUILayout.Separator();
                            EditorGUILayout.Separator();
                        }
                        lastPage = regions[i].page;
                        Material mat = ((Material)lastPage.rendererObject);
                        if (mat != null)
                        {
                            EditorGUI.indentLevel = baseIndent;
                            using (new GUILayout.HorizontalScope())
                                using (new EditorGUI.DisabledGroupScope(true))
                                    EditorGUILayout.ObjectField(mat, typeof(Material), false, GUILayout.Width(250));
                            EditorGUI.indentLevel = baseIndent + 1;
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("Page missing material!", MessageType.Warning);
                        }
                    }

                    string    regionName = regions[i].name;
                    Texture2D icon       = SpineEditorUtilities.Icons.image;
                    if (regionName.EndsWith(" "))
                    {
                        regionName = string.Format("'{0}'", regions[i].name);
                        icon       = SpineEditorUtilities.Icons.warning;
                        EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(regionName, icon, "Region name ends with whitespace. This may cause errors. Please check your source image filenames."));
                    }
                    else
                    {
                        EditorGUILayout.LabelField(SpineInspectorUtility.TempContent(regionName, icon));
                    }
                }
                EditorGUI.indentLevel = baseIndent;
            }

            if (serializedObject.ApplyModifiedProperties() || SpineInspectorUtility.UndoRedoPerformed(Event.current))
            {
                atlasAsset.Clear();
            }
        }
        void OnGUI()
        {
            so = so ?? new SerializedObject(this);

            EditorGUIUtility.wideMode = true;
            EditorGUILayout.LabelField("Spine SpriteAtlas Import", EditorStyles.boldLabel);

            using (new SpineInspectorUtility.BoxScope()) {
                EditorGUI.BeginChangeCheck();
                var spriteAtlasAssetProperty = so.FindProperty("spriteAtlasAsset");
                EditorGUILayout.PropertyField(spriteAtlasAssetProperty, new GUIContent("SpriteAtlas", EditorGUIUtility.IconContent("SpriteAtlas Icon").image));
                if (EditorGUI.EndChangeCheck())
                {
                    so.ApplyModifiedProperties();
                    if (spriteAtlasAsset != null)
                    {
                        if (AssetUtility.SpriteAtlasSettingsNeedAdjustment(spriteAtlasAsset))
                        {
                            AssetUtility.AdjustSpriteAtlasSettings(spriteAtlasAsset);
                        }
                        GenerateAssetsFromSpriteAtlas(spriteAtlasAsset);
                    }
                }

                var spineSpriteAtlasAssetProperty = so.FindProperty("spineSpriteAtlasAsset");
                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(spineSpriteAtlasAssetProperty, new GUIContent("SpineSpriteAtlasAsset", EditorGUIUtility.IconContent("ScriptableObject Icon").image));
                if (spineSpriteAtlasAssetProperty.objectReferenceValue == null)
                {
                    spineSpriteAtlasAssetProperty.objectReferenceValue = spineSpriteAtlasAsset = FindSpineSpriteAtlasAsset(spriteAtlasAsset);
                }
                if (EditorGUI.EndChangeCheck())
                {
                    so.ApplyModifiedProperties();
                }
                EditorGUILayout.Space();

                using (new EditorGUI.DisabledScope(spineSpriteAtlasAsset == null)) {
                    if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Load regions by entering Play mode")))
                    {
                        GenerateAssetsFromSpriteAtlas(spriteAtlasAsset);
                        SpineSpriteAtlasAsset.UpdateByStartingEditorPlayMode();
                    }
                }

                using (new SpineInspectorUtility.BoxScope()) {
                    if (spriteAtlasAsset == null)
                    {
                        EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Please assign SpriteAtlas file.", Icons.warning), GUILayout.Height(46));
                    }
                    else if (spineSpriteAtlasAsset == null || spineSpriteAtlasAsset.RegionsNeedLoading)
                    {
                        EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Please hit 'Load regions ..' to load\nregion info. Play mode is started\nand stopped automatically.", Icons.warning), GUILayout.Height(54));
                    }
                    else
                    {
                        EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("SpriteAtlas imported\nsuccessfully.", Icons.spine), GUILayout.Height(46));
                    }
                }
            }

            bool isAtlasComplete   = (spineSpriteAtlasAsset != null && !spineSpriteAtlasAsset.RegionsNeedLoading);
            bool canImportSkeleton = (spriteAtlasAsset != null && skeletonDataFile != null);

            using (new SpineInspectorUtility.BoxScope()) {
                using (new EditorGUI.DisabledScope(!isAtlasComplete)) {
                    var skeletonDataAssetProperty = so.FindProperty("skeletonDataFile");
                    EditorGUI.BeginChangeCheck();
                    EditorGUILayout.PropertyField(skeletonDataAssetProperty, SpineInspectorUtility.TempContent("Skeleton json/skel file", Icons.spine));
                    if (EditorGUI.EndChangeCheck())
                    {
                        so.ApplyModifiedProperties();
                    }
                    EditorGUILayout.Space();
                }
                using (new EditorGUI.DisabledScope(!canImportSkeleton)) {
                    if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Import Skeleton")))
                    {
                        //AssetUtility.IngestSpriteAtlas(spriteAtlasAsset, null);
                        string   skeletonPath = AssetDatabase.GetAssetPath(skeletonDataFile);
                        string[] skeletons    = new string[] { skeletonPath };
                        AssetUtility.ImportSpineContent(skeletons, null);
                    }
                }
            }
        }