[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42075] trunk/blender/source/blender/ editors: Fix for long-standing TODO item: Clicking on overlapping nodes would activate buttons below.

Lukas Toenne lukas.toenne at googlemail.com
Tue Nov 22 18:49:06 CET 2011


Revision: 42075
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42075
Author:   lukastoenne
Date:     2011-11-22 17:49:06 +0000 (Tue, 22 Nov 2011)
Log Message:
-----------
Fix for long-standing TODO item: Clicking on overlapping nodes would activate buttons below.

This patch adds a new CLIP_EVENTS flag for uiBlock, which will prevent the ui_but_find_mouse_over search function from looking into "lower" uiBlocks (i.e. those further back in the list). The order of block creation for nodes has also been updated to use the z-ordering (just the nodetree->nodes list).

In order for this to work, the bounding box values of the uiBlocks have to be set explicitely to fit the node size, those are usually either zero or calculated from the internal buttons.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_node/node_draw.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2011-11-22 17:43:32 UTC (rev 42074)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2011-11-22 17:49:06 UTC (rev 42075)
@@ -115,6 +115,7 @@
 #define UI_BLOCK_OUT_1			1024
 #define UI_BLOCK_NO_FLIP		2048
 #define UI_BLOCK_POPUP_MEMORY	4096
+#define UI_BLOCK_CLIP_EVENTS	8192	/* stop handling mouse events */
 
 /* uiPopupBlockHandle->menuretval */
 #define UI_RETURN_CANCEL	1       /* cancel all menus cascading */
@@ -364,6 +365,7 @@
 void uiPopupBoundsBlock(uiBlock *block, int addval, int mx, int my);
 void uiMenuPopupBoundsBlock(uiBlock *block, int addvall, int mx, int my);
 void uiCenteredBoundsBlock(uiBlock *block, int addval);
+void uiExplicitBoundsBlock(uiBlock *block, int minx, int miny, int maxx, int maxy);
 
 int		uiBlocksGetYMin		(struct ListBase *lb);
 

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-11-22 17:43:32 UTC (rev 42074)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-11-22 17:49:06 UTC (rev 42075)
@@ -434,6 +434,15 @@
 	block->dobounds= UI_BLOCK_BOUNDS_POPUP_CENTER;
 }
 
+void uiExplicitBoundsBlock(uiBlock *block, int minx, int miny, int maxx, int maxy)
+{
+	block->minx = minx;
+	block->miny = miny;
+	block->maxx = maxx;
+	block->maxy = maxy;
+	block->dobounds = 0;
+}
+
 /* ************** LINK LINE DRAWING  ************* */
 
 /* link line drawing is not part of buttons or theme.. so we stick with it here */

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-22 17:43:32 UTC (rev 42074)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-11-22 17:49:06 UTC (rev 42075)
@@ -5063,6 +5063,14 @@
 			if(ui_but_contains_pt(but, mx, my))
 				butover= but;
 		}
+
+		/* CLIP_EVENTS prevents the event from reaching other blocks */
+		if (block->flag & UI_BLOCK_CLIP_EVENTS) {
+			/* check if mouse is inside block */
+			if(block->minx <= mx && block->maxx >= mx &&
+			   block->miny <= my && block->maxy >= my)
+				break;
+		}
 	}
 
 	return butover;

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2011-11-22 17:43:32 UTC (rev 42074)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2011-11-22 17:49:06 UTC (rev 42075)
@@ -471,6 +471,7 @@
 		float locx, locy;
 		rctf *rect= &gnode->totr;
 		float node_group_frame= U.dpi*NODE_GROUP_FRAME/72;
+		float group_header= 26*U.dpi/72;
 		int counter;
 		int dy;
 		
@@ -594,6 +595,15 @@
 				gsock = gsock->next;
 			}
 		}
+		
+		/* Set the block bounds to clip mouse events from underlying nodes.
+		 * Add margin for header and input/output columns.
+		 */
+		uiExplicitBoundsBlock(gnode->block,
+							  rect->xmin - node_group_frame,
+							  rect->ymin,
+							  rect->xmax + node_group_frame,
+							  rect->ymax + group_header);
 	}
 }
 

Modified: trunk/blender/source/blender/editors/space_node/node_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/node_draw.c	2011-11-22 17:43:32 UTC (rev 42074)
+++ trunk/blender/source/blender/editors/space_node/node_draw.c	2011-11-22 17:49:06 UTC (rev 42075)
@@ -197,29 +197,17 @@
 	bNode *node;
 	char str[32];
 	
-	/* add node uiBlocks in reverse order - prevents events going to overlapping nodes */
+	/* add node uiBlocks in drawing order - prevents events going to overlapping nodes */
 	
-	/* process selected nodes first so they're at the start of the uiblocks list */
-	for(node= ntree->nodes.last; node; node= node->prev) {
-		
-		if (node->flag & NODE_SELECT) {
+	for(node= ntree->nodes.first; node; node=node->next) {
 			/* ui block */
 			sprintf(str, "node buttons %p", (void *)node);
 			node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
 			uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
-		}
+			
+			/* this cancels events for background nodes */
+			uiBlockSetFlag(node->block, UI_BLOCK_CLIP_EVENTS);
 	}
-	
-	/* then the rest */
-	for(node= ntree->nodes.last; node; node= node->prev) {
-		
-		if (!(node->flag & (NODE_GROUP_EDIT|NODE_SELECT))) {
-			/* ui block */
-			sprintf(str, "node buttons %p", (void *)node);
-			node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
-			uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
-		}
-	}
 }
 
 /* based on settings in node, sets drawing rect info. each redraw! */
@@ -339,6 +327,15 @@
 	node->totr.xmax= locx + node->width;
 	node->totr.ymax= locy;
 	node->totr.ymin= MIN2(dy, locy-2*NODE_DY);
+	
+	/* Set the block bounds to clip mouse events from underlying nodes.
+	 * Add a margin for sockets on each side.
+	 */
+	uiExplicitBoundsBlock(node->block,
+						  node->totr.xmin - NODE_SOCKSIZE,
+						  node->totr.ymin,
+						  node->totr.xmax + NODE_SOCKSIZE,
+						  node->totr.ymax);
 }
 
 /* based on settings in node, sets drawing rect info. each redraw! */
@@ -391,6 +388,15 @@
 			rad+= drad;
 		}
 	}
+
+	/* Set the block bounds to clip mouse events from underlying nodes.
+	 * Add a margin for sockets on each side.
+	 */
+	uiExplicitBoundsBlock(node->block,
+						  node->totr.xmin - NODE_SOCKSIZE,
+						  node->totr.ymin,
+						  node->totr.xmax + NODE_SOCKSIZE,
+						  node->totr.ymax);
 }
 
 void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node)




More information about the Bf-blender-cvs mailing list