[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