Sfoglia il codice sorgente

Tabbed title bar is now draggable again
Dock overlay only appears over content area and not entire widget container

Marko Pintera 12 anni fa
parent
commit
1125f26ea8

+ 3 - 0
CamelotClient/Include/BsDockManager.h

@@ -38,6 +38,8 @@ namespace BansheeEditor
 			 */
 			 */
 			DockContainer* findAtPos(const CM::Vector2I& pos);
 			DockContainer* findAtPos(const CM::Vector2I& pos);
 
 
+			CM::RectI getContentBounds() const;
+
 			bool mIsLeaf;
 			bool mIsLeaf;
 			DockContainer* mChildren[2];
 			DockContainer* mChildren[2];
 			DockContainer* mParent;
 			DockContainer* mParent;
@@ -85,6 +87,7 @@ namespace BansheeEditor
 
 
 		CM::HMesh mDropOverlayMesh;
 		CM::HMesh mDropOverlayMesh;
 		CM::HMaterial mDropOverlayMat;
 		CM::HMaterial mDropOverlayMat;
+		CM::RectI mLastOverlayBounds;
 
 
 		DockContainer* mMouseOverContainer;
 		DockContainer* mMouseOverContainer;
 		DockLocation mHighlightedDropLoc;
 		DockLocation mHighlightedDropLoc;

+ 2 - 0
CamelotClient/Include/BsEditorWidgetContainer.h

@@ -21,6 +21,8 @@ namespace BansheeEditor
 		CM::UINT32 getNumWidgets() const { return (CM::UINT32)mWidgets.size(); }
 		CM::UINT32 getNumWidgets() const { return (CM::UINT32)mWidgets.size(); }
 		BS::GUIWidget& getParentWidget() const { return *mParent; }
 		BS::GUIWidget& getParentWidget() const { return *mParent; }
 
 
+		CM::RectI getContentBounds() const;
+
 		void _notifyWidgetDestroyed(EditorWidget* widget);
 		void _notifyWidgetDestroyed(EditorWidget* widget);
 		bool _isHandlingWidgetDragAndDrop() const { return mIsHandlingWidgetDragAndDrop; }
 		bool _isHandlingWidgetDragAndDrop() const { return mIsHandlingWidgetDragAndDrop; }
 		void _addCallbackOnDraggedWidgetDropped(std::function<void()> callback);
 		void _addCallbackOnDraggedWidgetDropped(std::function<void()> callback);

+ 26 - 15
CamelotClient/Source/BsDockManager.cpp

@@ -244,6 +244,14 @@ namespace BansheeEditor
 		return nullptr;
 		return nullptr;
 	}
 	}
 
 
+	RectI DockManager::DockContainer::getContentBounds() const
+	{
+		if(!mIsLeaf)
+			return mArea;
+
+		return mWidgets->getContentBounds();
+	}
+
 	DockManager::DockManager(BS::GUIWidget* parent, CM::RenderWindow* parentWindow)
 	DockManager::DockManager(BS::GUIWidget* parent, CM::RenderWindow* parentWindow)
 		:mParent(parent), mParentWindow(parentWindow), mMouseOverContainer(nullptr), mHighlightedDropLoc(DockLocation::None),
 		:mParent(parent), mParentWindow(parentWindow), mMouseOverContainer(nullptr), mHighlightedDropLoc(DockLocation::None),
 		mShowOverlay(false)
 		mShowOverlay(false)
@@ -533,27 +541,28 @@ namespace BansheeEditor
 			Vector2 windowPosVec(tfrmdPos.x, tfrmdPos.y);
 			Vector2 windowPosVec(tfrmdPos.x, tfrmdPos.y);
 			Vector2I windowPos(Math::roundToInt(windowPosVec.x), Math::roundToInt(windowPosVec.y));
 			Vector2I windowPos(Math::roundToInt(windowPosVec.x), Math::roundToInt(windowPosVec.y));
 
 
-			DockContainer* mouseOverContainer = mRootContainer.findAtPos(windowPos);
-			if(mouseOverContainer == nullptr)
-				mouseOverContainer = &mRootContainer;
+			mMouseOverContainer = mRootContainer.findAtPos(windowPos);
+			if(mMouseOverContainer == nullptr)
+				mMouseOverContainer = &mRootContainer;
+
+			RectI overlayBounds;
+			
+			if(mMouseOverContainer != nullptr)
+				overlayBounds = mMouseOverContainer->getContentBounds();
 
 
 			// Update mesh if needed
 			// Update mesh if needed
-			if(mouseOverContainer != mMouseOverContainer)
+			if(mLastOverlayBounds != overlayBounds)
 			{
 			{
-				mMouseOverContainer = mouseOverContainer;
-
-				if(mMouseOverContainer == nullptr)
-				{
+				if(overlayBounds.width <= 0 || overlayBounds.height <= 0)
 					mDropOverlayMesh = HMesh();
 					mDropOverlayMesh = HMesh();
-				}
 				else
 				else
-				{
-					updateDropOverlay(mMouseOverContainer->mArea.x, mMouseOverContainer->mArea.y, mMouseOverContainer->mArea.width, mMouseOverContainer->mArea.height);
-				}
+					updateDropOverlay(overlayBounds.x, overlayBounds.y, overlayBounds.width, overlayBounds.height);
+
+				mLastOverlayBounds = overlayBounds;
 			}
 			}
 
 
 			// Check if we need to highlight any drop locations
 			// Check if we need to highlight any drop locations
-			if(mouseOverContainer)
+			if(mMouseOverContainer != nullptr)
 			{
 			{
 				if(insidePolygon(mTopDropPolygon, 4, windowPosVec))
 				if(insidePolygon(mTopDropPolygon, 4, windowPosVec))
 					mHighlightedDropLoc = DockLocation::Top;
 					mHighlightedDropLoc = DockLocation::Top;
@@ -566,7 +575,7 @@ namespace BansheeEditor
 				else
 				else
 					mHighlightedDropLoc = DockLocation::None;
 					mHighlightedDropLoc = DockLocation::None;
 
 
-				if(mouseOverContainer->mArea.contains(windowPos))
+				if(overlayBounds.contains(windowPos))
 					mShowOverlay = true;
 					mShowOverlay = true;
 				else
 				else
 					mShowOverlay = false;
 					mShowOverlay = false;
@@ -591,9 +600,11 @@ namespace BansheeEditor
 			Vector2I windowPos(Math::roundToInt(windowPosVec.x), Math::roundToInt(windowPosVec.y));
 			Vector2I windowPos(Math::roundToInt(windowPosVec.x), Math::roundToInt(windowPosVec.y));
 
 
 			DockContainer* mouseOverContainer = mRootContainer.findAtPos(windowPos);
 			DockContainer* mouseOverContainer = mRootContainer.findAtPos(windowPos);
+
 			if(mouseOverContainer == nullptr)
 			if(mouseOverContainer == nullptr)
 			{
 			{
-				if(mRootContainer.mArea.contains(windowPos))
+				RectI overlayBounds = mRootContainer.getContentBounds();
+				if(overlayBounds.contains(windowPos))
 				{
 				{
 					insert(nullptr, draggedWidget, DockLocation::None);
 					insert(nullptr, draggedWidget, DockLocation::None);
 				}
 				}

+ 5 - 0
CamelotClient/Source/BsEditorWidgetContainer.cpp

@@ -240,6 +240,11 @@ namespace BansheeEditor
 		}
 		}
 	}
 	}
 
 
+	RectI EditorWidgetContainer::getContentBounds() const
+	{
+		return RectI(mX, mY + TitleBarHeight, mWidth, (UINT32)std::max(0, (INT32)mHeight - (INT32)TitleBarHeight));
+	}
+
 	void EditorWidgetContainer::_notifyWidgetDestroyed(EditorWidget* widget)
 	void EditorWidgetContainer::_notifyWidgetDestroyed(EditorWidget* widget)
 	{
 	{
 		for(auto& curWidget : mWidgets)
 		for(auto& curWidget : mWidgets)

+ 1 - 4
CamelotClient/Source/BsGUITabbedTitleBar.cpp

@@ -193,9 +193,6 @@ namespace BansheeEditor
 			curX += TAB_SPACING;
 			curX += TAB_SPACING;
 
 
 			Vector2I offset(curX, curY);
 			Vector2I offset(curX, curY);
-			if(mDragInProgress && btn == mDraggedBtn)
-				offset.x = mDragBtnOffset;
-			
 			btn->_setOffset(offset);
 			btn->_setOffset(offset);
 			btn->_setWidth(optimalSize.x);
 			btn->_setWidth(optimalSize.x);
 			btn->_setHeight(optimalSize.y);
 			btn->_setHeight(optimalSize.y);
@@ -293,7 +290,7 @@ namespace BansheeEditor
 					mDragInProgress = true;
 					mDragInProgress = true;
 				}
 				}
 
 
-				mDragBtnOffset = dragPos.x - bounds.x - mInitialDragOffset;
+				mDragBtnOffset = dragPos.x - mInitialDragOffset;
 				
 				
 				Vector2I offset = mDraggedBtn->_getOffset();
 				Vector2I offset = mDraggedBtn->_getOffset();
 				INT32 diff = mDragBtnOffset - offset.x;
 				INT32 diff = mDragBtnOffset - offset.x;

+ 2 - 1
EditorWindowDock.txt

@@ -1,5 +1,6 @@
 TODO:
 TODO:
- - Dock manager doesn't work as intended when I drag two windows onto it
+ - Docking/Undocking elements will cause an exception. Happened after TabbedTitleBar refactor
+ - When I dock two windows (maybe even just one?) and drag the title bar, layout seems to get messed up
  - Ensure that dragging items onto the title bar works
  - Ensure that dragging items onto the title bar works
 
 
 Resize sliders
 Resize sliders