Преглед изворни кода

Refactored UndoRedo so its commands use shared pointers in order to better deal with the new custom C# undo/redo commands

BearishSun пре 9 година
родитељ
комит
d7eb0b25c3

+ 4 - 2
Source/BansheeEditor/Include/BsCmdInputFieldValueChange.h

@@ -33,8 +33,10 @@ namespace BansheeEngine
 		{
 		{
 			CmdInputFieldValueChange* command = 
 			CmdInputFieldValueChange* command = 
 				new (bs_alloc<CmdInputFieldValueChange>()) CmdInputFieldValueChange(description, inputField, value);
 				new (bs_alloc<CmdInputFieldValueChange>()) CmdInputFieldValueChange(description, inputField, value);
-			UndoRedo::instance().registerCommand(command);
-			command->commit();
+			SPtr<CmdInputFieldValueChange> commandPtr = bs_shared_ptr(command);
+
+			UndoRedo::instance().registerCommand(commandPtr);
+			commandPtr->commit();
 		}
 		}
 
 
 		/** @copydoc EditorCommand::commit */
 		/** @copydoc EditorCommand::commit */

+ 0 - 3
Source/BansheeEditor/Include/BsEditorCommand.h

@@ -26,9 +26,6 @@ namespace BansheeEngine
 		/** Reverts the command, reverting the change previously done with commit(). */
 		/** Reverts the command, reverting the change previously done with commit(). */
 		virtual void revert() { }
 		virtual void revert() { }
 
 
-		/**	Deletes the command. */
-		static void destroy(EditorCommand* command);
-
 	private:
 	private:
 		friend class UndoRedo;
 		friend class UndoRedo;
 
 

+ 5 - 5
Source/BansheeEditor/Include/BsUndoRedo.h

@@ -53,7 +53,7 @@ namespace BansheeEngine
 		void popGroup(const String& name);
 		void popGroup(const String& name);
 
 
 		/**	Registers a new undo command. */
 		/**	Registers a new undo command. */
-		void registerCommand(EditorCommand* command);
+		void registerCommand(const SPtr<EditorCommand>& command);
 
 
 		/**	Returns the unique identifier for the command on top of the undo stack. */
 		/**	Returns the unique identifier for the command on top of the undo stack. */
 		UINT32 getTopCommandId() const;
 		UINT32 getTopCommandId() const;
@@ -70,10 +70,10 @@ namespace BansheeEngine
 
 
 	private:
 	private:
 		/**	Removes the last undo command from the undo stack, and returns it. */
 		/**	Removes the last undo command from the undo stack, and returns it. */
-		EditorCommand* removeLastFromUndoStack();
+		SPtr<EditorCommand> removeLastFromUndoStack();
 
 
 		/**	Adds a new command to the undo stack. */
 		/**	Adds a new command to the undo stack. */
-		void addToUndoStack(EditorCommand* command);
+		void addToUndoStack(const SPtr<EditorCommand>& command);
 
 
 		/**	Removes all entries from the undo stack. */
 		/**	Removes all entries from the undo stack. */
 		void clearUndoStack();
 		void clearUndoStack();
@@ -83,8 +83,8 @@ namespace BansheeEngine
 
 
 		static const UINT32 MAX_STACK_ELEMENTS;
 		static const UINT32 MAX_STACK_ELEMENTS;
 
 
-		EditorCommand** mUndoStack;
-		EditorCommand** mRedoStack;
+		SPtr<EditorCommand>* mUndoStack;
+		SPtr<EditorCommand>* mRedoStack;
 
 
 		UINT32 mUndoStackPtr;
 		UINT32 mUndoStackPtr;
 		UINT32 mUndoNumElements;
 		UINT32 mUndoNumElements;

+ 4 - 2
Source/BansheeEditor/Source/BsCmdBreakPrefab.cpp

@@ -21,8 +21,10 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdBreakPrefab* command = new (bs_alloc<CmdBreakPrefab>()) CmdBreakPrefab(description, sceneObject);
 		CmdBreakPrefab* command = new (bs_alloc<CmdBreakPrefab>()) CmdBreakPrefab(description, sceneObject);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdBreakPrefab> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 	}
 	}
 
 
 	void CmdBreakPrefab::commit()
 	void CmdBreakPrefab::commit()

+ 11 - 7
Source/BansheeEditor/Source/BsCmdCloneSO.cpp

@@ -20,11 +20,13 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, { sceneObject });
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, { sceneObject });
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdCloneSO> commandPtr = bs_shared_ptr(command);
 
 
-		if (command->mClones.size() > 0)
-			return command->mClones[0];
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
+
+		if (commandPtr->mClones.size() > 0)
+			return commandPtr->mClones[0];
 
 
 		return HSceneObject();
 		return HSceneObject();
 	}
 	}
@@ -33,10 +35,12 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, sceneObjects);
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, sceneObjects);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdCloneSO> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 
 
-		return command->mClones;
+		return commandPtr->mClones;
 	}
 	}
 
 
 	void CmdCloneSO::commit()
 	void CmdCloneSO::commit()

+ 5 - 3
Source/BansheeEditor/Source/BsCmdCreateSO.cpp

@@ -20,10 +20,12 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdCreateSO* command = new (bs_alloc<CmdCreateSO>()) CmdCreateSO(description, name, flags);
 		CmdCreateSO* command = new (bs_alloc<CmdCreateSO>()) CmdCreateSO(description, name, flags);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdCreateSO> commandPtr = bs_shared_ptr(command);
 
 
-		return command->mSceneObject;
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
+
+		return commandPtr->mSceneObject;
 	}
 	}
 
 
 	void CmdCreateSO::commit()
 	void CmdCreateSO::commit()

+ 4 - 2
Source/BansheeEditor/Source/BsCmdDeleteSO.cpp

@@ -36,8 +36,10 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdDeleteSO* command = new (bs_alloc<CmdDeleteSO>()) CmdDeleteSO(description, sceneObject);
 		CmdDeleteSO* command = new (bs_alloc<CmdDeleteSO>()) CmdDeleteSO(description, sceneObject);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdDeleteSO> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 	}
 	}
 
 
 	void CmdDeleteSO::commit()
 	void CmdDeleteSO::commit()

+ 5 - 3
Source/BansheeEditor/Source/BsCmdInstantiateSO.cpp

@@ -21,10 +21,12 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdInstantiateSO* command = new (bs_alloc<CmdInstantiateSO>()) CmdInstantiateSO(description, prefab);
 		CmdInstantiateSO* command = new (bs_alloc<CmdInstantiateSO>()) CmdInstantiateSO(description, prefab);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdInstantiateSO> commandPtr = bs_shared_ptr(command);
 
 
-		return command->mSceneObject;
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
+
+		return commandPtr->mSceneObject;
 	}
 	}
 
 
 	void CmdInstantiateSO::commit()
 	void CmdInstantiateSO::commit()

+ 4 - 2
Source/BansheeEditor/Source/BsCmdRecordSO.cpp

@@ -35,8 +35,10 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdRecordSO* command = new (bs_alloc<CmdRecordSO>()) CmdRecordSO(description, sceneObject, recordHierarchy);
 		CmdRecordSO* command = new (bs_alloc<CmdRecordSO>()) CmdRecordSO(description, sceneObject, recordHierarchy);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdRecordSO> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 	}
 	}
 
 
 	void CmdRecordSO::commit()
 	void CmdRecordSO::commit()

+ 8 - 4
Source/BansheeEditor/Source/BsCmdReparentSO.cpp

@@ -19,16 +19,20 @@ namespace BansheeEngine
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, sceneObjects, newParent);
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, sceneObjects, newParent);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdReparentSO> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 	}
 	}
 
 
 	void CmdReparentSO::execute(HSceneObject& sceneObject, const HSceneObject& newParent, const WString& description)
 	void CmdReparentSO::execute(HSceneObject& sceneObject, const HSceneObject& newParent, const WString& description)
 	{
 	{
 		// Register command and commit it
 		// Register command and commit it
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, { sceneObject }, newParent);
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, { sceneObject }, newParent);
-		UndoRedo::instance().registerCommand(command);
-		command->commit();
+		SPtr<CmdReparentSO> commandPtr = bs_shared_ptr(command);
+
+		UndoRedo::instance().registerCommand(commandPtr);
+		commandPtr->commit();
 	}
 	}
 
 
 	void CmdReparentSO::commit()
 	void CmdReparentSO::commit()

+ 1 - 6
Source/BansheeEditor/Source/BsEditorCommand.cpp

@@ -5,11 +5,6 @@
 namespace BansheeEngine
 namespace BansheeEngine
 {
 {
 	EditorCommand::EditorCommand(const WString& description)
 	EditorCommand::EditorCommand(const WString& description)
-		:mDescription(description)
+		:mDescription(description), mId(0)
 	{ }
 	{ }
-
-	void EditorCommand::destroy(EditorCommand* command)
-	{
-		bs_delete(command);
-	}
 }
 }

+ 13 - 17
Source/BansheeEditor/Source/BsUndoRedo.cpp

@@ -11,8 +11,8 @@ namespace BansheeEngine
 		: mUndoStack(nullptr), mRedoStack(nullptr), mUndoStackPtr(0), mUndoNumElements(0), mRedoStackPtr(0)
 		: mUndoStack(nullptr), mRedoStack(nullptr), mUndoStackPtr(0), mUndoNumElements(0), mRedoStackPtr(0)
 		, mRedoNumElements(0), mNextCommandId(0)
 		, mRedoNumElements(0), mNextCommandId(0)
 	{
 	{
-		mUndoStack = bs_newN<EditorCommand*>(MAX_STACK_ELEMENTS);
-		mRedoStack = bs_newN<EditorCommand*>(MAX_STACK_ELEMENTS);
+		mUndoStack = bs_newN<SPtr<EditorCommand>>(MAX_STACK_ELEMENTS);
+		mRedoStack = bs_newN<SPtr<EditorCommand>>(MAX_STACK_ELEMENTS);
 	}
 	}
 
 
 	UndoRedo::~UndoRedo()
 	UndoRedo::~UndoRedo()
@@ -28,7 +28,7 @@ namespace BansheeEngine
 		if(mUndoNumElements == 0)
 		if(mUndoNumElements == 0)
 			return;
 			return;
 
 
-		EditorCommand* command = removeLastFromUndoStack();
+		SPtr<EditorCommand> command = removeLastFromUndoStack();
 		
 		
 		mRedoStackPtr = (mRedoStackPtr + 1) % MAX_STACK_ELEMENTS;
 		mRedoStackPtr = (mRedoStackPtr + 1) % MAX_STACK_ELEMENTS;
 		mRedoStack[mRedoStackPtr] = command;
 		mRedoStack[mRedoStackPtr] = command;
@@ -42,7 +42,7 @@ namespace BansheeEngine
 		if(mRedoNumElements == 0)
 		if(mRedoNumElements == 0)
 			return;
 			return;
 
 
-		EditorCommand* command = mRedoStack[mRedoStackPtr];
+		SPtr<EditorCommand> command = mRedoStack[mRedoStackPtr];
 		mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
 		mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
 		mRedoNumElements--;
 		mRedoNumElements--;
 
 
@@ -73,18 +73,16 @@ namespace BansheeEngine
 
 
 		for(UINT32 i = 0; i < topGroup.numEntries; i++)
 		for(UINT32 i = 0; i < topGroup.numEntries; i++)
 		{
 		{
-			EditorCommand* command = mUndoStack[mUndoStackPtr];
+			mUndoStack[mUndoStackPtr] = SPtr<EditorCommand>();
 			mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mUndoNumElements--;
 			mUndoNumElements--;
-
-			EditorCommand::destroy(command);
 		}
 		}
 
 
 		mGroups.pop();
 		mGroups.pop();
 		clearRedoStack();
 		clearRedoStack();
 	}
 	}
 
 
-	void UndoRedo::registerCommand(EditorCommand* command)
+	void UndoRedo::registerCommand(const SPtr<EditorCommand>& command)
 	{
 	{
 		command->mId = mNextCommandId++;
 		command->mId = mNextCommandId++;
 		addToUndoStack(command);
 		addToUndoStack(command);
@@ -151,9 +149,11 @@ namespace BansheeEngine
 		clearRedoStack();
 		clearRedoStack();
 	}
 	}
 
 
-	EditorCommand* UndoRedo::removeLastFromUndoStack()
+	SPtr<EditorCommand> UndoRedo::removeLastFromUndoStack()
 	{
 	{
-		EditorCommand* command = mUndoStack[mUndoStackPtr];
+		SPtr<EditorCommand> command = mUndoStack[mUndoStackPtr];
+
+		mUndoStack[mUndoStackPtr] = SPtr<EditorCommand>();
 		mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 		mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 		mUndoNumElements--;
 		mUndoNumElements--;
 
 
@@ -173,7 +173,7 @@ namespace BansheeEngine
 		return command;
 		return command;
 	}
 	}
 
 
-	void UndoRedo::addToUndoStack(EditorCommand* command)
+	void UndoRedo::addToUndoStack(const SPtr<EditorCommand>& command)
 	{
 	{
 		mUndoStackPtr = (mUndoStackPtr + 1) % MAX_STACK_ELEMENTS;
 		mUndoStackPtr = (mUndoStackPtr + 1) % MAX_STACK_ELEMENTS;
 		mUndoStack[mUndoStackPtr] = command;
 		mUndoStack[mUndoStackPtr] = command;
@@ -190,11 +190,9 @@ namespace BansheeEngine
 	{
 	{
 		while(mUndoNumElements > 0)
 		while(mUndoNumElements > 0)
 		{
 		{
-			EditorCommand* command = mUndoStack[mUndoStackPtr];
+			mUndoStack[mUndoStackPtr] = SPtr<EditorCommand>();
 			mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mUndoStackPtr = (mUndoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mUndoNumElements--;
 			mUndoNumElements--;
-
-			EditorCommand::destroy(command);
 		}
 		}
 
 
 		while(!mGroups.empty())
 		while(!mGroups.empty())
@@ -205,11 +203,9 @@ namespace BansheeEngine
 	{
 	{
 		while(mRedoNumElements > 0)
 		while(mRedoNumElements > 0)
 		{
 		{
-			EditorCommand* command = mRedoStack[mRedoStackPtr];
+			mRedoStack[mRedoStackPtr] = SPtr<EditorCommand>();
 			mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mRedoStackPtr = (mRedoStackPtr - 1) % MAX_STACK_ELEMENTS;
 			mRedoNumElements--;
 			mRedoNumElements--;
-
-			EditorCommand::destroy(command);
 		}
 		}
 	}
 	}
 }
 }

+ 3 - 3
Source/MBansheeEditor/Utility/SerializedObject.cs

@@ -26,7 +26,7 @@ namespace BansheeEditor
         /// <summary>
         /// <summary>
         /// Serializes all data within the provided component.
         /// Serializes all data within the provided component.
         /// </summary>
         /// </summary>
-        /// <param name="obj">Component to deserialize.</param>
+        /// <param name="obj">Component to serialize.</param>
         /// <returns>Object containing serialized data.</returns>
         /// <returns>Object containing serialized data.</returns>
         public static SerializedObject Create(Component obj)
         public static SerializedObject Create(Component obj)
         {
         {
@@ -40,7 +40,7 @@ namespace BansheeEditor
         /// <summary>
         /// <summary>
         /// Serializes all data within the provided resources.
         /// Serializes all data within the provided resources.
         /// </summary>
         /// </summary>
-        /// <param name="obj">Resource to deserialize.</param>
+        /// <param name="obj">Resource to serialize.</param>
         /// <returns>Object containing serialized data.</returns>
         /// <returns>Object containing serialized data.</returns>
         public static SerializedObject Create(ManagedResource obj)
         public static SerializedObject Create(ManagedResource obj)
         {
         {
@@ -54,7 +54,7 @@ namespace BansheeEditor
         /// <summary>
         /// <summary>
         /// Serializes all data within the provided object.
         /// Serializes all data within the provided object.
         /// </summary>
         /// </summary>
-        /// <param name="obj">Object to deserialize.</param>
+        /// <param name="obj">Object to serialize.</param>
         /// <returns>Object containing serialized data.</returns>
         /// <returns>Object containing serialized data.</returns>
         public static SerializedObject Create(object obj)
         public static SerializedObject Create(object obj)
         {
         {