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

Dragging items onto tabbed title bar somewhat works

Marko Pintera 12 лет назад
Родитель
Сommit
e5cdc5fd80

+ 0 - 1
BansheeEngine/Include/BsGUIManager.h

@@ -199,7 +199,6 @@ namespace BansheeEngine
 		void processDestroyQueue();
 
 		bool findElementUnderCursor(const CM::Vector2I& screenMousePos, bool buttonStates[3], bool shift, bool control, bool alt);
-		bool handleCursorOver(const CM::Vector2I& screenMousePos, bool buttonStates[3], bool shift, bool control, bool alt);
 
 		void onCursorMoved(const CM::PositionalInputEvent& event);
 		void onCursorReleased(const CM::PositionalInputEvent& event);

+ 26 - 9
BansheeEngine/Source/BsGUIManager.cpp

@@ -1049,13 +1049,8 @@ namespace BansheeEngine
 			return a.element->_getDepth() < b.element->_getDepth();
 		});
 
-		return handleCursorOver(cursorScreenPos, buttonStates, shift, control, alt);
-	}
-
-	bool GUIManager::handleCursorOver(const CM::Vector2I& screenPos, bool buttonStates[3], bool shift, bool control, bool alt)
-	{
+		// Send MouseOut and MouseOver events
 		bool eventProcessed = false;
-
 		for(auto& elementInfo : mNewElementsUnderCursor)
 		{
 			GUIElement* element = elementInfo.element;
@@ -1071,7 +1066,7 @@ namespace BansheeEngine
 				{
 					Vector2I localPos;
 					if(widget != nullptr)
-						localPos = getWidgetRelativePos(*widget, screenPos);
+						localPos = getWidgetRelativePos(*widget, cursorScreenPos);
 
 					mMouseEvent = GUIMouseEvent(buttonStates, shift, control, alt);
 
@@ -1095,7 +1090,7 @@ namespace BansheeEngine
 				// Send MouseOut event
 				if(mActiveElement == nullptr || element == mActiveElement)
 				{
-					Vector2I curLocalPos = getWidgetRelativePos(*widget, screenPos);
+					Vector2I curLocalPos = getWidgetRelativePos(*widget, cursorScreenPos);
 
 					mMouseEvent.setMouseOutData(curLocalPos);
 					if(sendMouseEvent(widget, element, mMouseEvent))
@@ -1151,7 +1146,29 @@ namespace BansheeEngine
 		buttonStates[2] = false;
 
 		mNewElementsUnderCursor.clear();
-		handleCursorOver(Vector2I(), buttonStates, false, false, false);
+
+		for(auto& elementInfo : mElementsUnderCursor)
+		{
+			GUIElement* element = elementInfo.element;
+			GUIWidget* widget = elementInfo.widget;
+
+			if(widget->getTarget()->getTarget().get() != win)
+			{
+				mNewElementsUnderCursor.push_back(elementInfo);
+				continue;
+			}
+
+			// Send MouseOut event
+			if(mActiveElement == nullptr || element == mActiveElement)
+			{
+				Vector2I curLocalPos = getWidgetRelativePos(*widget, Vector2I());
+
+				mMouseEvent.setMouseOutData(curLocalPos);
+				sendMouseEvent(widget, element, mMouseEvent);
+			}
+		}
+
+		mElementsUnderCursor.swap(mNewElementsUnderCursor);
 	}
 
 	void GUIManager::queueForDestroy(GUIElement* element)

+ 5 - 1
CamelotClient/Include/BsGUITabbedTitleBar.h

@@ -33,6 +33,8 @@ namespace BansheeEditor
 	protected:
 		virtual ~GUITabbedTitleBar();
 
+		void updateClippedBounds();
+
 		void _updateLayoutInternal(CM::INT32 x, CM::INT32 y, CM::UINT32 width, CM::UINT32 height,
 			CM::RectI clipRect, CM::UINT8 widgetDepth, CM::UINT16 areaDepth);
 	protected:
@@ -49,6 +51,9 @@ namespace BansheeEditor
 		BS::GUIToggleGroupPtr mTabToggleGroup;
 		CM::RenderWindow* mParentWindow;
 
+		EditorWidget* mTempDraggedWidget;
+		CM::UINT32 mTempDraggedTabIdx;
+
 		bool mDragInProgress;
 		GUITabButton* mDraggedBtn;
 		CM::INT32 mDragBtnOffset;
@@ -70,7 +75,6 @@ namespace BansheeEditor
 		void tabClosed();
 		void tabDragged(CM::UINT32 tabIdx, const CM::Vector2I& dragPos);
 		void tabDragEnd(CM::UINT32 tabIdx, const CM::Vector2I& dragPos);
-		void tabDraggedOn(CM::UINT32 tabIdx);
 
 		CM::INT32 uniqueIdxToSeqIdx(CM::UINT32 uniqueIdx) const;
 	};

+ 112 - 15
CamelotClient/Source/BsGUITabbedTitleBar.cpp

@@ -8,6 +8,9 @@
 #include "BsGUIWindowDropArea.h"
 #include "BsEngineGUI.h"
 #include "BsGUIWidget.h"
+#include "BsGUIMouseEvent.h"
+#include "BsDragAndDropManager.h"
+#include "BsEditorWidget.h"
 #include "CmMath.h"
 #include "CmPlatform.h"
 
@@ -24,7 +27,8 @@ namespace BansheeEditor
 		:GUIElementContainer(parent, layoutOptions), mParentWindow(parentWindow), mMinBtn(nullptr), 
 		mCloseBtn(nullptr), mBackgroundImage(nullptr), mUniqueTabIdx(0), mActiveTabIdx(0),
 		mDragInProgress(false), mDraggedBtn(nullptr), mDragBtnOffset(0), mInitialDragOffset(0), mBackgroundStyle(backgroundStyle),
-		mTabBtnStyle(tabBtnStyle), mMinimizeBtnStyle(minBtnStyle), mCloseBtnStyle(closeBtnStyle)
+		mTabBtnStyle(tabBtnStyle), mMinimizeBtnStyle(minBtnStyle), mCloseBtnStyle(closeBtnStyle), mTempDraggedWidget(nullptr),
+		mTempDraggedTabIdx(0)
 	{
 		if(mBackgroundStyle == nullptr)
 			mBackgroundStyle = parent.getSkin().getStyle("TitleBarBackground");
@@ -91,6 +95,8 @@ namespace BansheeEditor
 		mTabButtons.insert(mTabButtons.begin() + idx, newTabToggle);
 
 		mUniqueTabIdx++;
+
+		markContentAsDirty();
 	}
 
 	void GUITabbedTitleBar::removeTab(UINT32 idx)
@@ -103,11 +109,104 @@ namespace BansheeEditor
 		GUIElement::destroy(mTabButtons[idx]);
 
 		mTabButtons.erase(mTabButtons.begin() + idx);
+
+		markContentAsDirty();
 	}
 
-	bool GUITabbedTitleBar::mouseEvent(const GUIMouseEvent& ev)
+	bool GUITabbedTitleBar::mouseEvent(const GUIMouseEvent& event)
 	{
-		// TODO
+		if(event.getType() == GUIMouseEventType::MouseDragAndDropDragged)
+		{
+			if(DragAndDropManager::instance().getDragTypeId() != (UINT32)DragAndDropType::EditorWidget)
+				return false;
+
+			EditorWidget* draggedWidget = reinterpret_cast<EditorWidget*>(DragAndDropManager::instance().getDragData());
+			const Vector2I& widgetRelPos = event.getPosition();
+
+			if(mTempDraggedWidget == nullptr)
+			{
+				UINT32 numTabButtons = (UINT32)mTabButtons.size();
+				for(UINT32 i = 0; i < numTabButtons; i++)
+				{
+					UINT32 width = mTabButtons[i]->_getWidth();
+					INT32 centerX = mTabButtons[i]->_getOffset().x + width / 2;
+
+					if((i + 1) == numTabButtons)
+					{
+						if(widgetRelPos.x >= centerX)
+						{
+							addTab(draggedWidget->getName());
+							mTempDraggedTabIdx = mTabButtons[i + 1]->getIndex();
+
+							break;
+						}
+					}
+					else
+					{
+						if(i == 0 && widgetRelPos.x <= centerX)
+						{
+							insertTab(0, draggedWidget->getName());
+							mTempDraggedTabIdx = mTabButtons[0]->getIndex();
+
+							break;
+						}
+						else
+						{
+							UINT32 nextWidth = mTabButtons[i + 1]->_getWidth();
+							INT32 nextCenterX = mTabButtons[i + 1]->_getOffset().x + nextWidth / 2;
+
+							if(widgetRelPos.x > centerX && widgetRelPos.x < nextCenterX)
+							{
+								insertTab(i + 1, draggedWidget->getName());
+								mTempDraggedTabIdx = mTabButtons[i + 1]->getIndex();
+
+								break;
+							}
+						}
+					}
+				}
+
+				mTempDraggedWidget = draggedWidget;
+
+				mInitialDragOffset = Math::roundToInt(mTabButtons[uniqueIdxToSeqIdx(mTempDraggedTabIdx)]->_getWidth() * 0.5f);
+				mDragInProgress = true;
+			}
+
+			if(mTempDraggedWidget != nullptr)
+				tabDragged(mTempDraggedTabIdx, widgetRelPos);
+
+			return true;
+		}
+		else if(event.getType() == GUIMouseEventType::MouseDragAndDropDropped)
+		{
+			if(DragAndDropManager::instance().getDragTypeId() != (UINT32)DragAndDropType::EditorWidget)
+				return false;
+
+			EditorWidget* draggedWidget = reinterpret_cast<EditorWidget*>(DragAndDropManager::instance().getDragData());
+			const Vector2I& widgetRelPos = event.getPosition();
+
+			if(mTempDraggedWidget != nullptr)
+			{
+				UINT32 tabSeqIdx = uniqueIdxToSeqIdx(mTempDraggedTabIdx);
+				removeTab(tabSeqIdx);
+
+				mTempDraggedWidget = nullptr;
+
+				if(!onTabDraggedOn.empty())
+					onTabDraggedOn(tabSeqIdx);
+			}
+
+			return true;
+		}
+		else if(event.getType() == GUIMouseEventType::MouseOut)
+		{
+			if(mTempDraggedWidget != nullptr)
+			{
+				removeTab(uniqueIdxToSeqIdx(mTempDraggedTabIdx));
+
+				mTempDraggedWidget = nullptr;
+			}
+		}
 
 		return false;
 	}
@@ -132,6 +231,12 @@ namespace BansheeEditor
 		return mTabButtons[idx - 3];
 	}
 
+	void GUITabbedTitleBar::updateClippedBounds()
+	{
+		Vector2I offset = _getOffset();
+		mClippedBounds = RectI(offset.x, offset.y, _getWidth(), _getHeight());
+	}
+
 	void GUITabbedTitleBar::_updateLayoutInternal(INT32 x, INT32 y, UINT32 width, UINT32 height,
 		RectI clipRect, UINT8 widgetDepth, UINT16 areaDepth)
 	{
@@ -271,8 +376,6 @@ namespace BansheeEditor
 				clipRect.x -= diff;
 				mDraggedBtn->_setClipRect(clipRect);
 
-				mDragInProgress = true;
-
 				for(INT32 i = 0; i < idx; i++)
 				{
 					UINT32 width = mTabButtons[i]->_getWidth();
@@ -284,6 +387,8 @@ namespace BansheeEditor
 						mTabButtons[i] = mTabButtons[idx];
 						mTabButtons[idx] = temp;
 
+						markContentAsDirty();
+
 						break;
 					}
 				}
@@ -299,6 +404,8 @@ namespace BansheeEditor
 						mTabButtons[i] = mTabButtons[idx];
 						mTabButtons[idx] = temp;
 
+						markContentAsDirty();
+
 						break;
 					}
 				}
@@ -322,16 +429,6 @@ namespace BansheeEditor
 		markContentAsDirty();
 	}
 
-	void GUITabbedTitleBar::tabDraggedOn(CM::UINT32 tabIdx)
-	{
-		INT32 idx = uniqueIdxToSeqIdx(tabIdx);
-		if(idx != -1)
-		{
-			if(!onTabDraggedOn.empty())
-				onTabDraggedOn(idx + 1);
-		}
-	}
-
 	CM::INT32 GUITabbedTitleBar::uniqueIdxToSeqIdx(CM::UINT32 uniqueIdx) const
 	{
 		UINT32 idx = 0;