예제 #1
0
        void BakeCollider()
        {
            if (m_SpriteShapeController.autoUpdateCollider == false)
            {
                return;
            }

            PolygonCollider2D polygonCollider = m_SpriteShapeController.polygonCollider;

            if (polygonCollider)
            {
                Undo.RegisterCompleteObjectUndo(polygonCollider, Undo.GetCurrentGroupName());
                EditorUtility.SetDirty(polygonCollider);
                m_SpriteShapeController.RefreshSpriteShape();
            }

            EdgeCollider2D edgeCollider = m_SpriteShapeController.edgeCollider;

            if (edgeCollider)
            {
                Undo.RegisterCompleteObjectUndo(edgeCollider, Undo.GetCurrentGroupName());
                EditorUtility.SetDirty(edgeCollider);
                m_SpriteShapeController.RefreshSpriteShape();
            }
        }
예제 #2
0
        override public void OnInspectorGUI()
        {
            serializedObject.Update();

            EditorGUILayout.PropertyField(m_RecordProperty);

            Transform targetTransform = null;

            if (m_Ik2D.target)
            {
                targetTransform = m_Ik2D.target.transform;
            }

            EditorGUI.BeginChangeCheck();

            Transform newTargetTransform = EditorGUILayout.ObjectField(new GUIContent("Target"), targetTransform, typeof(Transform), true) as Transform;

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RegisterCompleteObjectUndo(m_Ik2D, "set target");

                if (newTargetTransform && !newTargetTransform.GetComponent <Bone2D>())
                {
                    newTargetTransform = null;
                }

                if (newTargetTransform != targetTransform)
                {
                    m_TargetTransformProperty.objectReferenceValue = newTargetTransform;
                    IkUtils.InitializeIk2D(serializedObject);
                    EditorUpdater.SetDirty("set target");
                }
            }

            /*
             * EditorGUI.BeginChangeCheck();
             *
             * EditorGUILayout.PropertyField(m_TargetTransformProperty);
             *
             * if(EditorGUI.EndChangeCheck())
             * {
             *      IkUtils.InitializeIk2D(serializedObject);
             *
             *      DoUpdateIK();
             * }
             */

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.Slider(m_WeightProperty, 0f, 1f);
            EditorGUILayout.PropertyField(m_RestorePoseProperty);
            EditorGUILayout.PropertyField(m_OrientChildProperty);

            if (EditorGUI.EndChangeCheck())
            {
                EditorUpdater.SetDirty(Undo.GetCurrentGroupName());
            }

            serializedObject.ApplyModifiedProperties();
        }
예제 #3
0
 private void RegisterUndoForDirtyManagers()
 {
     foreach (var manager in m_DirtyManagers)
     {
         RegisterUndo(manager, Undo.GetCurrentGroupName());
     }
 }
        // prevents selection history flooding
        void OnUndoRedoPerformed()
        {
            // below is a hackish way to catch Undo/Redo from editor
            if (!Undo.GetCurrentGroupName().Equals("Selection Change"))
            {
                return;
            }
            var evt = Event.current;

            if (evt == null)
            {
                return;
            }
            if (evt.rawType != EventType.KeyDown)
            {
                return;
            }

            switch (evt.keyCode)
            {
            case KeyCode.Z:
                World.NewEntityWith(out UndoEvt _);
                _preventSelectionSet = true;     // prevent manual Selection set
                break;

            case KeyCode.Y:
                World.NewEntityWith(out RedoEvt _);
                _preventSelectionSet = true;
                break;
            }
        }
예제 #5
0
 private void OnUpdate()
 {
     if (_isLocked)
     {
         for (int i = 0; i < _transformsToLock.Count; i++)
         {
             if (_transformsToLock[i].hasChanged)
             {
                 _hasChanged = true;
             }
         }
         if (_hasChanged)
         {
             for (int i = 0; i < _transformsToLock.Count; i++)
             {
                 //TO-DO: Figure out how to get undo to work with rectTransforms so that this isn't necessary
                 if (!_transformsToLock[i].GetComponent <RectTransform>())
                 {
                     Undo.RecordObject(_transformsToLock[i], Undo.GetCurrentGroupName());
                 }
                 UpdateLockedTransforms(i);
                 _transformsToLock[i].hasChanged = false;
                 if (!_transformsToLock[i].GetComponent <RectTransform>())
                 {
                     Undo.CollapseUndoOperations(Undo.GetCurrentGroup());
                 }
             }
         }
     }
 }
        public static SpriteMeshInstance CreateSpriteMeshInstance(SpriteMesh spriteMesh, GameObject gameObject,
                                                                  bool undo = true)
        {
            SpriteMeshInstance spriteMeshInstance = null;

            if (spriteMesh && gameObject)
            {
                if (undo)
                {
                    spriteMeshInstance = Undo.AddComponent <SpriteMeshInstance>(gameObject);
                }
                else
                {
                    spriteMeshInstance = gameObject.AddComponent <SpriteMeshInstance>();
                }

                spriteMeshInstance.spriteMesh     = spriteMesh;
                spriteMeshInstance.sharedMaterial = defaultMaterial;

                SpriteMeshData spriteMeshData = SpriteMeshUtils.LoadSpriteMeshData(spriteMesh);

                List <Bone2D> bones = new List <Bone2D>();
                List <string> paths = new List <string>();

                Vector4 zero = new Vector4(0f, 0f, 0f, 1f);

                foreach (BindInfo bindInfo in spriteMeshData.bindPoses)
                {
                    Matrix4x4 m = spriteMeshInstance.transform.localToWorldMatrix * bindInfo.bindPose.inverse;

                    GameObject bone = new GameObject(bindInfo.name);

                    if (undo)
                    {
                        Undo.RegisterCreatedObjectUndo(bone, Undo.GetCurrentGroupName());
                    }

                    Bone2D boneComponent = bone.AddComponent <Bone2D>();

                    boneComponent.localLength = bindInfo.boneLength;
                    bone.transform.position   = m * zero;
                    bone.transform.rotation   = m.GetRotation();
                    bone.transform.parent     = gameObject.transform;

                    bones.Add(boneComponent);
                    paths.Add(bindInfo.path);
                }

                BoneUtils.ReconstructHierarchy(bones, paths);

                spriteMeshInstance.bones = bones;

                SpriteMeshUtils.UpdateRenderer(spriteMeshInstance, undo);

                EditorUtility.SetDirty(spriteMeshInstance);
            }

            return(spriteMeshInstance);
        }
예제 #7
0
        void HandleUndoRedo()
        {
            var groupName = Undo.GetCurrentGroupName();

            //Debug.Log(groupName);
            if (!string.IsNullOrEmpty(groupName) && groupName.StartsWith("LuaBehaviour"))
            {
                Reload();
                Repaint();
            }
        }
예제 #8
0
        public void SynchronizeINTERNAL(Transform tform)
        {
            if (tform != transform)
            {
#if UNITY_EDITOR
                Undo.RecordObject(transform, Undo.GetCurrentGroupName());
#endif
                transform.position = tform.position;
                transform.rotation = tform.rotation;
            }

            synchronize();
        }
예제 #9
0
        static void AddToCurrentUndoGroup(Object target)
        {
            if (target == null)
            {
                return;
            }

            var group     = Undo.GetCurrentGroup();
            var groupName = Undo.GetCurrentGroupName();

            EditorUtility.SetDirty(target);
            Undo.RegisterCompleteObjectUndo(target, groupName);
            Undo.CollapseUndoOperations(group);
        }
        private void HandleSpriteRectSelectionChange()
        {
            if ((m_CachedSpriteMeshData == null || HandleUtility.nearestControl == m_RectSelectionTool.controlID || HandleUtility.nearestControl == m_BrushWeightTool.controlID) &&
                Event.current.clickCount == 2 && spriteEditor.HandleSpriteSelection())
            {
                m_CachedSpriteMeshData = selectedSpriteMeshData;

                Undo.RegisterCompleteObjectUndo(m_SpriteMeshCache, Undo.GetCurrentGroupName());

                m_MeshPreview.SetMeshDirty();
                m_SpriteMeshCache.boneSelection.Clear();
                m_SpriteMeshCache.selection.Clear();
            }
        }
예제 #11
0
        void OnSceneGUI()
        {
            if (Tools.current == Tool.Move)
            {
                Tools.hidden = true;

                float size = HandleUtility.GetHandleSize(m_Bone.transform.position) / 5f;

                Quaternion rotation = m_Bone.transform.rotation;

                EditorGUI.BeginChangeCheck();

                Quaternion cameraRotation = Camera.current.transform.rotation;

                if (Event.current.type == EventType.Repaint)
                {
                    Camera.current.transform.rotation = m_Bone.transform.rotation;
                }

#if UNITY_5_6_OR_NEWER
                Vector3 newPosition = Handles.FreeMoveHandle(m_Bone.transform.position, rotation, size, Vector3.zero,
                                                             Handles.RectangleHandleCap);
#else
                Vector3 newPosition =
                    Handles.FreeMoveHandle(m_Bone.transform.position, rotation, size, Vector3.zero, Handles.RectangleCap);
#endif

                if (Event.current.type == EventType.Repaint)
                {
                    Camera.current.transform.rotation = cameraRotation;
                }

                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(m_Bone.transform, "Move");

                    m_Bone.transform.position = newPosition;

                    BoneUtils.OrientToChild(m_Bone.parentBone, Event.current.shift, Undo.GetCurrentGroupName(), true);

                    EditorUtility.SetDirty(m_Bone.transform);

                    EditorUpdater.SetDirty("Move");
                }
            }
            else
            {
                Tools.hidden = false;
            }
        }
 static public void DestroyObjectImmediate(Object objectToDestroy)
 {
     if (objectToDestroy)
     {
         if (!string.IsNullOrEmpty(Undo.GetCurrentGroupName()))
         {
             Undo.DestroyObjectImmediate(objectToDestroy);
         }
         else
         {
             GameObject.DestroyImmediate(objectToDestroy);
         }
     }
 }
예제 #13
0
        override public void OnInspectorGUI()
        {
            IkCCD2D ikCCD2D = target as IkCCD2D;

            base.OnInspectorGUI();

            SerializedProperty numBonesProp   = serializedObject.FindProperty("m_NumBones");
            SerializedProperty iterationsProp = serializedObject.FindProperty("iterations");
            SerializedProperty dampingProp    = serializedObject.FindProperty("damping");

            Bone2D targetBone = ikCCD2D.target;

            serializedObject.Update();

            EditorGUI.BeginDisabledGroup(!targetBone);

            EditorGUI.BeginChangeCheck();

            int chainLength = 0;

            if (targetBone)
            {
                chainLength = targetBone.chainLength;
            }

            EditorGUILayout.IntSlider(numBonesProp, 0, chainLength);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RegisterCompleteObjectUndo(ikCCD2D, "Set num bones");

                IkUtils.InitializeIk2D(serializedObject);
                EditorUpdater.SetDirty("Set num bones");
            }

            EditorGUI.EndDisabledGroup();

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(iterationsProp);
            EditorGUILayout.PropertyField(dampingProp);

            if (EditorGUI.EndChangeCheck())
            {
                EditorUpdater.SetDirty(Undo.GetCurrentGroupName());
            }

            serializedObject.ApplyModifiedProperties();
        }
예제 #14
0
			void PerformUndo ()
			{
				Repaint(); //just to make curve undo work.
				//modifying curve with a layout writes undo the usual way, and it is displayed in undo stack as "MapMaic Generator Change"
				//but somehow GetCurrentGroupName returns the previous action instead, like "Selection Change"
			

				if (!Undo.GetCurrentGroupName().Contains("MapMagic")) return;

				foreach (MapMagic.Chunk tw in MapMagic.instance.terrains.Objects()) tw.results.Clear();
				MapMagic.instance.gens.ChangeGenerator(null);
				if (MapMagic.instance.instantGenerate) { MapMagic.instance.ForceGenerate(); }

				Repaint();
			}
예제 #15
0
        public void SetPath(UnityObject target)
        {
            var path = GetPath(target);

            path.localToWorldMatrix = Matrix4x4.identity;

            var undoName         = Undo.GetCurrentGroupName();
            var serializedObject = GetSerializedObject(target);

            serializedObject.UpdateIfRequiredOrScript();

            SetShape(path, serializedObject);

            Undo.SetCurrentGroupName(undoName);
        }
예제 #16
0
        public static SpriteMeshInstance CreateSpriteMeshInstance(SpriteMesh spriteMesh, bool undo = true)
        {
            if (spriteMesh)
            {
                GameObject gameObject = new GameObject(spriteMesh.name);

                if (undo)
                {
                    Undo.RegisterCreatedObjectUndo(gameObject, Undo.GetCurrentGroupName());
                }

                return(CreateSpriteMeshInstance(spriteMesh, gameObject, undo));
            }

            return(null);
        }
예제 #17
0
        public override void OnInspectorGUI()
        {
            _navTileBanner.Draw();

            serializedObject.Update();

            // Multi editing not supported as it would not make sense, since every NavLink should be unique.
            using (new EditorGUI.DisabledGroupScope(targets.Length > 1))
            {
                EditorGUI.BeginChangeCheck();

                EditorGUILayout.PropertyField(_linkedTileProperty);

                if (EditorGUI.EndChangeCheck())
                {
                    // Record the NavLink dictionary for undo.
                    Undo.RecordObject(NavTileManager.Instance, Undo.GetCurrentGroupName());
                    TileBase newTile = (TileBase)_linkedTileProperty.objectReferenceValue;

                    // Callback for the tile change.
                    if (_linkedTileProperty.objectReferenceValue != Tile.LinkedTile)
                    {
                        Tile.OnTileChanged(Tile.LinkedTile, newTile);
                    }
                }
            }

            // Area index.
            EditorHelper.DrawCompressedPopup(_areaIndexProperty, NavTileManager.Instance.AreaManager.AllAreaNames);

            // Buttons.
            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();

            if (GUILayout.Button("View Links"))
            {
                NavTileWindow.OpenLinksTab();
            }

            if (GUILayout.Button("Edit Areas"))
            {
                NavTileWindow.OpenAreasTab();
            }
            GUILayout.EndHorizontal();

            serializedObject.ApplyModifiedProperties();
        }
예제 #18
0
			void PerformUndo ()
			{
				//Repaint(); //just to make curve undo work.
				//modifying curve with ascript.layout writes undo the usual way, and it is displayed in undo stack as "MapMaic Generator Change"
				//but somehow GetCurrentGroupName returns the previous action instead, like "Selection Change"
			
				if (!Undo.GetCurrentGroupName().Contains("MapMagic")) return;

				if (mapMagic!=null) 
				{
					mapMagic.ClearResults();
					mapMagic.Generate();
				}

				Repaint();
				
			}
    public override void OnInspectorGUI()
    {
        ONSPPropagationMaterial material = target as ONSPPropagationMaterial;

        EditorGUI.BeginChangeCheck();

        Rect r = EditorGUILayout.GetControlRect();

        r.width -= rightMargin;

        ONSPPropagationMaterial.Preset newPreset =
            (ONSPPropagationMaterial.Preset)EditorGUI.EnumPopup(r, "Preset", material.preset);

        Event     e    = Event.current;
        EventType type = e.type;

        absorption.Draw(e);
        scattering.Draw(e);
        transmission.Draw(e);

        if (EditorGUI.EndChangeCheck())
        {
            string groupName = Undo.GetCurrentGroupName();

            Undo.RegisterCompleteObjectUndo(material, groupName);

            if (groupName == "Point Added")
            {
                Undo.CollapseUndoOperations(Undo.GetCurrentGroup() - 1);
            }

            if (material.preset != newPreset)
            {
                material.preset = newPreset;
            }
            else
            {
                material.preset = ONSPPropagationMaterial.Preset.Custom;
            }

            if (Application.isPlaying)
            {
                material.UploadMaterial();
            }
        }
    }
예제 #20
0
 protected override void OnEnable()
 {
     if (selections == null)
     {
         selections = new List <SelectionId>();
     }
     titleContent.text = WindowName;
     base.OnEnable();
     editoSerializedObject = new SerializedObject(this);
     if (settings == null)
     {
         settings = new Settings();
     }
     if (Undo.GetCurrentGroupName() == CommitMessageUndoGroup)
     {
         Undo.RegisterFullObjectHierarchyUndo(this, "Commit Message Changed");
     }
 }
        void CheckPrefabRevert()
        {
            // Only want prefab modification in an editor scene.
            if (PrefabStageUtility.GetCurrentPrefabStage() != null)
            {
                return;
            }

            var undoGroup = Undo.GetCurrentGroupName();

            if (!undoGroup.Contains(k_RevertPrefabGroupName))
            {
                return;
            }

            // Need to change the name of group to know if we processed the undo group
            Undo.SetCurrentGroupName(k_PrefabRevertedGroupName);
            prefabInstanceReverted();
        }
예제 #22
0
        void synchronize()
        {
            for (int i = 0; i < ControlPoints.Count; i++)
            {
#if UNITY_EDITOR
                Undo.RecordObject(ControlPoints[i].transform, Undo.GetCurrentGroupName());
#endif
                if (ControlPoints[i].ConnectionSyncPosition)
                {
                    ControlPoints[i].transform.position = transform.position;
                }
                if (ControlPoints[i].ConnectionSyncRotation)
                {
                    ControlPoints[i].transform.rotation = transform.rotation;
                }
                ControlPoints[i].RefreshTransform(false);
            }
            TTransform.FromTransform(transform);
        }
예제 #23
0
        public Node AddNode(Vector2 position, Edge edge)
        {
            Node node = Node.Create(nodes.Count);

            nodes.Add(node);

            if (edge)
            {
                edges.Add(Edge.Create(edge.node1, node));
                edges.Add(Edge.Create(edge.node2, node));
                edges.Remove(edge);
            }

            m_TexVertices.Add(position);
            boneWeights.Add(BoneWeight.Create());

            if (blendshapes.Count > 0)
            {
                List <Vector3> frameVertices = new List <Vector3>(nodes.Count);
                Vector3        vertex        = ToVertex(position);

                foreach (BlendShape blendShape in blendshapes)
                {
                    foreach (BlendShapeFrame frame in blendShape.frames)
                    {
                        RegisterObjectUndo(frame, Undo.GetCurrentGroupName());

                        frameVertices.Clear();
                        frameVertices.AddRange(frame.vertices);
                        frameVertices.Add(vertex);
                        frame.vertices = frameVertices.ToArray();
                    }
                }
            }


            Triangulate();

            m_DirtyVertices = true;

            return(node);
        }
예제 #24
0
 void onUndoPerformed()
 {
     if (Undo.GetCurrentGroupName() == "changed clayobject" ||
         Undo.GetCurrentGroupName() == "changed clayxel container")
     {
         this.needsUpdate = true;
     }
     else if (Undo.GetCurrentGroupName() == "changed clayxel grid")
     {
         this.init();
     }
     else if (Undo.GetCurrentGroupName() == "added clayxel solid")
     {
         this.needsUpdate = true;
     }
     else if (Undo.GetCurrentGroupName() == "Selection Change")
     {
         if (UnityEditor.Selection.Contains(this.gameObject))
         {
             this.init();
         }
         else
         {
             if (UnityEditor.Selection.gameObjects.Length > 0)
             {
                 ClayObject clayObj = UnityEditor.Selection.gameObjects[0].GetComponent <ClayObject>();
                 if (clayObj != null)
                 {
                     if (clayObj.getClayxelContainer() == this)
                     {
                         this.needsUpdate = true;
                     }
                 }
             }
         }
     }
 }
예제 #25
0
        public void SetVertex(int index, Vector2 position)
        {
            if (mode == SpriteMeshEditorWindow.Mode.Mesh)
            {
                m_TexVertices[index] = position;

                m_DirtyVertices = true;
            }
            else if (mode == SpriteMeshEditorWindow.Mode.Blendshapes)
            {
                if (!selectedBlendshapeFrame && selectedBlendshape)
                {
                    CreateBlendShapeFrame(selectedBlendshape, blendShapeWeight, Undo.GetCurrentGroupName());
                }

                if (selectedBlendshapeFrame)
                {
                    selectedBlendshapeFrame.vertices [index] = ToVertex(position);
                    m_DirtyVertices = true;
                }
            }

            isDirty = true;
        }
예제 #26
0
        void SetupReordeableList()
        {
            m_ReorderableList = new ReorderableList(serializedObject, m_SolversProperty, true, true, true, true);
            m_ReorderableList.drawHeaderCallback = (Rect rect) =>
            {
                GUI.Label(rect, Contents.listHeaderLabel);
            };
            m_ReorderableList.elementHeightCallback = (int index) =>
            {
                return(EditorGUIUtility.singleLineHeight + 6);
            };
            m_ReorderableList.drawElementCallback = (Rect rect, int index, bool isactive, bool isfocused) =>
            {
                rect.y     += 2f;
                rect.height = EditorGUIUtility.singleLineHeight;
                SerializedProperty element     = m_SolversProperty.GetArrayElementAtIndex(index);
                SerializedProperty elementData = m_SolverEditorDataProperty.GetArrayElementAtIndex(index);
                var width = rect.width;
                rect.width = width > Contents.showGizmoPropertyWidth ? Contents.showGizmoPropertyWidth : width;
                var showGizmoProperty = elementData.FindPropertyRelative("showGizmo");
                showGizmoProperty.boolValue = GUI.Toggle(rect, showGizmoProperty.boolValue, Contents.gizmoVisibilityToolTip, k_Contents.visibilityToggleStyle);
                rect.x    += rect.width;
                width     -= rect.width;
                rect.width = width > Contents.solverPropertyWidth ? width - Contents.solverColorPropertyWidth  : Contents.solverPropertyWidth;
                EditorGUI.PropertyField(rect, element, GUIContent.none);
                rect.x    += rect.width;
                width     -= 100;
                rect.width = width > Contents.solverColorPropertyWidth ? Contents.solverColorPropertyWidth : width;
                EditorGUI.PropertyField(rect, elementData.FindPropertyRelative("color"), Contents.gizmoColorTooltip);
            };
            m_ReorderableList.onAddCallback = (ReorderableList list) =>
            {
                var menu = new GenericMenu();

                foreach (Type type in m_SolverTypes)
                {
                    Solver2DMenuAttribute attribute = Attribute.GetCustomAttribute(type, typeof(Solver2DMenuAttribute)) as Solver2DMenuAttribute;

                    if (attribute != null)
                    {
                        menu.AddItem(new GUIContent(attribute.menuPath), false, OnSelectMenu, type);
                    }
                    else
                    {
                        menu.AddItem(new GUIContent(type.Name), false, OnSelectMenu, type);
                    }
                }

                menu.ShowAsContext();
            };
            m_ReorderableList.onRemoveCallback = (ReorderableList list) =>
            {
                Solver2D solver = m_Manager.solvers[list.index];
                if (solver)
                {
                    Undo.RegisterCompleteObjectUndo(m_Manager, Undo.GetCurrentGroupName());

                    m_Manager.RemoveSolver(solver);

                    GameObject solverGO = solver.gameObject;

                    if (solverGO.transform.childCount == 0)
                    {
                        Undo.DestroyObjectImmediate(solverGO);
                    }
                    else
                    {
                        Undo.DestroyObjectImmediate(solver);
                    }

                    EditorUtility.SetDirty(m_Manager);
                }
                else
                {
                    ReorderableList.defaultBehaviours.DoRemoveButton(list);
                }
            };
        }
예제 #27
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            EditorGUILayout.PropertyField(m_AlwaysUpdateProperty, Contents.alwaysUpdate);

            var sprite        = m_SpriteSkin.spriteRenderer.sprite;
            var spriteChanged = m_CurrentSprite != sprite;

            if (m_ReorderableList == null || spriteChanged)
            {
                m_CurrentSprite = sprite;
                InitializeBoneTransformArray();
                SetupReorderableList();
            }

            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(m_RootBoneProperty, Contents.rootBoneLabel);
            if (EditorGUI.EndChangeCheck())
            {
                m_NeedsRebind = true;
            }

            m_BoneFold = EditorGUILayout.Foldout(m_BoneFold, Contents.listHeaderLabel, true);
            if (m_BoneFold)
            {
                EditorGUILayout.Space();
                if (!serializedObject.isEditingMultipleObjects)
                {
                    EditorGUI.BeginDisabledGroup(m_SpriteSkin.rootBone == null);
                    m_ReorderableList.DoLayoutList();
                    EditorGUI.EndDisabledGroup();
                }
            }

            EditorGUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();

            EditorGUI.BeginDisabledGroup(!EnableCreateBones());
            DoGenerateBonesButton();
            EditorGUI.EndDisabledGroup();

            EditorGUI.BeginDisabledGroup(!EnableSetBindPose());
            DoResetBindPoseButton();
            EditorGUI.EndDisabledGroup();

            GUILayout.FlexibleSpace();
            EditorGUILayout.EndHorizontal();

#if ENABLE_ANIMATION_PERFORMANCE
            m_ExperimentalFold = EditorGUILayout.Foldout(m_ExperimentalFold, Contents.experimental, true);
            if (m_ExperimentalFold)
            {
                EditorGUI.indentLevel++;
                EditorGUI.BeginChangeCheck();
                EditorGUILayout.PropertyField(m_UseBatching, Contents.useManager);
                if (EditorGUI.EndChangeCheck())
                {
                    foreach (var obj in targets)
                    {
                        ((SpriteSkin)obj).UseBatching(m_UseBatching.boolValue);
                    }
                }
                EditorGUI.indentLevel--;
            }
#endif

            serializedObject.ApplyModifiedProperties();

            if (m_NeedsRebind)
            {
                Rebind();
            }

            if (spriteChanged && !m_SpriteSkin.ignoreNextSpriteChange)
            {
                ResetBounds(Undo.GetCurrentGroupName());
                m_SpriteSkin.ignoreNextSpriteChange = false;
            }

            DoValidationWarnings();
        }
        internal void DoCommit(RepositoryInformation repoInfo, GitDiffWindow window, ref Vector2 commitScroll)
        {
            var settings = window.GitDiffSettings;

            EditorGUILayout.Space();
            EditorGUILayout.BeginHorizontal();
            if (repoInfo.CurrentOperation == CurrentOperation.Merge)
            {
                GUILayout.Label(GitGUI.GetTempContent("Merge"), styles.mergeIndicator);
            }
            window.CommitMaximized = GUILayout.Toggle(window.CommitMaximized, GitGUI.GetTempContent(gitSettings.ReadFromFile ? "File Commit Message: (Read Only)" : "Commit Message: "), styles.commitMessageFoldoud, GUILayout.Width(gitSettings.ReadFromFile ? 210 : 116));
            EditorGUI.BeginDisabledGroup(true);
            if (!window.CommitMaximized)
            {
                if (!gitSettings.ReadFromFile)
                {
                    EditorGUI.BeginChangeCheck();
                    GUI.SetNextControlName("Commit Message Field");
                    settings.commitMessage = EditorGUILayout.TextArea(settings.commitMessage, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                    if (EditorGUI.EndChangeCheck())
                    {
                        window.SaveCommitMessage();
                    }
                }
                else
                {
                    GUILayout.Label(GitGUI.GetTempContent(settings.commitMessageFromFile), GUI.skin.textArea, GUILayout.Height(EditorGUIUtility.singleLineHeight));
                }
            }
            EditorGUI.EndDisabledGroup();
            EditorGUILayout.EndHorizontal();
            if (window.CommitMaximized)
            {
                commitScroll = EditorGUILayout.BeginScrollView(commitScroll, GUILayout.Height(window.CalculateCommitTextHeight()));
                if (!gitSettings.ReadFromFile)
                {
                    EditorGUI.BeginChangeCheck();
                    GUI.SetNextControlName("Commit Message Field");
                    string newCommitMessage = EditorGUILayout.TextArea(settings.commitMessage, GUILayout.ExpandHeight(true));
                    if (EditorGUI.EndChangeCheck())
                    {
                        if ((Event.current.character == ' ' || Event.current.character == '\0') && !(commitMessageLastChar == ' ' || commitMessageLastChar == '\0'))
                        {
                            if (Undo.GetCurrentGroupName() == GitDiffWindow.CommitMessageUndoGroup)
                            {
                                Undo.IncrementCurrentGroup();
                            }
                        }
                        commitMessageLastChar = Event.current.character;
                        Undo.RecordObject(window, GitDiffWindow.CommitMessageUndoGroup);
                        settings.commitMessage = newCommitMessage;
                        window.SaveCommitMessage();
                    }
                }
                else
                {
                    GUILayout.Label(GitGUI.GetTempContent(settings.commitMessageFromFile), GUI.skin.textArea, GUILayout.ExpandHeight(true));
                }
                EditorGUILayout.EndScrollView();
            }

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button(GitGUI.GetTempContent("Commit"), styles.commitButton))
            {
                GenericMenu commitMenu = new GenericMenu();
                BuildCommitMenu(commitMenu, window);
                commitMenu.ShowAsContext();
            }
            GitGUI.StartEnable(!gitSettings.ExternalsType.IsFlagSet(GitSettingsJson.ExternalsTypeEnum.Commit));
            settings.emptyCommit = GUILayout.Toggle(settings.emptyCommit, GitGUI.GetTempContent("Empty Commit", "Commit the message only without changes"));
            EditorGUI.BeginChangeCheck();
            settings.amendCommit = GUILayout.Toggle(settings.amendCommit, GitGUI.GetTempContent("Amend Commit", "Amend previous commit."));
            if (EditorGUI.EndChangeCheck())
            {
                if (settings.amendCommit)
                {
                    window.AmmendCommit();
                }
            }
            settings.prettify = GUILayout.Toggle(settings.prettify, GitGUI.GetTempContent("Prettify", "Prettify the commit message"));
            GitGUI.EndEnable();
            GUILayout.FlexibleSpace();
            if (GitGUI.LinkButtonLayout(gitOverlay.icons.donateSmall, GitGUI.Styles.IconButton))
            {
                GitLinks.GoTo(GitLinks.Donate);
            }
            if (GitGUI.LinkButtonLayout(GitGUI.Contents.Help, GitGUI.Styles.IconButton))
            {
                GitLinks.GoTo(GitLinks.DiffWindowHelp);
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();
        }
        public override void OnInspectorGUI()
        {
            tu.undoRedoEvent = Undo.GetCurrentGroupName();


            base.OnInspectorGUI();

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Table Properties", labelStyle);
            EditorGUILayout.Space();

            EditorGUILayout.BeginVertical(box);

            EditorGUI.BeginChangeCheck();
            int  rows    = EditorGUILayout.IntSlider(rowLabel, tu.Rows, TableUI.MIN_ROWS, TableUI.MAX_ROWS);
            int  columns = EditorGUILayout.IntSlider(columnLabel, tu.Columns, TableUI.MIN_COL, TableUI.MAX_COL);
            bool header  = EditorGUILayout.Toggle(showHeaderLabel, tu.Header);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Table");
                tu.Rows    = rows;
                tu.Columns = columns;
                tu.Header  = header;
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Border Properties", labelStyle);
            EditorGUILayout.Space();

            EditorGUILayout.BeginVertical(new GUIStyle("box"));

            EditorGUI.BeginChangeCheck();
            BorderType borderType      = (BorderType)EditorGUILayout.EnumPopup(borderTypeLabel, tu.BorderType);
            float      borderThickness = EditorGUILayout.FloatField(borderThicknessLabel, tu.BorderThickness);
            Color      borderColor     = EditorGUILayout.ColorField(borderColorLabel, tu.BorderColor);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Border");
                tu.BorderType      = borderType;
                tu.BorderThickness = borderThickness;
                tu.BorderColor     = borderColor;
            }



            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Text Properties", labelStyle);
            EditorGUILayout.Space();
            EditorGUILayout.BeginVertical(box);



            EditorGUI.indentLevel += 1;

            if (tu.Header)
            {
                headerFoldout = EditorGUILayout.Foldout(headerFoldout, headerFoldoutLabel, true, TMPro.EditorUtilities.TMP_UIStyleManager.boldFoldout);
                if (headerFoldout)
                {
                    headerCellPropertiesEditor.OnInspectorGUI();
                }
            }

            bodyFoldout = EditorGUILayout.Foldout(bodyFoldout, bodyFoldoutLabel, true, TMPro.EditorUtilities.TMP_UIStyleManager.boldFoldout);
            if (bodyFoldout)
            {
                bodyCellPropertiesEditor.OnInspectorGUI();
            }

            EditorGUI.indentLevel -= 1;



            EditorGUILayout.EndVertical();
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("Table Colors", labelStyle);
            EditorGUILayout.Space();

            EditorGUILayout.BeginVertical(box);
            EditorGUI.BeginChangeCheck();
            bool striped = EditorGUILayout.Toggle(stripedLabel, tu.Striped);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Color");
                tu.Striped = striped;
            }


            if (tu.Header)
            {
                EditorGUI.BeginChangeCheck();
                Color headerColor = EditorGUILayout.ColorField(headerColorLabel, tu.HeaderColor);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(target, "Color");
                    tu.HeaderColor = headerColor;
                }
            }

            EditorGUI.BeginChangeCheck();
            Color mainColor = EditorGUILayout.ColorField(mainColorLabel, tu.MainColor);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(target, "Color");
                tu.MainColor = mainColor;
            }

            if (tu.Striped)
            {
                EditorGUI.BeginChangeCheck();
                Color secondaryColor = EditorGUILayout.ColorField(secondaryColorLabel, tu.SecondaryColor);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(target, "Color");
                    tu.SecondaryColor = secondaryColor;
                }
            }
            EditorGUILayout.EndVertical();

            EditorGUILayout.Space();


            Rect r = EditorGUILayout.BeginHorizontal(box);

            if (GUILayout.Button("Make all rows the same height", EditorStyles.miniButtonLeft, GUILayout.Height(50f), GUILayout.MinWidth(r.width / 2)))
            {
                tu.MakeAllRowsTheSameHeight();
            }
            if (GUILayout.Button("Make all columns the same width", EditorStyles.miniButtonRight, GUILayout.Height(50f), GUILayout.MinWidth(r.width / 2)))
            {
                tu.MakeAllColumnsTheSameWidth();
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.Space();
            DrawGrid();
        }
        public void SetupReordeableList()
        {
            m_ReorderableList = new ReorderableList(serializedObject, m_SolversProperty, true, true, true, true);
            m_ReorderableList.drawHeaderCallback = (Rect rect) =>
            {
                GUI.Label(rect, Contents.listHeaderLabel);
            };
            m_ReorderableList.elementHeightCallback = (int index) =>
            {
                return(EditorGUIUtility.singleLineHeight + 6);
            };
            m_ReorderableList.drawElementCallback = (Rect rect, int index, bool isactive, bool isfocused) =>
            {
                rect.y     += 2f;
                rect.height = EditorGUIUtility.singleLineHeight;
                SerializedProperty element = m_SolversProperty.GetArrayElementAtIndex(index);
                EditorGUI.PropertyField(rect, element, GUIContent.none);
            };
            m_ReorderableList.onAddCallback = (ReorderableList list) =>
            {
                var menu = new GenericMenu();

                foreach (Type type in m_SolverTypes)
                {
                    Solver2DMenuAttribute attribute = Attribute.GetCustomAttribute(type, typeof(Solver2DMenuAttribute)) as Solver2DMenuAttribute;

                    if (attribute != null)
                    {
                        menu.AddItem(new GUIContent(attribute.menuPath), false, OnSelectMenu, type);
                    }
                    else
                    {
                        menu.AddItem(new GUIContent(type.Name), false, OnSelectMenu, type);
                    }
                }

                menu.ShowAsContext();
            };
            m_ReorderableList.onRemoveCallback = (ReorderableList list) =>
            {
                Solver2D solver = m_Manager.solvers[list.index];
                if (solver)
                {
                    Undo.RegisterCompleteObjectUndo(m_Manager, Undo.GetCurrentGroupName());

                    m_Manager.RemoveSolver(solver);

                    GameObject solverGO = solver.gameObject;

                    if (solverGO.transform.childCount == 0)
                    {
                        Undo.DestroyObjectImmediate(solverGO);
                    }
                    else
                    {
                        Undo.DestroyObjectImmediate(solver);
                    }

                    EditorUtility.SetDirty(m_Manager);
                }
                else
                {
                    ReorderableList.defaultBehaviours.DoRemoveButton(list);
                }
            };
        }