Browse Source

Selecting a resource properly removes the selection overlay and active handle from scene view

Marko Pintera 10 years ago
parent
commit
251c1f13b1

+ 6 - 2
BansheeEditor/Include/BsSceneViewHandler.h

@@ -23,14 +23,18 @@ namespace BansheeEngine
 		void update();
 
 		/**
-		 * @brief	Updates currently active handles and updates 
-		 *			handles and selection drawing.
+		 * @brief	Updates currently active handles.
 		 *
 		 * @param	position	Position of the pointer relative to the scene camera viewport.
 		 * @param	delta		Movement of the pointer since last frame.
 		 */
 		void updateHandle(const Vector2I& position, const Vector2I& delta);
 
+		/**
+		 * @brief	Updates the selection overlay for currently selected object(s).
+		 */
+		void updateSelection();
+
 		/**
 		 * @brief	Selects a handle under the pointer position.
 		 *

+ 4 - 1
BansheeEditor/Source/BsSceneViewHandler.cpp

@@ -56,8 +56,11 @@ namespace BansheeEngine
 			mMouseDeltaCompensate = wrapCursorToWindow();
 
 		HandleManager::instance().update(mCamera, position, realDelta);
+	}
 
-		// Update selection here since this is triggered after user potentially selects a new object
+	void SceneViewHandler::updateSelection()
+	{
+		// Call this after handle update to ensure its drawn at the right place
 		mSelectionRenderer->update(mCamera);
 	}
 

+ 8 - 0
MBansheeEditor/Scene/SceneViewHandler.cs

@@ -25,6 +25,11 @@ namespace BansheeEditor
             Internal_UpdateHandle(mCachedPtr, pointerPos, inputDelta);
         }
 
+        internal void UpdateSelection()
+        {
+            Internal_UpdateSelection(mCachedPtr);
+        }
+
         internal void TrySelectHandle(Vector2I pointerPos)
         {
             Internal_TrySelectHandle(mCachedPtr, pointerPos);
@@ -54,6 +59,9 @@ namespace BansheeEditor
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_UpdateHandle(IntPtr thisPtr, Vector2I pointerPos, Vector2I inputDelta);
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_UpdateSelection(IntPtr thisPtr);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_TrySelectHandle(IntPtr thisPtr, Vector2I pointerPos);
 

+ 16 - 16
MBansheeEditor/Scene/SceneWindow.cs

@@ -268,33 +268,33 @@ namespace BansheeEditor
                 }
             }
 
-            if (!HasFocus)
+            if (HasFocus)
             {
-                cameraController.SceneObject.Active = false;
-                return;
-            }
-            else
                 cameraController.SceneObject.Active = true;
 
-            if (inBounds)
-            {
-                if (Input.IsPointerButtonDown(PointerButton.Left))
-                {
-                    sceneViewHandler.TrySelectHandle(scenePos);
-                }
-                else if (Input.IsPointerButtonUp(PointerButton.Left))
+                if (inBounds)
                 {
-                    if (!handleActive)
+                    if (Input.IsPointerButtonDown(PointerButton.Left))
+                    {
+                        sceneViewHandler.TrySelectHandle(scenePos);
+                    }
+                    else if (Input.IsPointerButtonUp(PointerButton.Left))
                     {
-                        bool ctrlHeld = Input.IsButtonHeld(ButtonCode.LeftControl) ||
-                            Input.IsButtonHeld(ButtonCode.RightControl);
+                        if (!handleActive)
+                        {
+                            bool ctrlHeld = Input.IsButtonHeld(ButtonCode.LeftControl) ||
+                                            Input.IsButtonHeld(ButtonCode.RightControl);
 
-                        sceneViewHandler.PickObject(scenePos, ctrlHeld);
+                            sceneViewHandler.PickObject(scenePos, ctrlHeld);
+                        }
                     }
                 }
             }
+            else
+                cameraController.SceneObject.Active = false;
 
             sceneViewHandler.UpdateHandle(scenePos, Input.PointerDelta);
+            sceneViewHandler.UpdateSelection();
         }
 
         protected override void WindowResized(int width, int height)

+ 1 - 0
SBansheeEditor/Include/BsScriptSceneViewHandler.h

@@ -14,6 +14,7 @@ namespace BansheeEngine
 		static void internal_Create(MonoObject* managedInstance, ScriptEditorWindow* parentWindow, ScriptCameraHandler* camera);
 		static void internal_Update(ScriptSceneViewHandler* thisPtr);
 		static void internal_UpdateHandle(ScriptSceneViewHandler* thisPtr, Vector2I inputPos, Vector2I inputDelta);
+		static void internal_UpdateSelection(ScriptSceneViewHandler* thisPtr);
 		static void internal_TrySelectHandle(ScriptSceneViewHandler* thisPtr, Vector2I inputPos);
 		static bool internal_IsHandleActive(ScriptSceneViewHandler* thisPtr, Vector2I inputPos);
 		static void internal_ClearHandleSelection(ScriptSceneViewHandler* thisPtr, Vector2I inputPos);

+ 6 - 0
SBansheeEditor/Source/BsScriptSceneViewHandler.cpp

@@ -26,6 +26,7 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_Create", &ScriptSceneViewHandler::internal_Create);
 		metaData.scriptClass->addInternalCall("Internal_Update", &ScriptSceneViewHandler::internal_Update);
 		metaData.scriptClass->addInternalCall("Internal_UpdateHandle", &ScriptSceneViewHandler::internal_UpdateHandle);
+		metaData.scriptClass->addInternalCall("Internal_UpdateSelection", &ScriptSceneViewHandler::internal_UpdateSelection);
 		metaData.scriptClass->addInternalCall("Internal_TrySelectHandle", &ScriptSceneViewHandler::internal_TrySelectHandle);
 		metaData.scriptClass->addInternalCall("Internal_IsHandleActive", &ScriptSceneViewHandler::internal_IsHandleActive);
 		metaData.scriptClass->addInternalCall("Internal_ClearHandleSelection", &ScriptSceneViewHandler::internal_ClearHandleSelection);
@@ -52,6 +53,11 @@ namespace BansheeEngine
 		thisPtr->mHandler->updateHandle(inputPos, inputDelta);
 	}
 
+	void ScriptSceneViewHandler::internal_UpdateSelection(ScriptSceneViewHandler* thisPtr)
+	{
+		thisPtr->mHandler->updateSelection();
+	}
+
 	void ScriptSceneViewHandler::internal_TrySelectHandle(ScriptSceneViewHandler* thisPtr, Vector2I inputPos)
 	{
 		thisPtr->mHandler->trySelectHandle(inputPos);