[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44403] trunk/blender/source/blender/ editors/space_clip/clip_ops.c: CLIP_OT_view_zoom (Ctrl-MMB) now takes into account Zoom to Mouse Position setting

Sergey Sharybin sergey.vfx at gmail.com
Fri Feb 24 14:31:21 CET 2012


Revision: 44403
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44403
Author:   nazgul
Date:     2012-02-24 13:31:18 +0000 (Fri, 24 Feb 2012)
Log Message:
-----------
CLIP_OT_view_zoom (Ctrl-MMB) now takes into account Zoom to Mouse Position setting

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_clip/clip_ops.c

Modified: trunk/blender/source/blender/editors/space_clip/clip_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/clip_ops.c	2012-02-24 12:57:05 UTC (rev 44402)
+++ trunk/blender/source/blender/editors/space_clip/clip_ops.c	2012-02-24 13:31:18 UTC (rev 44403)
@@ -68,36 +68,67 @@
 
 /******************** view navigation utilities *********************/
 
-static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom)
+static void sclip_zoom_set(SpaceClip *sc, ARegion *ar, float zoom, float mpos[2])
 {
 	float oldzoom= sc->zoom;
 	int width, height;
 
 	sc->zoom= zoom;
 
-	if (sc->zoom > 0.1f && sc->zoom < 4.0f)
-		return;
+	if (sc->zoom < 0.1f || sc->zoom > 4.0f) {
+		/* check zoom limits */
+		ED_space_clip_size(sc, &width, &height);
 
-	/* check zoom limits */
-	ED_space_clip_size(sc, &width, &height);
+		width*= sc->zoom;
+		height*= sc->zoom;
 
-	width*= sc->zoom;
-	height*= sc->zoom;
+		if((width < 4) && (height < 4))
+			sc->zoom= oldzoom;
+		else if((ar->winrct.xmax - ar->winrct.xmin) <= sc->zoom)
+			sc->zoom= oldzoom;
+		else if((ar->winrct.ymax - ar->winrct.ymin) <= sc->zoom)
+			sc->zoom= oldzoom;
+	}
 
-	if((width < 4) && (height < 4))
-		sc->zoom= oldzoom;
-	else if((ar->winrct.xmax - ar->winrct.xmin) <= sc->zoom)
-		sc->zoom= oldzoom;
-	else if((ar->winrct.ymax - ar->winrct.ymin) <= sc->zoom)
-		sc->zoom= oldzoom;
+	if((U.uiflag & USER_ZOOM_TO_MOUSEPOS) && mpos) {
+		ED_space_clip_size(sc, &width, &height);
+
+		sc->xof+= ((mpos[0]-0.5f)*width-sc->xof)*(sc->zoom-oldzoom)/sc->zoom;
+		sc->yof+= ((mpos[1]-0.5f)*height-sc->yof)*(sc->zoom-oldzoom)/sc->zoom;
+	}
 }
 
-static void sclip_zoom_set_factor(SpaceClip *sc, ARegion *ar, float zoomfac)
+static void sclip_zoom_set_factor(SpaceClip *sc, ARegion *ar, float zoomfac, float mpos[2])
 {
-	sclip_zoom_set(sc, ar, sc->zoom*zoomfac);
+	sclip_zoom_set(sc, ar, sc->zoom*zoomfac, mpos);
 }
 
+static void sclip_zoom_set_factor_exec(bContext *C, wmEvent *event, float factor)
+{
+	SpaceClip *sc= CTX_wm_space_clip(C);
+	ARegion *ar= CTX_wm_region(C);
+	float co[2], *mpos = NULL;
 
+	if (event) {
+		ED_clip_mouse_pos(C, event, co);
+		mpos = co;
+	}
+
+	sclip_zoom_set_factor(sc, ar, factor, mpos);
+
+	ED_region_tag_redraw(CTX_wm_region(C));
+}
+
+static void view_zoom_in_do_exec(bContext *C, wmEvent *event)
+{
+	sclip_zoom_set_factor_exec(C, event, 1.25f);
+}
+
+static void view_zoom_out_do_exec(bContext *C, wmEvent *event)
+{
+	sclip_zoom_set_factor_exec(C, event, 0.8f);
+}
+
 /******************** open clip operator ********************/
 
 static void clip_filesel(bContext *C, wmOperator *op, const char *path)
@@ -393,6 +424,7 @@
 	float x, y;
 	float zoom;
 	int event_type;
+	float co[2];
 } ViewZoomData;
 
 static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event)
@@ -408,6 +440,8 @@
 	vpd->zoom= sc->zoom;
 	vpd->event_type= event->type;
 
+	ED_clip_mouse_pos(C, event, vpd->co);
+
 	WM_event_add_modal_handler(C, op);
 }
 
@@ -430,7 +464,7 @@
 	SpaceClip *sc= CTX_wm_space_clip(C);
 	ARegion *ar= CTX_wm_region(C);
 
-	sclip_zoom_set_factor(sc, ar, RNA_float_get(op->ptr, "factor"));
+	sclip_zoom_set_factor(sc, ar, RNA_float_get(op->ptr, "factor"), NULL);
 
 	ED_region_tag_redraw(CTX_wm_region(C));
 
@@ -440,19 +474,18 @@
 static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	if (event->type==MOUSEZOOM) {
-		SpaceClip *sc= CTX_wm_space_clip(C);
-		ARegion *ar= CTX_wm_region(C);
 		float factor;
 
 		factor= 1.0f + (event->x-event->prevx+event->y-event->prevy)/300.0f;
 		RNA_float_set(op->ptr, "factor", factor);
-		sclip_zoom_set(sc, ar, sc->zoom*factor);
-		ED_region_tag_redraw(CTX_wm_region(C));
 
+		sclip_zoom_set_factor_exec(C, event, factor);
+
 		return OPERATOR_FINISHED;
 	}
 	else {
 		view_zoom_init(C, op, event);
+
 		return OPERATOR_RUNNING_MODAL;
 	}
 }
@@ -468,7 +501,7 @@
 		case MOUSEMOVE:
 			factor= 1.0f + (vpd->x-event->x+vpd->y-event->y)/300.0f;
 			RNA_float_set(op->ptr, "factor", factor);
-			sclip_zoom_set(sc, ar, vpd->zoom*factor);
+			sclip_zoom_set(sc, ar, vpd->zoom*factor, vpd->co);
 			ED_region_tag_redraw(CTX_wm_region(C));
 			break;
 		default:
@@ -513,57 +546,18 @@
 
 static int view_zoom_in_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	SpaceClip *sc= CTX_wm_space_clip(C);
-	ARegion *ar= CTX_wm_region(C);
+	view_zoom_in_do_exec(C, NULL);
 
-	sclip_zoom_set_factor(sc, ar, 1.25f);
-
-	ED_region_tag_redraw(CTX_wm_region(C));
-
 	return OPERATOR_FINISHED;
 }
 
-static int view_zoom_out_exec(bContext *C, wmOperator *UNUSED(op))
+static int view_zoom_in_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
 {
-	SpaceClip *sc= CTX_wm_space_clip(C);
-	ARegion *ar= CTX_wm_region(C);
+	view_zoom_in_do_exec(C, event);
 
-	sclip_zoom_set_factor(sc, ar, 0.8f);
-
-	ED_region_tag_redraw(CTX_wm_region(C));
-
 	return OPERATOR_FINISHED;
 }
 
-static int view_zoom_inout_invoke(bContext *C, wmOperator *op, wmEvent *event, int out)
-{
-	SpaceClip *sc= CTX_wm_space_clip(C);
-	float co[2], oldzoom= sc->zoom;
-
-	ED_clip_mouse_pos(C, event, co);
-
-	if(out)
-		view_zoom_out_exec(C, op);
-	else
-		view_zoom_in_exec(C, op);
-
-	if(U.uiflag&USER_ZOOM_TO_MOUSEPOS) {
-		int width, height;
-
-		ED_space_clip_size(sc, &width, &height);
-
-		sc->xof+= ((co[0]-0.5f)*width-sc->xof)*(sc->zoom-oldzoom)/sc->zoom;
-		sc->yof+= ((co[1]-0.5f)*height-sc->yof)*(sc->zoom-oldzoom)/sc->zoom;
-	}
-
-	return OPERATOR_FINISHED;
-}
-
-static int view_zoom_in_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
-	return view_zoom_inout_invoke(C, op, event, 0);
-}
-
 void CLIP_OT_view_zoom_in(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -576,11 +570,20 @@
 	ot->poll= ED_space_clip_poll;
 }
 
-static int view_zoom_out_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view_zoom_out_exec(bContext *C, wmOperator *UNUSED(op))
 {
-	return view_zoom_inout_invoke(C, op, event, 1);
+	view_zoom_out_do_exec(C, NULL);
+
+	return OPERATOR_FINISHED;
 }
 
+static int view_zoom_out_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
+{
+	view_zoom_out_do_exec(C, event);
+
+	return OPERATOR_FINISHED;
+}
+
 void CLIP_OT_view_zoom_out(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -600,7 +603,7 @@
 	SpaceClip *sc= CTX_wm_space_clip(C);
 	ARegion *ar= CTX_wm_region(C);
 
-	sclip_zoom_set(sc, ar, RNA_float_get(op->ptr, "ratio"));
+	sclip_zoom_set(sc, ar, RNA_float_get(op->ptr, "ratio"), NULL);
 
 	/* ensure pixel exact locations for draw */
 	sc->xof= (int)sc->xof;
@@ -655,10 +658,10 @@
 		/* find the zoom value that will fit the image in the image space */
 		zoomx= (float)width/w;
 		zoomy= (float)height/h;
-		sclip_zoom_set(sc, ar, 1.0f/power_of_2(1/MIN2(zoomx, zoomy)));
+		sclip_zoom_set(sc, ar, 1.0f/power_of_2(1/MIN2(zoomx, zoomy)), NULL);
 	}
 	else
-		sclip_zoom_set(sc, ar, 1.0f);
+		sclip_zoom_set(sc, ar, 1.0f, NULL);
 
 	sc->xof= sc->yof= 0.0f;
 




More information about the Bf-blender-cvs mailing list