Browse Source

Removed mouse over element for GUIMouseEvent

Marko Pintera 12 years ago
parent
commit
1f149c571e

+ 1 - 0
BansheeEngine/Include/BsGUIInputBox.h

@@ -68,6 +68,7 @@ namespace BansheeEngine
 		bool mIsMultiline;
 		CM::Vector2I mTextOffset;
 		bool mHasFocus;
+		bool mIsMouseOver;
 
 		HSpriteTexture mActiveTexture;
 		IMAGE_SPRITE_DESC mImageDesc;

+ 10 - 0
BansheeEngine/Include/BsGUIManager.h

@@ -46,6 +46,16 @@ namespace BansheeEngine
 			GUIWidget* widget;
 		};
 
+		struct ElementInfo
+		{
+			ElementInfo(GUIElement* element, GUIWidget* widget)
+				:element(element), widget(widget)
+			{ }
+
+			GUIElement* element;
+			GUIWidget* widget;
+		};
+
 	public:
 		GUIManager();
 		~GUIManager();

+ 12 - 14
BansheeEngine/Include/BsGUIMouseEvent.h

@@ -38,7 +38,6 @@ namespace BansheeEngine
 		CM::Vector2I getDragAmount() const { return mDragAmount; }
 		float getWheelScrollAmount() const { return mWheelScrollAmount; }
 		bool isButtonDown(GUIMouseButton button) const { return mButtonStates[(int)button]; }
-		GUIElement* getMouseOverElement() const { return mMouseOverElement; }
 		CM::UINT32 getDragAndDropTypeId() const { return mDragTypeId; }
 		void* getDragAndDropData() const { return mDragData; }
 
@@ -54,7 +53,6 @@ namespace BansheeEngine
 		float mWheelScrollAmount;
 		GUIMouseEventType mType;
 		GUIMouseButton mButton;
-		GUIElement* mMouseOverElement;
 		CM::UINT32 mDragTypeId;
 		void* mDragData;
 
@@ -62,19 +60,19 @@ namespace BansheeEngine
 		bool mCtrl;
 		bool mAlt;
 
-		void setMouseOverData(GUIElement* mouseOverElement, const CM::Vector2I& position);
-		void setMouseOutData(GUIElement* mouseOverElement, const CM::Vector2I& position);
-		void setMouseMoveData(GUIElement* mouseOverElement, const CM::Vector2I& position);
-		void setMouseWheelScrollData(GUIElement* mouseOverElement, float scrollAmount);
-		void setMouseUpData(GUIElement* mouseOverElement, const CM::Vector2I& position, GUIMouseButton button);
-		void setMouseDownData(GUIElement* mouseOverElement, const CM::Vector2I& position, GUIMouseButton button);
-		void setMouseDoubleClickData(GUIElement* mouseOverElement, const CM::Vector2I& position, GUIMouseButton button);
+		void setMouseOverData(const CM::Vector2I& position);
+		void setMouseOutData(const CM::Vector2I& position);
+		void setMouseMoveData(const CM::Vector2I& position);
+		void setMouseWheelScrollData(float scrollAmount);
+		void setMouseUpData(const CM::Vector2I& position, GUIMouseButton button);
+		void setMouseDownData(const CM::Vector2I& position, GUIMouseButton button);
+		void setMouseDoubleClickData(const CM::Vector2I& position, GUIMouseButton button);
 
-		void setMouseDragData(GUIElement* mouseOverElement, const CM::Vector2I& position, const CM::Vector2I& dragAmount);
-		void setMouseDragStartData(GUIElement* mouseOverElement, const CM::Vector2I& position);
-		void setMouseDragEndData(GUIElement* mouseOverElement, const CM::Vector2I& position);
+		void setMouseDragData(const CM::Vector2I& position, const CM::Vector2I& dragAmount);
+		void setMouseDragStartData(const CM::Vector2I& position);
+		void setMouseDragEndData(const CM::Vector2I& position);
 
-		void setDragAndDropDroppedData(GUIElement* mouseOverElement, const CM::Vector2I& position, CM::UINT32 dragTypeId, void* dragData);
-		void setDragAndDropDraggedData(GUIElement* mouseOverElement, const CM::Vector2I& position, CM::UINT32 dragTypeId, void* dragData);
+		void setDragAndDropDroppedData(const CM::Vector2I& position, CM::UINT32 dragTypeId, void* dragData);
+		void setDragAndDropDraggedData(const CM::Vector2I& position, CM::UINT32 dragTypeId, void* dragData);
 	};
 }

+ 6 - 2
BansheeEngine/Source/BsGUIInputBox.cpp

@@ -31,7 +31,7 @@ namespace BansheeEngine
 
 	GUIInputBox::GUIInputBox(GUIWidget& parent, const GUIElementStyle* style, const GUILayoutOptions& layoutOptions, bool multiline)
 		:GUIElement(parent, style, layoutOptions), mInputCursorSet(false), mDragInProgress(false),
-		mCaretShown(false), mSelectionShown(false), mIsMultiline(multiline), mHasFocus(false)
+		mCaretShown(false), mSelectionShown(false), mIsMultiline(multiline), mHasFocus(false), mIsMouseOver(false)
 	{
 		mImageSprite = cm_new<ImageSprite, PoolAlloc>();
 		mTextSprite = cm_new<TextSprite, PoolAlloc>();
@@ -390,6 +390,8 @@ namespace BansheeEngine
 				mInputCursorSet = true;
 			}
 
+			mIsMouseOver = true;
+
 			return true;
 		}
 		else if(ev.getType() == GUIMouseEventType::MouseOut)
@@ -406,6 +408,8 @@ namespace BansheeEngine
 				mInputCursorSet = false;
 			}
 
+			mIsMouseOver = false;
+
 			return true;
 		}
 		else if(ev.getType() == GUIMouseEventType::MouseDoubleClick && ev.getButton() == GUIMouseButton::Left)
@@ -472,7 +476,7 @@ namespace BansheeEngine
 			{
 				mDragInProgress = false;
 
-				if(ev.getMouseOverElement() != this && mInputCursorSet)
+				if(!mIsMouseOver && mInputCursorSet)
 				{
 					Platform::setCursor(CursorType::Arrow);
 					mInputCursorSet = false;

+ 13 - 14
BansheeEngine/Source/BsGUIManager.cpp

@@ -581,7 +581,7 @@ namespace BansheeEngine
 				if(mWidgetUnderCursor != nullptr)
 					localPos = getWidgetRelativePos(*mWidgetUnderCursor, event.screenPos);
 
-				mMouseEvent.setDragAndDropDroppedData(mElementUnderCursor, localPos, DragAndDropManager::instance().getDragTypeId(), DragAndDropManager::instance().getDragData());
+				mMouseEvent.setDragAndDropDroppedData(localPos, DragAndDropManager::instance().getDragTypeId(), DragAndDropManager::instance().getDragData());
 				bool processed = sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent);
 
 				return processed;
@@ -615,7 +615,7 @@ namespace BansheeEngine
 
 			if(dist > DRAG_DISTANCE)
 			{
-				mMouseEvent.setMouseDragStartData(mElementUnderCursor, localPos);
+				mMouseEvent.setMouseDragStartData(localPos);
 				if(sendMouseEvent(mActiveWidget, mActiveElement, mMouseEvent))
 					event.markAsUsed();
 
@@ -630,7 +630,7 @@ namespace BansheeEngine
 
 			if(mLastCursorLocalPos != curLocalPos)
 			{
-				mMouseEvent.setMouseDragData(mElementUnderCursor, curLocalPos, curLocalPos - mLastCursorLocalPos);
+				mMouseEvent.setMouseDragData(curLocalPos, curLocalPos - mLastCursorLocalPos);
 				if(sendMouseEvent(mActiveWidget, mActiveElement, mMouseEvent))
 					event.markAsUsed();
 
@@ -644,7 +644,7 @@ namespace BansheeEngine
 				// Send MouseMove event
 				if(mLastCursorLocalPos != localPos)
 				{
-					mMouseEvent.setMouseMoveData(mElementUnderCursor, localPos);
+					mMouseEvent.setMouseMoveData(localPos);
 					if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 						event.markAsUsed();
 
@@ -654,14 +654,14 @@ namespace BansheeEngine
 				// Also if drag is in progress send DragAndDrop events
 				if(DragAndDropManager::instance().isDragInProgress())
 				{
-					mMouseEvent.setDragAndDropDraggedData(mElementUnderCursor, localPos, DragAndDropManager::instance().getDragTypeId(), DragAndDropManager::instance().getDragData());
+					mMouseEvent.setDragAndDropDraggedData(localPos, DragAndDropManager::instance().getDragTypeId(), DragAndDropManager::instance().getDragData());
 					if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 						event.markAsUsed();
 				}
 
 				if(Math::abs(event.mouseWheelScrollAmount) > 0.00001f)
 				{
-					mMouseEvent.setMouseWheelScrollData(mElementUnderCursor, event.mouseWheelScrollAmount);
+					mMouseEvent.setMouseWheelScrollData(event.mouseWheelScrollAmount);
 					if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 						event.markAsUsed();
 				}
@@ -697,7 +697,7 @@ namespace BansheeEngine
 		bool acceptMouseUp = mActiveMouseButton == guiButton && (mElementUnderCursor != nullptr && mActiveElement == mElementUnderCursor);
 		if(acceptMouseUp)
 		{
-			mMouseEvent.setMouseUpData(mElementUnderCursor, localPos, guiButton);
+			mMouseEvent.setMouseUpData(localPos, guiButton);
 
 			if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 				event.markAsUsed();
@@ -709,7 +709,7 @@ namespace BansheeEngine
 
 		if(acceptEndDrag)
 		{
-			mMouseEvent.setMouseDragEndData(mElementUnderCursor, localPos);
+			mMouseEvent.setMouseDragEndData(localPos);
 			if(sendMouseEvent(mActiveWidget, mActiveElement, mMouseEvent))
 				event.markAsUsed();
 
@@ -754,7 +754,7 @@ namespace BansheeEngine
 		{
 			Vector2I localPos = getWidgetRelativePos(*mWidgetUnderCursor, event.screenPos);
 
-			mMouseEvent.setMouseDownData(mElementUnderCursor, localPos, guiButton);
+			mMouseEvent.setMouseDownData(localPos, guiButton);
 			if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 				event.markAsUsed();
 
@@ -821,7 +821,7 @@ namespace BansheeEngine
 		{
 			Vector2I localPos = getWidgetRelativePos(*mWidgetUnderCursor, event.screenPos);
 
-			mMouseEvent.setMouseDoubleClickData(mElementUnderCursor, localPos, guiButton);
+			mMouseEvent.setMouseDoubleClickData(localPos, guiButton);
 			if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 				event.markAsUsed();
 		}
@@ -1026,8 +1026,7 @@ namespace BansheeEngine
 
 		mMouseEvent = GUIMouseEvent(buttonStates, shift, control, alt);
 
-		// Send MouseOver/MouseOut events to any elements the mouse passes over, except when
-		// mouse is being held down, in which we only send them to the active element
+		// Send MouseOver/MouseOut events to any elements the mouse passes over
 		if(element != mElementUnderCursor)
 		{
 			if(mElementUnderCursor != nullptr)
@@ -1037,7 +1036,7 @@ namespace BansheeEngine
 				{
 					Vector2I curLocalPos = getWidgetRelativePos(*mWidgetUnderCursor, screenPos);
 
-					mMouseEvent.setMouseOutData(element, curLocalPos);
+					mMouseEvent.setMouseOutData(curLocalPos);
 					if(sendMouseEvent(mWidgetUnderCursor, mElementUnderCursor, mMouseEvent))
 						eventProcessed = true;
 				}
@@ -1048,7 +1047,7 @@ namespace BansheeEngine
 				// Send MouseOver event
 				if(mActiveElement == nullptr || element == mActiveElement)
 				{
-					mMouseEvent.setMouseOverData(element, localPos);
+					mMouseEvent.setMouseOverData(localPos);
 					if(sendMouseEvent(widget, element, mMouseEvent))
 						eventProcessed = true;
 				}

+ 14 - 26
BansheeEngine/Source/BsGUIMouseEvent.cpp

@@ -5,124 +5,113 @@ using namespace CamelotFramework;
 namespace BansheeEngine
 {
 	GUIMouseEvent::GUIMouseEvent()
-		:mType(GUIMouseEventType::MouseMove), mButton(GUIMouseButton::Left), mMouseOverElement(nullptr),
+		:mType(GUIMouseEventType::MouseMove), mButton(GUIMouseButton::Left), 
 		mShift(false), mCtrl(false), mAlt(false), mWheelScrollAmount(0.0f)
 	{
 
 	}
 
 	GUIMouseEvent::GUIMouseEvent(bool buttonStates[GUIMouseButton::Count], bool shift, bool ctrl, bool alt)
-		:mType(GUIMouseEventType::MouseMove), mButton(GUIMouseButton::Left), mMouseOverElement(nullptr),
+		:mType(GUIMouseEventType::MouseMove), mButton(GUIMouseButton::Left),
 		mShift(shift), mCtrl(ctrl), mAlt(alt)
 	{
 		memcpy(mButtonStates, buttonStates, sizeof(mButtonStates));
 	}
 
-	void GUIMouseEvent::setMouseOverData(GUIElement* mouseOverElement, const Vector2I& position)
+	void GUIMouseEvent::setMouseOverData(const Vector2I& position)
 	{
 		mType = GUIMouseEventType::MouseOver;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseOutData(GUIElement* mouseOverElement, const Vector2I& position)
+	void GUIMouseEvent::setMouseOutData(const Vector2I& position)
 	{
 		mType = GUIMouseEventType::MouseOut;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseMoveData(GUIElement* mouseOverElement, const Vector2I& position)
+	void GUIMouseEvent::setMouseMoveData(const Vector2I& position)
 	{
 		mType = GUIMouseEventType::MouseMove;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseWheelScrollData(GUIElement* mouseOverElement, float scrollAmount)
+	void GUIMouseEvent::setMouseWheelScrollData(float scrollAmount)
 	{
 		mType = GUIMouseEventType::MouseWheelScroll;
 		mPosition = Vector2I();
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = scrollAmount;
 	}
 
-	void GUIMouseEvent::setMouseUpData(GUIElement* mouseOverElement, const Vector2I& position, GUIMouseButton button)
+	void GUIMouseEvent::setMouseUpData(const Vector2I& position, GUIMouseButton button)
 	{
 		mType = GUIMouseEventType::MouseUp;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = button;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseDownData(GUIElement* mouseOverElement, const Vector2I& position, GUIMouseButton button)
+	void GUIMouseEvent::setMouseDownData(const Vector2I& position, GUIMouseButton button)
 	{
 		mType = GUIMouseEventType::MouseDown;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = button;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseDoubleClickData(GUIElement* mouseOverElement, const Vector2I& position, GUIMouseButton button)
+	void GUIMouseEvent::setMouseDoubleClickData(const Vector2I& position, GUIMouseButton button)
 	{
 		mType = GUIMouseEventType::MouseDoubleClick;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = button;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseDragData(GUIElement* mouseOverElement, const Vector2I& position, const Vector2I& dragAmount)
+	void GUIMouseEvent::setMouseDragData(const Vector2I& position, const Vector2I& dragAmount)
 	{
 		mType = GUIMouseEventType::MouseDrag;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = dragAmount;
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseDragStartData(GUIElement* mouseOverElement, const Vector2I& position)
+	void GUIMouseEvent::setMouseDragStartData(const Vector2I& position)
 	{
 		mType = GUIMouseEventType::MouseDragStart;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setMouseDragEndData(GUIElement* mouseOverElement, const Vector2I& position)
+	void GUIMouseEvent::setMouseDragEndData(const Vector2I& position)
 	{
 		mType = GUIMouseEventType::MouseDragEnd;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
 	}
 
-	void GUIMouseEvent::setDragAndDropDroppedData(GUIElement* mouseOverElement, const Vector2I& position, CM::UINT32 dragTypeId, void* dragData)
+	void GUIMouseEvent::setDragAndDropDroppedData(const Vector2I& position, CM::UINT32 dragTypeId, void* dragData)
 	{
 		mType = GUIMouseEventType::MouseDragAndDropDropped;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;
@@ -130,11 +119,10 @@ namespace BansheeEngine
 		mDragData = dragData;
 	}
 
-	void GUIMouseEvent::setDragAndDropDraggedData(GUIElement* mouseOverElement, const Vector2I& position, CM::UINT32 dragTypeId, void* dragData)
+	void GUIMouseEvent::setDragAndDropDraggedData(const Vector2I& position, CM::UINT32 dragTypeId, void* dragData)
 	{
 		mType = GUIMouseEventType::MouseDragAndDropDragged;
 		mPosition = position;
-		mMouseOverElement = mouseOverElement;
 		mButton = GUIMouseButton::Left;
 		mDragAmount = Vector2I();
 		mWheelScrollAmount = 0.0f;

+ 1 - 2
EditorWindowDock.txt

@@ -1,6 +1,5 @@
 TODO:
- - Add GUIElementContainer, a class that does no rendering but contains other GUIElements. Use it for GUIScrolArea, GUITabbedTitleBar and GUIDockManager
- - Change DockManager into a GUIElement
+ - Dock manager currently eats all mouse input. Modify GUIManager so it will recursively try to send input to all elements under the cursor until one processes it
 
 Resize sliders
  - Add a button between docked windows