[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27978] trunk/blender/source/blender: Added a new 'straight line' gesture type that can be used in any operator.

Matt Ebb matt at mke3.net
Sun Apr 4 02:21:37 CEST 2010


Revision: 27978
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27978
Author:   broken
Date:     2010-04-04 02:21:37 +0200 (Sun, 04 Apr 2010)

Log Message:
-----------
Added a new 'straight line' gesture type that can be used in any operator.

Use this for image editor Line Sample tool, rather than custom modal operator/
custom drawing.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/WM_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_gesture.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c
    trunk/blender/source/blender/windowmanager/wm_event_types.h

Modified: trunk/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_ops.c	2010-04-03 22:09:44 UTC (rev 27977)
+++ trunk/blender/source/blender/editors/space_image/image_ops.c	2010-04-04 00:21:37 UTC (rev 27978)
@@ -1634,27 +1634,20 @@
 }
 
 /******************** sample line operator ********************/
-typedef struct ImageSampleLineInfo {
-	ARegionType *art;
-	void *draw_handle;
-	int started;
-	int x_start, y_start, x_stop, y_stop;
-} ImageSampleLineInfo;
-
-static void sample_line_draw(const bContext *C, ARegion *ar, void *arg_info)
+static int sample_line_exec(bContext *C, wmOperator *op)
 {
-	ImageSampleLineInfo *info= arg_info;
-	draw_image_line(ar, info->x_start, info->y_start, info->x_stop, info->y_stop);
-}
-
-static void sample_line_apply(bContext *C, wmOperator *op)
-{
 	SpaceImage *sima= CTX_wm_space_image(C);
-	ImageSampleLineInfo *info= op->customdata;
 	ARegion *ar= CTX_wm_region(C);
+	
+	int x_start= RNA_int_get(op->ptr, "xstart");
+	int y_start= RNA_int_get(op->ptr, "ystart");
+	int x_end= RNA_int_get(op->ptr, "xend");
+	int y_end= RNA_int_get(op->ptr, "yend");
+	
 	void *lock;
 	ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock);
 	Histogram *hist= &sima->sample_line_hist;
+	
 	float x1f, y1f, x2f, y2f;
 	int x1, y1, x2, y2;
 	int i, x, y;
@@ -1663,16 +1656,16 @@
 	
 	if (ibuf == NULL) {
 		ED_space_image_release_buffer(sima, lock);
-		return;
+		return OPERATOR_CANCELLED;
 	}
 	/* hmmmm */
 	if (ibuf->channels < 3) {
 		ED_space_image_release_buffer(sima, lock);
-		return;
+		return OPERATOR_CANCELLED;
 	}
 	
-	UI_view2d_region_to_view(&ar->v2d, info->x_start, info->y_start, &x1f, &y1f);
-	UI_view2d_region_to_view(&ar->v2d, info->x_stop, info->y_stop, &x2f, &y2f);
+	UI_view2d_region_to_view(&ar->v2d, x_start, y_start, &x1f, &y1f);
+	UI_view2d_region_to_view(&ar->v2d, x_end, y_end, &x2f, &y2f);
 	x1= 0.5f+ x1f*ibuf->x;
 	x2= 0.5f+ x2f*ibuf->x;
 	y1= 0.5f+ y1f*ibuf->y;
@@ -1707,76 +1700,22 @@
 	hist->ok=1;
 	
 	ED_space_image_release_buffer(sima, lock);
-}
-
-static void sample_line_exit(bContext *C, wmOperator *op)
-{
-	ImageSampleLineInfo *info= op->customdata;
 	
-	ED_region_draw_cb_exit(info->art, info->draw_handle);
 	ED_area_tag_redraw(CTX_wm_area(C));
-	MEM_freeN(info);
+	
+	return OPERATOR_FINISHED;
 }
 
 static int sample_line_invoke(bContext *C, wmOperator *op, wmEvent *event)
 {
 	SpaceImage *sima= CTX_wm_space_image(C);
-	ImageSampleLineInfo *info;
-
+	
 	if(!ED_space_image_has_buffer(sima))
 		return OPERATOR_CANCELLED;
 	
-	info= MEM_callocN(sizeof(ImageSampleLineInfo), "ImageSampleLineInfo");
-	info->started= 0;
-	op->customdata= info;
-
-	WM_event_add_modal_handler(C, op);
-
-	return OPERATOR_RUNNING_MODAL;
+	return WM_gesture_straightline_invoke(C, op, event);
 }
 
-static int sample_line_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
-	ImageSampleLineInfo *info= op->customdata;
-	ARegion *ar= CTX_wm_region(C);
-	
-	switch(event->type) {
-		case LEFTMOUSE:
-			if (info->started == 0) {
-				info->x_start = event->mval[0];
-				info->y_start = event->mval[1];
-				info->art= ar->type;
-				info->draw_handle = ED_region_draw_cb_activate(ar->type, sample_line_draw, info, REGION_DRAW_POST_PIXEL);
-				info->started = 1;
-			} else {
-				sample_line_apply(C, op);
-				sample_line_exit(C, op);
-				return OPERATOR_FINISHED;
-			}
-			break;
-		case RIGHTMOUSE: // XXX hardcoded
-		case ESCKEY:
-			sample_line_exit(C, op);
-			return OPERATOR_CANCELLED;
-		case MOUSEMOVE:
-			if (info->started == 1) {
-				info->x_stop = event->mval[0];
-				info->y_stop = event->mval[1];
-				ED_area_tag_redraw(CTX_wm_area(C));
-            sample_line_apply(C, op);
-			}
-			break;
-	}
-
-	return OPERATOR_RUNNING_MODAL;
-}
-
-static int sample_line_cancel(bContext *C, wmOperator *op)
-{
-	sample_line_exit(C, op);
-	return OPERATOR_CANCELLED;
-}
-
 void IMAGE_OT_sample_line(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -1785,12 +1724,14 @@
 	
 	/* api callbacks */
 	ot->invoke= sample_line_invoke;
-	ot->modal= sample_line_modal;
-	ot->cancel= sample_line_cancel;
+	ot->modal= WM_gesture_straightline_modal;
+	ot->exec= sample_line_exec;
 	ot->poll= space_image_main_area_poll;
-
+	
 	/* flags */
-	ot->flag= OPTYPE_BLOCKING;
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	
+	WM_operator_properties_gesture_straightline(ot, CURSOR_EDIT);
 }
 
 /******************** set curve point operator ********************/

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2010-04-03 22:09:44 UTC (rev 27977)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2010-04-04 00:21:37 UTC (rev 27978)
@@ -225,6 +225,7 @@
 void		WM_operator_properties_free(struct PointerRNA *ptr);
 void		WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type, short action);
 void		WM_operator_properties_gesture_border(struct wmOperatorType *ot, int extend);
+void		WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor);
 void		WM_operator_properties_select_all(struct wmOperatorType *ot);
 
 /* MOVE THIS SOMEWHERE ELSE */
@@ -253,6 +254,8 @@
 int			WM_gesture_lines_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 int			WM_gesture_lasso_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 int			WM_gesture_lasso_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+int			WM_gesture_straightline_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
+int			WM_gesture_straightline_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 
 			/* default operator for arearegions, generates event */
 void		WM_OT_tweak_gesture(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_types.h	2010-04-03 22:09:44 UTC (rev 27977)
+++ trunk/blender/source/blender/windowmanager/WM_types.h	2010-04-04 00:21:37 UTC (rev 27978)
@@ -287,6 +287,7 @@
 #define WM_GESTURE_CROSS_RECT	3
 #define WM_GESTURE_LASSO		4
 #define WM_GESTURE_CIRCLE		5
+#define WM_GESTURE_STRAIGHTLINE	6
 
 /* wmGesture is registered to window listbase, handled by operator callbacks */
 /* tweak gesture is builtin feature */
@@ -303,6 +304,7 @@
 	/* customdata for border is a recti */
 	/* customdata for circle is recti, (xmin, ymin) is center, xmax radius */
 	/* customdata for lasso is short array */
+	/* customdata for straight line is a recti: (xmin,ymin) is start, (xmax, ymax) is end */
 } wmGesture;
 
 /* ************** wmEvent ************************ */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_gesture.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_gesture.c	2010-04-03 22:09:44 UTC (rev 27977)
+++ trunk/blender/source/blender/windowmanager/intern/wm_gesture.c	2010-04-04 00:21:37 UTC (rev 27978)
@@ -70,7 +70,7 @@
 	
 	wm_subwindow_getorigin(window, gesture->swinid, &sx, &sy);
 	
-	if( ELEM4(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT, WM_GESTURE_TWEAK, WM_GESTURE_CIRCLE)) {
+	if( ELEM5(type, WM_GESTURE_RECT, WM_GESTURE_CROSS_RECT, WM_GESTURE_TWEAK, WM_GESTURE_CIRCLE, WM_GESTURE_STRAIGHTLINE)) {
 		rcti *rect= MEM_callocN(sizeof(rcti), "gesture rect new");
 		
 		gesture->customdata= rect;
@@ -335,6 +335,8 @@
 			wm_gesture_draw_lasso(win, gt);
 		else if(gt->type==WM_GESTURE_LASSO) 
 			wm_gesture_draw_lasso(win, gt);
+		else if(gt->type==WM_GESTURE_STRAIGHTLINE)
+			wm_gesture_draw_line(win, gt);
 	}
 }
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-04-03 22:09:44 UTC (rev 27977)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-04-04 00:21:37 UTC (rev 27978)
@@ -848,7 +848,18 @@
 		RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first");
 }
 
+void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor)
+{
+	RNA_def_int(ot->srna, "xstart", 0, INT_MIN, INT_MAX, "X Start", "", INT_MIN, INT_MAX);
+	RNA_def_int(ot->srna, "xend", 0, INT_MIN, INT_MAX, "X End", "", INT_MIN, INT_MAX);
+	RNA_def_int(ot->srna, "ystart", 0, INT_MIN, INT_MAX, "Y Start", "", INT_MIN, INT_MAX);
+	RNA_def_int(ot->srna, "yend", 0, INT_MIN, INT_MAX, "Y End", "", INT_MIN, INT_MAX);
+	
+	if(cursor)
+		RNA_def_int(ot->srna, "cursor", cursor, 0, INT_MAX, "Cursor", "Mouse cursor style to use during the modal operator", 0, INT_MAX);
+}
 
+
 /* op->poll */
 int WM_operator_winactive(bContext *C)
 {
@@ -2062,7 +2073,7 @@
 	}
 	else if (event->type==EVT_MODAL_MAP) {
 		switch (event->val) {
-		case GESTURE_MODAL_BORDER_BEGIN:
+		case GESTURE_MODAL_BEGIN:
 			if(gesture->type==WM_GESTURE_CROSS_RECT && gesture->mode==0) {
 				gesture->mode= 1;
 				wm_gesture_tag_redraw(C);
@@ -2429,6 +2440,112 @@
 }
 #endif
 
+/* *********************** straight line gesture ****************** */
+
+static int straightline_apply(bContext *C, wmOperator *op)
+{
+	wmGesture *gesture= op->customdata;
+	rcti *rect= gesture->customdata;
+	
+	if(rect->xmin==rect->xmax && rect->ymin==rect->ymax)
+		return 0;
+	
+	/* operator arguments and storage. */
+	RNA_int_set(op->ptr, "xstart", rect->xmin);
+	RNA_int_set(op->ptr, "ystart", rect->ymin);
+	RNA_int_set(op->ptr, "xend", rect->xmax);
+	RNA_int_set(op->ptr, "yend", rect->ymax);
+
+	if(op->type->exec)
+		op->type->exec(C, op);
+	
+	return 1;
+}
+
+
+int WM_gesture_straightline_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+	op->customdata= WM_gesture_new(C, event, WM_GESTURE_STRAIGHTLINE);
+	
+	/* add modal handler */
+	WM_event_add_modal_handler(C, op);
+	
+	wm_gesture_tag_redraw(C);
+	
+	if( RNA_struct_find_property(op->ptr, "cursor") )
+		WM_cursor_modal(CTX_wm_window(C), RNA_int_get(op->ptr, "cursor"));
+		
+	return OPERATOR_RUNNING_MODAL;
+}
+
+int WM_gesture_straightline_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+	wmGesture *gesture= op->customdata;
+	rcti *rect= gesture->customdata;
+	int sx, sy;
+	
+	if(event->type== MOUSEMOVE) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list