[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54204] trunk/blender/source/blender: Add active region for operator execution.

Campbell Barton ideasman42 at gmail.com
Wed Jan 30 13:22:06 CET 2013


Revision: 54204
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54204
Author:   campbellbarton
Date:     2013-01-30 12:22:02 +0000 (Wed, 30 Jan 2013)
Log Message:
-----------
Add active region for operator execution.

This means you can for example, uv unwrap in quad-view and change settings in the toolbar without defaulting back to the first quad-view region available. 

This may be displayed to the user later, for now this is set on executing registrable operators.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_screen.h
    trunk/blender/source/blender/blenkernel/intern/screen.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
    trunk/blender/source/blender/editors/util/undo.c
    trunk/blender/source/blender/makesdna/DNA_screen_types.h
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_screen.h	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/blenkernel/BKE_screen.h	2013-01-30 12:22:02 UTC (rev 54204)
@@ -261,6 +261,7 @@
 void            BKE_screen_area_free(struct ScrArea *sa);
 
 struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
+struct ARegion *BKE_area_find_region_active_win(struct ScrArea *sa);
 struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min);
 
 void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);

Modified: trunk/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/screen.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/blenkernel/intern/screen.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -355,6 +355,20 @@
 	return NULL;
 }
 
+ARegion *BKE_area_find_region_active_win(ScrArea *sa)
+{
+	if (sa) {
+		ARegion *ar = BLI_findlink(&sa->regionbase, sa->region_active_win);
+		if (ar && (ar->regiontype == RGN_TYPE_WINDOW)) {
+			return ar;
+		}
+
+		/* fallback to any */
+		return BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+	}
+	return NULL;
+}
+
 /* note, using this function is generally a last resort, you really want to be
  * using the context when you can - campbell
  * -1 for any type */

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -6005,6 +6005,7 @@
 		
 		sa->handlers.first = sa->handlers.last = NULL;
 		sa->type = NULL;	/* spacetype callbacks */
+		sa->region_active_win = -1;
 		
 		for (ar = sa->regionbase.first; ar; ar = ar->next)
 			direct_link_region(fd, ar, sa->spacetype);

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -146,7 +146,7 @@
 	if (rv3d == NULL) {
 		ScrArea *sa = CTX_wm_area(C);
 		if (sa && sa->spacetype == SPACE_VIEW3D) {
-			ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+			ARegion *ar = BKE_area_find_region_active_win(sa);
 			if (ar) {
 				rv3d = ar->regiondata;
 			}

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -110,7 +110,7 @@
 
 	/* keep in sync with logic in ED_undo_operator_repeat() */
 	ar = CTX_wm_region(C);
-	ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
+	ar1 = BKE_area_find_region_active_win(CTX_wm_area(C));
 	if (ar1)
 		CTX_wm_region_set((bContext *)C, ar1);
 

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/editors/util/undo.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -341,7 +341,7 @@
 
 		/* keep in sync with logic in view3d_panel_operator_redo() */
 		ARegion *ar = CTX_wm_region(C);
-		ARegion *ar1 = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
+		ARegion *ar1 = BKE_area_find_region_active_win(CTX_wm_area(C));
 
 		if (ar1)
 			CTX_wm_region_set(C, ar1);

Modified: trunk/blender/source/blender/makesdna/DNA_screen_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_screen_types.h	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/makesdna/DNA_screen_types.h	2013-01-30 12:22:02 UTC (rev 54204)
@@ -142,9 +142,10 @@
 	short winx, winy;				/* size */
 	
 	short headertype;				/* OLD! 0=no header, 1= down, 2= up */
-	short pad;
 	short do_refresh;				/* private, for spacetype refresh callback */
 	short cursor, flag;
+	short region_active_win;		/* index of last used region of 'RGN_TYPE_WINDOW'
+									 * runtuime variable, updated by executing operators */
 	
 	struct SpaceType *type;		/* callbacks for this space type */
 	

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2013-01-30 12:22:02 UTC (rev 54204)
@@ -311,6 +311,8 @@
 void		WM_event_print(struct wmEvent *event);
 #endif
 
+void		WM_operator_region_active_win_set(struct bContext *C);
+
 			/* drag and drop */
 struct wmDrag		*WM_event_start_drag(struct bContext *C, int icon, int type, void *poin, double value);
 void				WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx, int sy);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2013-01-30 11:06:02 UTC (rev 54203)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2013-01-30 12:22:02 UTC (rev 54204)
@@ -453,6 +453,22 @@
 	MEM_freeN(buf);
 }
 
+/**
+ * Sets the active region for this space from the context.
+ *
+ * \see #BKE_area_find_region_active_win
+ */
+void WM_operator_region_active_win_set(bContext *C)
+{
+	ScrArea *sa = CTX_wm_area(C);
+	if (sa) {
+		ARegion *ar = CTX_wm_region(C);
+		if (ar && ar->regiontype == RGN_TYPE_WINDOW) {
+			sa->region_active_win = BLI_findindex(&sa->regionbase, ar);
+		}
+	}
+}
+
 /* for debugging only, getting inspecting events manually is tedious */
 #ifndef NDEBUG
 
@@ -573,10 +589,13 @@
 			MEM_freeN(buf);
 		}
 
-		if (wm_operator_register_check(wm, op->type))
+		if (wm_operator_register_check(wm, op->type)) {
 			wm_operator_register(C, op);
-		else
+			WM_operator_region_active_win_set(C);
+		}
+		else {
 			WM_operator_free(op);
+		}
 	}
 }
 
@@ -1045,7 +1064,14 @@
 				}
 				
 				if (!(ar && ar->regiontype == type) && area) {
-					ARegion *ar1 = BKE_area_find_region_type(area, type);
+					ARegion *ar1;
+					if (type == RGN_TYPE_WINDOW) {
+						ar1 = BKE_area_find_region_active_win(area);
+					}
+					else {
+						ar1 = BKE_area_find_region_type(area, type);
+					}
+
 					if (ar1)
 						CTX_wm_region_set(C, ar1);
 				}
@@ -1417,20 +1443,10 @@
 				if (ot->flag & OPTYPE_UNDO)
 					wm->op_undo_depth--;
 
-				/* putting back screen context, reval can pass trough after modal failures! */
-				if ((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) {
-					CTX_wm_area_set(C, area);
-					CTX_wm_region_set(C, region);
-				}
-				else {
-					/* this special cases is for areas and regions that get removed */
-					CTX_wm_area_set(C, NULL);
-					CTX_wm_region_set(C, NULL);
-				}
-
 				if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED))
 					wm_operator_reports(C, op, retval, FALSE);
 
+				/* important to run 'wm_operator_finished' before NULLing the context members */
 				if (retval & OPERATOR_FINISHED) {
 					wm_operator_finished(C, op, 0);
 					handler->op = NULL;
@@ -1440,6 +1456,17 @@
 					handler->op = NULL;
 				}
 
+				/* putting back screen context, reval can pass trough after modal failures! */
+				if ((retval & OPERATOR_PASS_THROUGH) || wm_event_always_pass(event)) {
+					CTX_wm_area_set(C, area);
+					CTX_wm_region_set(C, region);
+				}
+				else {
+					/* this special cases is for areas and regions that get removed */
+					CTX_wm_area_set(C, NULL);
+					CTX_wm_region_set(C, NULL);
+				}
+
 				/* remove modal handler, operator itself should have been canceled and freed */
 				if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) {
 					WM_cursor_grab_disable(CTX_wm_window(C), NULL);




More information about the Bf-blender-cvs mailing list