Browse Source

fix EOut with masked interactive

ncannasse 9 years ago
parent
commit
c823a44b7f
5 changed files with 18 additions and 11 deletions
  1. 14 6
      h2d/Interactive.hx
  2. 0 1
      h2d/Scene.hx
  3. 2 2
      h3d/scene/Interactive.hx
  4. 1 1
      hxd/Event.hx
  5. 1 1
      hxd/SceneEvents.hx

+ 14 - 6
h2d/Interactive.hx

@@ -74,7 +74,7 @@ class Interactive extends Drawable implements hxd.SceneEvents.Interactive {
 
 	function checkBounds( e : hxd.Event ) {
 		return switch( e.kind ) {
-		case EOut, ERelease, EFocus, EFocusLost: false;
+		case EOut, EFocus, EFocusLost: false;
 		default: true;
 		}
 	}
@@ -84,7 +84,7 @@ class Interactive extends Drawable implements hxd.SceneEvents.Interactive {
 	}
 
 	@:noCompletion public function handleEvent( e : hxd.Event ) {
-		if( parentMask != null ) {
+		if( parentMask != null && checkBounds(e) ) {
 			var p = parentMask;
 			var pt = new h2d.col.Point(e.relX, e.relY);
 			localToGlobal(pt);
@@ -94,6 +94,10 @@ class Interactive extends Drawable implements hxd.SceneEvents.Interactive {
 				pt.y = saveY;
 				var pt = p.globalToLocal(pt);
 				if( pt.x < 0 || pt.y < 0 || pt.x > p.width || pt.y > p.height ) {
+					if( e.kind == ERelease ) {
+						mouseDownButton = -1;
+						break;
+					}
 					e.cancel = true;
 					return;
 				}
@@ -105,8 +109,12 @@ class Interactive extends Drawable implements hxd.SceneEvents.Interactive {
 			var dx = (e.relX - cx) / cx;
 			var dy = (e.relY - cy) / cy;
 			if( dx * dx + dy * dy > 1 ) {
-				e.cancel = true;
-				return;
+				if( e.kind == ERelease )
+					mouseDownButton = -1;
+				else {
+					e.cancel = true;
+					return;
+				}
 			}
 		}
 		if( propagateEvents ) e.propagate = true;
@@ -126,11 +134,11 @@ class Interactive extends Drawable implements hxd.SceneEvents.Interactive {
 					onClick(e);
 			}
 			mouseDownButton = -1;
-		case EReleaseNoClick:
+		case EReleaseOutside:
 			if( enableRightButton || e.button == 0 ) {
 				e.kind = ERelease;
 				onRelease(e);
-				e.kind = EReleaseNoClick;
+				e.kind = EReleaseOutside;
 			}
 			mouseDownButton = -1;
 		case EOver:

+ 0 - 1
h2d/Scene.hx

@@ -228,7 +228,6 @@ class Scene extends Layers implements h3d.IDrawable implements hxd.SceneEvents.I
 
 			event.relX = (kx / max) * i.width;
 			event.relY = (ky / max) * i.height;
-
 			i.handleEvent(event);
 
 			if( event.cancel ) {

+ 2 - 2
h3d/scene/Interactive.hx

@@ -61,11 +61,11 @@ class Interactive extends Object implements hxd.SceneEvents.Interactive {
 					onClick(e);
 			}
 			isMouseDown = -1;
-		case EReleaseNoClick:
+		case EReleaseOutside:
 			if( enableRightButton || e.button == 0 ) {
 				e.kind = ERelease;
 				onRelease(e);
-				e.kind = EReleaseNoClick;
+				e.kind = EReleaseOutside;
 			}
 			isMouseDown = -1;
 		case EOver:

+ 1 - 1
hxd/Event.hx

@@ -11,7 +11,7 @@ enum EventKind {
 	EFocusLost;
 	EKeyDown;
 	EKeyUp;
-	EReleaseNoClick;
+	EReleaseOutside;
 }
 
 class Event {

+ 1 - 1
hxd/SceneEvents.hx

@@ -190,7 +190,7 @@ class SceneEvents {
 				else {
 					var s = i.getInteractiveScene();
 					if( s == null ) continue;
-					event.kind = EReleaseNoClick;
+					event.kind = EReleaseOutside;
 					s.dispatchEvent(event,i);
 					event.kind = ERelease;
 					event.relX = oldX;