[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52963] trunk/blender/source/blender/ editors/interface/interface_panel.c: Bug fix:

Ton Roosendaal ton at blender.org
Thu Dec 13 11:24:48 CET 2012


Revision: 52963
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52963
Author:   ton
Date:     2012-12-13 10:24:46 +0000 (Thu, 13 Dec 2012)
Log Message:
-----------
Bug fix:

- Code for detecting "click inside button panel" was convoluted and detected wrong
  panels even when they were closed.
- Any click inside panels now return "Event Handled", that will prevent events
  being passed on in case of overlapping or transparent button panels.

This is ancient code, will be in on my attention list for further cleaning.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface_panel.c

Modified: trunk/blender/source/blender/editors/interface/interface_panel.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_panel.c	2012-12-13 09:46:24 UTC (rev 52962)
+++ trunk/blender/source/blender/editors/interface/interface_panel.c	2012-12-13 10:24:46 UTC (rev 52963)
@@ -1096,27 +1096,45 @@
 	ARegion *ar = CTX_wm_region(C);
 	uiBlock *block;
 	Panel *pa;
-	int retval, mx, my, inside_header = 0, inside_scale = 0, inside;
+	int retval, mx, my;
 
 	retval = WM_UI_HANDLER_CONTINUE;
 	for (block = ar->uiblocks.last; block; block = block->prev) {
+		int inside = 0, inside_header = 0, inside_scale = 0;
+		
 		mx = event->x;
 		my = event->y;
 		ui_window_to_block(ar, block, &mx, &my);
 
-		/* check if inside boundbox */
-		inside = 0;
+		/* checks for mouse position inside */
 		pa = block->panel;
 
 		if (!pa || pa->paneltab != NULL)
 			continue;
 		if (pa->type && pa->type->flag & PNL_NO_HEADER)  /* XXX - accessed freed panels when scripts reload, need to fix. */
 			continue;
-
-		if (block->rect.xmin <= mx && block->rect.xmax >= mx)
-			if (block->rect.ymin <= my && block->rect.ymax + PNL_HEADER >= my)
-				inside = 1;
 		
+		/* clicked at panel header? */
+		if (pa->flag & PNL_CLOSEDX) {
+			if (block->rect.xmin <= mx && block->rect.xmin + PNL_HEADER >= mx)
+				inside_header = 1;
+		}
+		else if ((block->rect.ymax <= my) && (block->rect.ymax + PNL_HEADER >= my)) {
+			inside_header = 1;
+		}
+		else if (!(pa->flag & PNL_CLOSEDY)) {
+			/* open panel */
+			if (pa->control & UI_PNL_SCALE) {
+				if (block->rect.xmax - PNL_HEADER <= mx)
+					if (block->rect.ymin + PNL_HEADER >= my)
+						inside_scale = 1;
+			}
+			if (block->rect.xmin <= mx && block->rect.xmax >= mx)
+				if (block->rect.ymin <= my && block->rect.ymax + PNL_HEADER >= my)
+					inside = 1;
+		}
+		
+		/* XXX hardcoded key warning */
 		if (inside && event->val == KM_PRESS) {
 			if (event->type == AKEY && !ELEM4(KM_MOD_FIRST, event->ctrl, event->oskey, event->shift, event->alt)) {
 				
@@ -1135,22 +1153,13 @@
 		if (ui_button_is_active(ar))
 			continue;
 		
-		if (inside) {
-			/* clicked at panel header? */
-			if (pa->flag & PNL_CLOSEDX) {
-				if (block->rect.xmin <= mx && block->rect.xmin + PNL_HEADER >= mx)
-					inside_header = 1;
-			}
-			else if ((block->rect.ymax <= my) && (block->rect.ymax + PNL_HEADER >= my)) {
-				inside_header = 1;
-			}
-			else if (pa->control & UI_PNL_SCALE) {
-				if (block->rect.xmax - PNL_HEADER <= mx)
-					if (block->rect.ymin + PNL_HEADER >= my)
-						inside_scale = 1;
-			}
+		if (inside || inside_header) {
 
 			if (event->val == KM_PRESS) {
+				
+				/* all inside clicks should return in break - overlapping/float panels */
+				retval = WM_UI_HANDLER_BREAK;
+
 				/* open close on header */
 				if (ELEM(event->type, RETKEY, PADENTER)) {
 					if (inside_header) {




More information about the Bf-blender-cvs mailing list