Browse Source

Fixing an issue with the UndoRedo system not starting after recent changes

BearishSun 9 years ago
parent
commit
5005aeb41c

+ 1 - 1
Source/BansheeEditor/Include/BsCmdInputFieldValueChange.h

@@ -35,7 +35,7 @@ namespace BansheeEngine
 				new (bs_alloc<CmdInputFieldValueChange>()) CmdInputFieldValueChange(description, inputField, value);
 			SPtr<CmdInputFieldValueChange> commandPtr = bs_shared_ptr(command);
 
-			GlobalUndoRedo::instance().registerCommand(commandPtr);
+			UndoRedo::instance().registerCommand(commandPtr);
 			commandPtr->commit();
 		}
 

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

@@ -12,7 +12,7 @@ namespace BansheeEngine
 	 */
 
 	/**	Provides functionality to undo or redo recently performed operations in the editor. */
-	class BS_ED_EXPORT UndoRedo
+	class BS_ED_EXPORT UndoRedo : public Module<UndoRedo>
 	{
 		/**
 		 * Contains data about a single undo/redo group. Groups allow you to create context sensitive undo/redo operations.
@@ -97,9 +97,5 @@ namespace BansheeEngine
 		Stack<GroupData> mGroups;
 	};
 
-	/**	Provides access to the global undo/redo stack. See UndoRedo. */
-	class BS_ED_EXPORT GlobalUndoRedo : public Module<UndoRedo>
-	{ };
-
 	/** @} */
 }

+ 1 - 1
Source/BansheeEditor/Source/BsCmdBreakPrefab.cpp

@@ -23,7 +23,7 @@ namespace BansheeEngine
 		CmdBreakPrefab* command = new (bs_alloc<CmdBreakPrefab>()) CmdBreakPrefab(description, sceneObject);
 		SPtr<CmdBreakPrefab> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 	}
 

+ 2 - 2
Source/BansheeEditor/Source/BsCmdCloneSO.cpp

@@ -22,7 +22,7 @@ namespace BansheeEngine
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, { sceneObject });
 		SPtr<CmdCloneSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 
 		if (commandPtr->mClones.size() > 0)
@@ -37,7 +37,7 @@ namespace BansheeEngine
 		CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, sceneObjects);
 		SPtr<CmdCloneSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 
 		return commandPtr->mClones;

+ 1 - 1
Source/BansheeEditor/Source/BsCmdCreateSO.cpp

@@ -22,7 +22,7 @@ namespace BansheeEngine
 		CmdCreateSO* command = new (bs_alloc<CmdCreateSO>()) CmdCreateSO(description, name, flags);
 		SPtr<CmdCreateSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 
 		return commandPtr->mSceneObject;

+ 1 - 1
Source/BansheeEditor/Source/BsCmdDeleteSO.cpp

@@ -38,7 +38,7 @@ namespace BansheeEngine
 		CmdDeleteSO* command = new (bs_alloc<CmdDeleteSO>()) CmdDeleteSO(description, sceneObject);
 		SPtr<CmdDeleteSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 	}
 

+ 1 - 1
Source/BansheeEditor/Source/BsCmdInstantiateSO.cpp

@@ -23,7 +23,7 @@ namespace BansheeEngine
 		CmdInstantiateSO* command = new (bs_alloc<CmdInstantiateSO>()) CmdInstantiateSO(description, prefab);
 		SPtr<CmdInstantiateSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 
 		return commandPtr->mSceneObject;

+ 1 - 1
Source/BansheeEditor/Source/BsCmdRecordSO.cpp

@@ -37,7 +37,7 @@ namespace BansheeEngine
 		CmdRecordSO* command = new (bs_alloc<CmdRecordSO>()) CmdRecordSO(description, sceneObject, recordHierarchy);
 		SPtr<CmdRecordSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 	}
 

+ 2 - 2
Source/BansheeEditor/Source/BsCmdReparentSO.cpp

@@ -21,7 +21,7 @@ namespace BansheeEngine
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, sceneObjects, newParent);
 		SPtr<CmdReparentSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 	}
 
@@ -31,7 +31,7 @@ namespace BansheeEngine
 		CmdReparentSO* command = new (bs_alloc<CmdReparentSO>()) CmdReparentSO(description, { sceneObject }, newParent);
 		SPtr<CmdReparentSO> commandPtr = bs_shared_ptr(command);
 
-		GlobalUndoRedo::instance().registerCommand(commandPtr);
+		UndoRedo::instance().registerCommand(commandPtr);
 		commandPtr->commit();
 	}
 

+ 3 - 3
Source/BansheeEditor/Source/BsEditorApplication.cpp

@@ -103,7 +103,7 @@ namespace BansheeEngine
 
 		ProjectLibrary::startUp();
 
-		GlobalUndoRedo::startUp();
+		UndoRedo::startUp();
 		EditorWindowManager::startUp();
 		EditorWidgetManager::startUp();
 		DropDownWindowManager::startUp();
@@ -133,7 +133,7 @@ namespace BansheeEngine
 		DropDownWindowManager::shutDown();
 		EditorWidgetManager::shutDown();
 		EditorWindowManager::shutDown();
-		GlobalUndoRedo::shutDown();
+		UndoRedo::shutDown();
 
 		Application::onShutDown();
 	}
@@ -232,7 +232,7 @@ namespace BansheeEngine
 
 		mProjectSettings = bs_shared_ptr_new<ProjectSettings>();
 		BuildManager::instance().clear();
-		GlobalUndoRedo::instance().clear();
+		UndoRedo::instance().clear();
 
 		EditorWidgetManager::instance().closeAll();
 		gProjectLibrary().unloadLibrary();

+ 2 - 2
Source/BansheeEditor/Source/BsEditorTestSuite.cpp

@@ -441,7 +441,7 @@ namespace BansheeEngine
 		CmdRecordSO::execute(so0_0);
 		cmpB1_1->val1 = "ModifiedValue";
 		so0_0->setName("modified");
-		GlobalUndoRedo::instance().undo();
+		UndoRedo::instance().undo();
 
 		BS_TEST_ASSERT(!so0_0.isDestroyed());
 		BS_TEST_ASSERT(!so1_0.isDestroyed());
@@ -486,7 +486,7 @@ namespace BansheeEngine
 		cmpExternal->ref2 = cmpA1_1;
 
 		CmdDeleteSO::execute(so0_0);
-		GlobalUndoRedo::instance().undo();
+		UndoRedo::instance().undo();
 
 		BS_TEST_ASSERT(!so0_0.isDestroyed());
 		BS_TEST_ASSERT(!so1_0.isDestroyed());

+ 2 - 2
Source/BansheeEditor/Source/BsGUIFloatField.cpp

@@ -211,14 +211,14 @@ namespace BansheeEngine
 	{
 		if (focus)
 		{
-			GlobalUndoRedo::instance().pushGroup("InputBox");
+			UndoRedo::instance().pushGroup("InputBox");
 
 			mHasInputFocus = true;
 			onFocusChanged(true);
 		}
 		else
 		{
-			GlobalUndoRedo::instance().popGroup("InputBox");
+			UndoRedo::instance().popGroup("InputBox");
 
 			setText(applyRangeAndStep(mValue));
 

+ 2 - 2
Source/BansheeEditor/Source/BsGUIIntField.cpp

@@ -229,14 +229,14 @@ namespace BansheeEngine
 	{
 		if (focus)
 		{
-			GlobalUndoRedo::instance().pushGroup("InputBox");
+			UndoRedo::instance().pushGroup("InputBox");
 
 			mHasInputFocus = true;
 			onFocusChanged(true);
 		}
 		else
 		{
-			GlobalUndoRedo::instance().popGroup("InputBox");
+			UndoRedo::instance().popGroup("InputBox");
 
 			setText(applyRangeAndStep(mValue));
 

+ 2 - 2
Source/BansheeEditor/Source/BsGUISliderField.cpp

@@ -147,14 +147,14 @@ namespace BansheeEngine
 	{
 		if (focus)
 		{
-			GlobalUndoRedo::instance().pushGroup("InputBox");
+			UndoRedo::instance().pushGroup("InputBox");
 
 			mHasInputFocus = true;
 			onFocusChanged(true);
 		}
 		else
 		{
-			GlobalUndoRedo::instance().popGroup("InputBox");
+			UndoRedo::instance().popGroup("InputBox");
 			inputBoxValueChanged();
 
 			mHasInputFocus = false;

+ 2 - 2
Source/BansheeEditor/Source/BsGUITextField.cpp

@@ -197,14 +197,14 @@ namespace BansheeEngine
 	{
 		if (focus)
 		{
-			GlobalUndoRedo::instance().pushGroup("InputBox");
+			UndoRedo::instance().pushGroup("InputBox");
 
 			mHasInputFocus = true;
 			onFocusChanged(true);
 		}
 		else
 		{
-			GlobalUndoRedo::instance().popGroup("InputBox");
+			UndoRedo::instance().popGroup("InputBox");
 
 			mHasInputFocus = false;
 			onFocusChanged(false);

+ 15 - 0
Source/MBansheeEditor/Utility/UndoRedo.cs

@@ -67,6 +67,18 @@ namespace BansheeEditor
             Internal_Redo(mCachedPtr);
         }
 
+        /// <summary>
+        /// Registers a new undo command.
+        /// </summary>
+        /// <param name="command">Command to register</param>
+        public void RegisterCommand(UndoableCommand command)
+        {
+            if (command == null)
+                return;
+
+            Internal_RegisterCommand(mCachedPtr, command.GetCachedPtr());
+        }
+
         /// <summary>
         /// Creates a new undo/redo group. All new commands will be registered to this group. You may remove the group and 
         /// all of its commands by calling <see cref="PopGroup"/>.
@@ -252,6 +264,9 @@ namespace BansheeEditor
         [MethodImpl(MethodImplOptions.InternalCall)]
         internal static extern void Internal_Redo(IntPtr thisPtr);
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal static extern void Internal_RegisterCommand(IntPtr thisPtr, IntPtr commandPtr);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         internal static extern void Internal_PushGroup(IntPtr thisPtr, string name);
 

+ 4 - 1
Source/SBansheeEditor/Include/BsManagedEditorCommand.h

@@ -22,6 +22,9 @@ namespace BansheeEngine
 
 		~ScriptCmdManaged();
 
+		/** Returns the internal command wrapped by this object. */
+		SPtr<CmdManaged> getInternal() const { return mManagedCommand; }
+
 	private:
 		friend class CmdManaged;
 
@@ -36,7 +39,7 @@ namespace BansheeEngine
 		/** Notifies the script instance that the underlying managed command was destroyed. */
 		void notifyCommandDestroyed();
 
-		CmdManaged* mManagedCommand;
+		SPtr<CmdManaged> mManagedCommand;
 
 		/************************************************************************/
 		/* 								CLR HOOKS						   		*/

+ 2 - 0
Source/SBansheeEditor/Include/BsScriptUndoRedo.h

@@ -8,6 +8,7 @@
 namespace BansheeEngine
 {
 	class UndoRedo;
+	class ScriptCmdManaged;
 
 	/** @addtogroup ScriptInteropEditor
 	 *  @{
@@ -32,6 +33,7 @@ namespace BansheeEngine
 		static MonoObject* internal_GetGlobal();
 		static void internal_Undo(ScriptUndoRedo* thisPtr);
 		static void internal_Redo(ScriptUndoRedo* thisPtr);
+		static void internal_RegisterCommand(ScriptUndoRedo* thisPtr, ScriptCmdManaged* command);
 		static void internal_PushGroup(ScriptUndoRedo* thisPtr, MonoString* name);
 		static void internal_PopGroup(ScriptUndoRedo* thisPtr, MonoString* name);
 		static UINT32 internal_GetTopCommandId(ScriptUndoRedo* thisPtr);

+ 1 - 1
Source/SBansheeEditor/Source/BsManagedEditorCommand.cpp

@@ -15,7 +15,7 @@ namespace BansheeEngine
 	ScriptCmdManaged::ScriptCmdManaged(MonoObject* managedInstance)
 		:ScriptObject(managedInstance), mManagedCommand(nullptr)
 	{
-		mManagedCommand = new (bs_alloc<CmdManaged>()) CmdManaged(this);
+		mManagedCommand = bs_shared_ptr(new (bs_alloc<CmdManaged>()) CmdManaged(this));
 	}
 
 	ScriptCmdManaged::~ScriptCmdManaged()

+ 14 - 6
Source/SBansheeEditor/Source/BsScriptUndoRedo.cpp

@@ -16,6 +16,7 @@
 #include "BsCmdReparentSO.h"
 #include "BsCmdBreakPrefab.h"
 #include "BsScriptPrefab.h"
+#include "BsManagedEditorCommand.h"
 #include "BsPrefab.h"
 
 namespace BansheeEngine
@@ -32,6 +33,7 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_GetGlobal", &ScriptUndoRedo::internal_GetGlobal);
 		metaData.scriptClass->addInternalCall("Internal_Undo", &ScriptUndoRedo::internal_Undo);
 		metaData.scriptClass->addInternalCall("Internal_Redo", &ScriptUndoRedo::internal_Redo);
+		metaData.scriptClass->addInternalCall("Internal_RegisterCommand", &ScriptUndoRedo::internal_RegisterCommand);
 		metaData.scriptClass->addInternalCall("Internal_PushGroup", &ScriptUndoRedo::internal_PushGroup);
 		metaData.scriptClass->addInternalCall("Internal_PopGroup", &ScriptUndoRedo::internal_PopGroup);
 		metaData.scriptClass->addInternalCall("Internal_GetTopCommandId", &ScriptUndoRedo::internal_GetTopCommandId);
@@ -69,21 +71,27 @@ namespace BansheeEngine
 
 	void ScriptUndoRedo::internal_Undo(ScriptUndoRedo* thisPtr)
 	{
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		undoRedo->undo();
 	}
 
 	void ScriptUndoRedo::internal_Redo(ScriptUndoRedo* thisPtr)
 	{
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		undoRedo->redo();
 	}
 
+	void ScriptUndoRedo::internal_RegisterCommand(ScriptUndoRedo* thisPtr, ScriptCmdManaged* command)
+	{
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
+		undoRedo->registerCommand(command->getInternal());
+	}
+
 	void ScriptUndoRedo::internal_PushGroup(ScriptUndoRedo* thisPtr, MonoString* name)
 	{
 		String nativeName = MonoUtil::monoToString(name);
 
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		undoRedo->pushGroup(nativeName);
 	}
 
@@ -91,19 +99,19 @@ namespace BansheeEngine
 	{
 		String nativeName = MonoUtil::monoToString(name);
 
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		undoRedo->popGroup(nativeName);
 	}
 
 	UINT32 ScriptUndoRedo::internal_GetTopCommandId(ScriptUndoRedo* thisPtr)
 	{
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		return undoRedo->getTopCommandId();
 	}
 
 	void ScriptUndoRedo::internal_PopCommand(ScriptUndoRedo* thisPtr, UINT32 id)
 	{
-		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : GlobalUndoRedo::instancePtr();
+		UndoRedo* undoRedo = thisPtr->mUndoRedo != nullptr ? thisPtr->mUndoRedo.get() : UndoRedo::instancePtr();
 		undoRedo->popCommand(id);
 	}