Przeglądaj źródła

Fixed mousewheel events

Ivan Safrin 12 lat temu
rodzic
commit
0822881875

+ 60 - 0
Core/Contents/Source/PolyEntity.cpp

@@ -1036,10 +1036,70 @@ MouseEventResult Entity::onMouseMove(const Ray &ray, int timestamp) {
 
 MouseEventResult Entity::onMouseWheelUp(const Ray &ray, int timestamp) {
 	MouseEventResult ret;
+	ret.hit = false;
+	ret.blocked = false;
+	
+	if(processInputEvents && enabled) {
+		if(ray.boxIntersect(bBox, getAnchorAdjustedMatrix())) {
+			ret.hit = true;	
+			
+			Vector3 localCoordinate = Vector3(ray.origin.x,ray.origin.y,0);
+			Matrix4 inverse = getConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;			
+			
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp);
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_UP);
+												
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
+		}
+		
+		for(int i=children.size()-1; i>=0; i--) {
+			MouseEventResult childRes = children[i]->onMouseWheelUp(ray, timestamp);
+				if(childRes.hit)
+					ret.hit = true;
+				
+				if(childRes.blocked) {
+					ret.blocked = true;
+					break;
+				}			
+		}
+	}
 	return ret;
 }
 
 MouseEventResult Entity::onMouseWheelDown(const Ray &ray, int timestamp) {
 	MouseEventResult ret;
+	ret.hit = false;
+	ret.blocked = false;
+	
+	if(processInputEvents && enabled) {
+		if(ray.boxIntersect(bBox, getAnchorAdjustedMatrix())) {
+			ret.hit = true;	
+			
+			Vector3 localCoordinate = Vector3(ray.origin.x,ray.origin.y,0);
+			Matrix4 inverse = getConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;			
+			
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x, localCoordinate.y*yAdjust), timestamp);
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_DOWN);
+												
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
+		}
+		
+		for(int i=children.size()-1; i>=0; i--) {
+			MouseEventResult childRes = children[i]->onMouseWheelDown(ray, timestamp);
+				if(childRes.hit)
+					ret.hit = true;
+				
+				if(childRes.blocked) {
+					ret.blocked = true;
+					break;
+				}			
+		}
+	}
 	return ret;
 }

+ 2 - 2
Modules/Contents/UI/Include/PolyUIScrollContainer.h

@@ -94,8 +94,8 @@ namespace Polycode {
         */
 		Vector2 getContentSize();
 
-		void onMouseWheelDown(Number x, Number y);
-		void onMouseWheelUp(Number x, Number y);
+		void _onMouseWheelDown();
+		void _onMouseWheelUp();
 
 		void handleEvent(Event *event);
 

+ 14 - 2
Modules/Contents/UI/Source/PolyUIScrollContainer.cpp

@@ -73,6 +73,9 @@ UIScrollContainer::UIScrollContainer(Entity *scrolledEntity, bool hScroll, bool
 	Resize(width, height);	
 	
 	processInputEvents = true;
+	
+	addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_DOWN);
+	addEventListener(this, InputEvent::EVENT_MOUSEWHEEL_UP);	
 }
 
 void UIScrollContainer::Resize(Number width, Number height) {
@@ -88,12 +91,12 @@ void UIScrollContainer::Resize(Number width, Number height) {
 	
 }
 
-void UIScrollContainer::onMouseWheelUp(Number x, Number y) {
+void UIScrollContainer::_onMouseWheelUp() {
 	if(vScrollBar->enabled)
 		vScrollBar->scrollUpOneTick();
 }
 
-void UIScrollContainer::onMouseWheelDown(Number x, Number y) {
+void UIScrollContainer::_onMouseWheelDown() {
 	if(vScrollBar->enabled)
 		vScrollBar->scrollDownOneTick();
 }
@@ -168,6 +171,15 @@ void UIScrollContainer::Update() {
 }
 
 void UIScrollContainer::handleEvent(Event *event) {
+
+	if(event->getDispatcher() == this) {
+		if(event->getEventCode() == InputEvent::EVENT_MOUSEWHEEL_UP) {
+			_onMouseWheelUp();
+		} else if(event->getEventCode() == InputEvent::EVENT_MOUSEWHEEL_DOWN) {
+			_onMouseWheelDown();		
+		}
+	}
+	
 	if(event->getDispatcher() == vScrollBar) {
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
 			scrollChild->setPositionY(floor(((-contentHeight+getHeight()) )*vScrollBar->getScrollValue()));

+ 2 - 2
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -2535,12 +2535,12 @@ void UITextInput::handleEvent(Event *event) {
 			break;
 			case InputEvent::EVENT_MOUSEWHEEL_UP:
 				if(scrollContainer) {
-					scrollContainer->onMouseWheelUp(0, 0);
+					scrollContainer->_onMouseWheelUp();
 				}
 			break;
 			case InputEvent::EVENT_MOUSEWHEEL_DOWN:
 				if(scrollContainer) {
-					scrollContainer->onMouseWheelDown(0, 0);
+					scrollContainer->_onMouseWheelDown();
 				}
 			break;
 			case InputEvent::EVENT_DOUBLECLICK: