Просмотр исходного кода

Temporarily docked window tab (during drag and drop) can now be undocked by dragging it off again

Marko Pintera 10 лет назад
Родитель
Сommit
185c7efa71

+ 3 - 2
BansheeEditor/Source/BsGUITabbedTitleBar.cpp

@@ -12,6 +12,7 @@
 #include "BsEditorWidget.h"
 #include "BsMath.h"
 #include "BsPlatform.h"
+#include "BsRenderTarget.h"
 
 using namespace std::placeholders;
 
@@ -185,7 +186,7 @@ namespace BansheeEngine
 
 				mTempDraggedWidget = draggedWidget;
 				startDrag(uniqueIdxToSeqIdx(mTempDraggedTabIdx), Vector2I());
-				mInitialDragOffset = Math::roundToInt(mDraggedBtn->_getOptimalSize().x * 0.5f);
+				mInitialDragOffset = Math::roundToInt(mDraggedBtn->_getOptimalSize().x * 0.5f);		
 			}
 
 			if(mTempDraggedWidget != nullptr)
@@ -214,7 +215,7 @@ namespace BansheeEngine
 
 			return true;
 		}
-		else if(event.getType() == GUIMouseEventType::MouseOut)
+		else if(event.getType() == GUIMouseEventType::MouseDragAndDropLeft)
 		{
 			if(mTempDraggedWidget != nullptr)
 			{

+ 6 - 0
BansheeEngine/Include/BsGUIMouseEvent.h

@@ -22,6 +22,7 @@ namespace BansheeEngine
 		MouseDragEnd,
 		MouseDragAndDropDragged,
 		MouseDragAndDropDropped,
+		MouseDragAndDropLeft
 	};
 
 	/**
@@ -161,6 +162,11 @@ namespace BansheeEngine
 		 */
 		void setDragAndDropDraggedData(const Vector2I& position, UINT32 dragTypeId, void* dragData);
 
+		/**
+		 * @brief	Initializes the event with DragAndDropLeft event data.
+		 */
+		void setDragAndDropLeftData(const Vector2I& position, UINT32 dragTypeId, void* dragData);
+
 		bool mButtonStates[(int)GUIMouseButton::Count];
 		Vector2I mPosition;
 		Vector2I mDragAmount;

+ 26 - 3
BansheeEngine/Source/BsGUIManager.cpp

@@ -1237,17 +1237,40 @@ namespace BansheeEngine
 			}
 		}
 
+		// Send DragAndDropLeft event - It is similar to MouseOut events but we send it to all
+		// elements a user might hover over, while we send mouse over/out events only to active elements while dragging
+		if (DragAndDropManager::instance().isDragInProgress())
+		{
+			for (auto& elementInfo : mElementsUnderPointer)
+			{
+				auto iterFind = std::find_if(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
+					[=](const ElementInfoUnderPointer& x) { return x.element == elementInfo.element; });
+
+				if (iterFind == mNewElementsUnderPointer.end())
+				{
+					Vector2I localPos = getWidgetRelativePos(*elementInfo.widget, pointerScreenPos);
+
+					mMouseEvent.setDragAndDropLeftData(localPos, DragAndDropManager::instance().getDragTypeId(), DragAndDropManager::instance().getDragData());
+					if (sendMouseEvent(elementInfo.widget, elementInfo.element, mMouseEvent))
+					{
+						eventProcessed = true;
+						break;
+					}
+				}
+			}
+		}
+
 		for(auto& elementInfo : mElementsUnderPointer)
 		{
 			GUIElement* element = elementInfo.element;
 			GUIWidget* widget = elementInfo.widget;
 
+			auto iterFind = std::find_if(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
+				[=](const ElementInfoUnderPointer& x) { return x.element == element; });
+
 			if (!elementInfo.receivedMouseOver)
 				continue;
 
-			auto iterFind = std::find_if(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
-				[=] (const ElementInfoUnderPointer& x) { return x.element == element; });
-
 			if (iterFind == mNewElementsUnderPointer.end() || !iterFind->isHovering)
 			{
 				auto iterFind2 = std::find_if(mActiveElements.begin(), mActiveElements.end(), 

+ 11 - 0
BansheeEngine/Source/BsGUIMouseEvent.cpp

@@ -127,4 +127,15 @@ namespace BansheeEngine
 		mDragTypeId = dragTypeId;
 		mDragData = dragData;
 	}
+
+	void GUIMouseEvent::setDragAndDropLeftData(const Vector2I& position, UINT32 dragTypeId, void* dragData)
+	{
+		mType = GUIMouseEventType::MouseDragAndDropLeft;
+		mPosition = position;
+		mButton = GUIMouseButton::Left;
+		mDragAmount = Vector2I();
+		mWheelScrollAmount = 0.0f;
+		mDragTypeId = dragTypeId;
+		mDragData = dragData;
+	}
 }

+ 0 - 2
TODO.txt

@@ -56,8 +56,6 @@ Code quality improvements:
 ----------------------------------------------------------------------
 Polish stage 1
 
-Docking a window to another windows title bar doesn't seem to work
- - Seems to only happen when windows are docked
 Fix DX11 (and possibly DX9) rendering
 After undocking ProjectWindow the auto-scroll seems to be stuck in up position
 Decent looking default layout