[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36366] trunk/blender/source/blender/ editors: fix [#27193] view/camera/set active object as camera sometimes " disabled" in gui (grayed out)

Campbell Barton ideasman42 at gmail.com
Thu Apr 28 10:26:49 CEST 2011


Revision: 36366
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36366
Author:   campbellbarton
Date:     2011-04-28 08:26:49 +0000 (Thu, 28 Apr 2011)
Log Message:
-----------
fix [#27193] view/camera/set active object as camera sometimes "disabled" in gui (grayed out)
When in quad split view, operators that only apply to the unlocked region can now be accessed from menus and when the mouse is over a locked view.

Applied to:
- VIEW3D_OT_object_as_camera
- VIEW3D_OT_view_persportho
- VIEW3D_OT_view_orbit
- VIEW3D_OT_viewnumpad

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2011-04-28 07:55:29 UTC (rev 36365)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2011-04-28 08:26:49 UTC (rev 36366)
@@ -163,6 +163,8 @@
 
 /* get 3d region from context, also if mouse is in header or toolbar */
 struct RegionView3D *ED_view3d_context_rv3d(struct bContext *C);
+struct ARegion *ED_view3d_context_region_unlock(struct bContext *C);
+int ED_operator_rv3d_unlock_poll(struct bContext *C);
 
 void ED_view3d_init_mats_rv3d(struct Object *ob, struct RegionView3D *rv3d);
 

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2011-04-28 07:55:29 UTC (rev 36365)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c	2011-04-28 08:26:49 UTC (rev 36366)
@@ -156,6 +156,44 @@
 	return rv3d;
 }
 
+/* ideally would return an rv3d but in some cases the region is needed too
+ * so return that, the caller can then access the ar->regiondata */
+ARegion *ED_view3d_context_region_unlock(bContext *C)
+{
+	ScrArea *sa= CTX_wm_area(C);
+	if(sa && sa->spacetype==SPACE_VIEW3D) {
+		ARegion *ar= CTX_wm_region(C);
+		if(ar) {
+			RegionView3D *rv3d= ar->regiondata;
+			if(rv3d && rv3d->viewlock == 0) {
+				return ar;
+			}
+			else {
+				ARegion *ar_unlock_user= NULL;
+				ARegion *ar_unlock= NULL;
+				for(ar= sa->regionbase.first; ar; ar= ar->next) {
+					/* find the first unlocked rv3d */
+					if(ar->regiondata && ar->regiontype == RGN_TYPE_WINDOW) {
+						rv3d= ar->regiondata;
+						if(rv3d->viewlock == 0) {
+							ar_unlock= ar;
+							if(rv3d->persp==RV3D_PERSP || rv3d->persp==RV3D_CAMOB) {
+								ar_unlock_user= ar;
+								break;
+							}
+						} 
+					}
+				}
+
+				/* camera/perspective view get priority when the active region is locked */
+				if(ar_unlock_user) return ar_unlock_user;
+				if(ar_unlock) return ar_unlock;
+			}
+		}
+	}
+	return NULL;
+}
+
 /* Most of the time this isn't needed since you could assume the view matrix was
  * set while drawing, however when functions like mesh_foreachScreenVert are
  * called by selection tools, we can't be sure this object was the last.

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2011-04-28 07:55:29 UTC (rev 36365)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_edit.c	2011-04-28 08:26:49 UTC (rev 36366)
@@ -2151,8 +2151,8 @@
 static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, short view, int perspo, int align_active)
 {
 	View3D *v3d = CTX_wm_view3d(C);
-	ARegion *ar= CTX_wm_region(C);
-	RegionView3D *rv3d= CTX_wm_region_view3d(C);
+	ARegion *ar= ED_view3d_context_region_unlock(C);
+	RegionView3D *rv3d= ar->regiondata; /* no NULL check is needed, poll checks */
 	float new_quat[4];
 
 	new_quat[0]= q1; new_quat[1]= q2;
@@ -2221,8 +2221,8 @@
 static int viewnumpad_exec(bContext *C, wmOperator *op)
 {
 	View3D *v3d = CTX_wm_view3d(C);
-	ARegion *ar= CTX_wm_region(C);
-	RegionView3D *rv3d= CTX_wm_region_view3d(C);
+	ARegion *ar= ED_view3d_context_region_unlock(C);
+	RegionView3D *rv3d= ar->regiondata; /* no NULL check is needed, poll checks */
 	Scene *scene= CTX_data_scene(C);
 	static int perspo=RV3D_PERSP;
 	int viewnum, align_active, nextperspo;
@@ -2350,7 +2350,7 @@
 
 	/* api callbacks */
 	ot->exec= viewnumpad_exec;
-	ot->poll= ED_operator_region_view3d_active;
+	ot->poll= ED_operator_rv3d_unlock_poll;
 
 	/* flags */
 	ot->flag= 0;
@@ -2368,7 +2368,8 @@
 
 static int vieworbit_exec(bContext *C, wmOperator *op)
 {
-	RegionView3D *rv3d= CTX_wm_region_view3d(C);
+	ARegion *ar= ED_view3d_context_region_unlock(C);
+	RegionView3D *rv3d= ar->regiondata; /* no NULL check is needed, poll checks */
 	float phi, q1[4], new_quat[4];
 	int orbitdir;
 
@@ -2402,7 +2403,7 @@
 				rv3d->view= 0;
 			}
 
-			smooth_view(C, CTX_wm_view3d(C), CTX_wm_region(C), NULL, NULL, NULL, new_quat, NULL, NULL);
+			smooth_view(C, CTX_wm_view3d(C), ar, NULL, NULL, NULL, new_quat, NULL, NULL);
 		}
 	}
 
@@ -2418,7 +2419,7 @@
 
 	/* api callbacks */
 	ot->exec= vieworbit_exec;
-	ot->poll= ED_operator_region_view3d_active;
+	ot->poll= ED_operator_rv3d_unlock_poll;
 
 	/* flags */
 	ot->flag= 0;
@@ -2474,8 +2475,8 @@
 
 static int viewpersportho_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	ARegion *ar= CTX_wm_region(C);
-	RegionView3D *rv3d= CTX_wm_region_view3d(C);
+	ARegion *ar= ED_view3d_context_region_unlock(C);
+	RegionView3D *rv3d= ar->regiondata; /* no NULL check is needed, poll checks */
 
 	if(rv3d->viewlock==0) {
 		if(rv3d->persp!=RV3D_ORTHO)
@@ -2497,12 +2498,13 @@
 
 	/* api callbacks */
 	ot->exec= viewpersportho_exec;
-	ot->poll= ED_operator_region_view3d_active;
+	ot->poll= ED_operator_rv3d_unlock_poll;
 
 	/* flags */
 	ot->flag= 0;
 }
 
+
 /* ******************** add background image operator **************** */
 
 static BGpic *background_image_add(bContext *C)

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2011-04-28 07:55:29 UTC (rev 36365)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c	2011-04-28 08:26:49 UTC (rev 36366)
@@ -466,8 +466,8 @@
 static int view3d_setobjectascamera_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	View3D *v3d = CTX_wm_view3d(C);
-	ARegion *ar= CTX_wm_region(C);
-	RegionView3D *rv3d= ar->regiondata;
+	ARegion *ar= ED_view3d_context_region_unlock(C);
+	RegionView3D *rv3d= ar->regiondata; /* no NULL check is needed, poll checks */
 	Scene *scene= CTX_data_scene(C);
 	Object *ob = CTX_data_active_object(C);
 
@@ -487,13 +487,11 @@
 	return OPERATOR_FINISHED;
 }
 
-static int region3d_unlocked_poll(bContext *C)
+int ED_operator_rv3d_unlock_poll(bContext *C)
 {
-	RegionView3D *rv3d= CTX_wm_region_view3d(C);
-	return (rv3d && rv3d->viewlock==0);
+	return ED_view3d_context_region_unlock(C) != NULL;
 }
 
-
 void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
 {
 	
@@ -504,7 +502,7 @@
 	
 	/* api callbacks */
 	ot->exec= view3d_setobjectascamera_exec;	
-	ot->poll= region3d_unlocked_poll;
+	ot->poll= ED_operator_rv3d_unlock_poll;
 	
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;




More information about the Bf-blender-cvs mailing list