private static void RegisterCommandInGroup(IRevertableCommand revertableCommand, string commandGroup)
        {
            if (groupedCommands.ContainsKey(commandGroup) == false)
            {
                groupedCommands.Add(commandGroup, new List <IRevertableCommand>());
            }

            groupedCommands[commandGroup].Add(revertableCommand);
        }
        private static bool UndoCommand(IRevertableCommand revertableCommand)
        {
            try
            {
                revertableCommand.Undo();
            }
            catch (Exception e)
            {
                logger.Error("Can't undo the command.", e);
                Panic();
                return(false);
            }

            return(true);
        }
        private static bool UndoCommand(IRevertableCommand revertableCommand)
        {
            try
            {
                revertableCommand.Undo();
            }
            catch (Exception e)
            {
                Debug.LogErrorFormat("Can't undo the command.\n{0}", e);
                Panic();
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Registers <paramref name="revertableCommand"/> and executes it.
        /// </summary>
        /// <remarks>
        /// If <typeparamref name="commandGroup"/> is empty, <paramref name="revertableCommand"/> will be added to the main stack, otherwise,
        /// it will remind in a group called as <typeparamref name="commandGroup"/> content until <seealso cref="CollapseUndoOperations"/> is called.
        /// </remarks>
        public static void Do(IRevertableCommand revertableCommand, string commandGroup = "")
        {
            if (revertableCommand == null)
            {
                logger.Error("Command can't be null, ignoring.");
                return;
            }

            if (string.IsNullOrEmpty(commandGroup))
            {
                RegisterCommand(revertableCommand);
            }
            else
            {
                RegisterCommandInGroup(revertableCommand, commandGroup);
            }

            DoCommand(revertableCommand);
        }
        private static void RegisterCommand(IRevertableCommand revertableCommand)
        {
            if (serialized == null)
            {
                FlushStack();
            }

            UnityEditor.Undo.IncrementCurrentGroup();
            UnityEditor.Undo.RecordObject(serialized, "");

            // Flush outdated.
            if (commands.Count > commandIndex)
            {
                commands.RemoveRange(commandIndex, commands.Count - commandIndex);
            }

            commands.Add(revertableCommand);
            commandIndex++;
            serialized.CommandIndex = commandIndex;
        }