From 8e0573c3dccfcb3b27abf0f6380a5a25667a26e1 Mon Sep 17 00:00:00 2001 From: Marcos Couto Date: Wed, 22 May 2013 04:53:08 -0300 Subject: [PATCH] new add_marker_at_click operator to attempt at a better behavior of adding markers, see bug #35461 --- .../release/scripts/startup/bl_ui/space_clip.py | 2 +- .../blender/editors/space_clip/clip_intern.h | 1 + .../source/blender/editors/space_clip/space_clip.c | 1 + .../blender/editors/space_clip/tracking_ops.c | 66 ++++++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/blender/release/scripts/startup/bl_ui/space_clip.py b/blender/release/scripts/startup/bl_ui/space_clip.py index 387a625..eb792eb 100644 --- a/blender/release/scripts/startup/bl_ui/space_clip.py +++ b/blender/release/scripts/startup/bl_ui/space_clip.py @@ -211,7 +211,7 @@ class CLIP_PT_tools_marker(CLIP_PT_tracking_panel, Panel): settings = clip.tracking.settings col = layout.column(align=True) - props = col.operator("clip.add_marker_at_center", text="Add Marker") + props = col.operator("clip.add_marker_at_click", text="Add Marker 2") col.operator("clip.detect_features") col.operator("clip.delete_track") diff --git a/blender/source/blender/editors/space_clip/clip_intern.h b/blender/source/blender/editors/space_clip/clip_intern.h index f1851ef..2dd695a 100644 --- a/blender/source/blender/editors/space_clip/clip_intern.h +++ b/blender/source/blender/editors/space_clip/clip_intern.h @@ -146,6 +146,7 @@ struct MovieTrackingTrack *tracking_marker_check_slide(struct bContext *C, const void CLIP_OT_add_marker(struct wmOperatorType *ot); void CLIP_OT_add_marker_at_center(struct wmOperatorType *ot); +void CLIP_OT_add_marker_at_click(struct wmOperatorType *ot); void CLIP_OT_delete_track(struct wmOperatorType *ot); void CLIP_OT_delete_marker(struct wmOperatorType *ot); diff --git a/blender/source/blender/editors/space_clip/space_clip.c b/blender/source/blender/editors/space_clip/space_clip.c index fcb3347..fdbfef8 100644 --- a/blender/source/blender/editors/space_clip/space_clip.c +++ b/blender/source/blender/editors/space_clip/space_clip.c @@ -466,6 +466,7 @@ static void clip_operatortypes(void) /* markers */ WM_operatortype_append(CLIP_OT_add_marker); WM_operatortype_append(CLIP_OT_add_marker_at_center); + WM_operatortype_append(CLIP_OT_add_marker_at_click); WM_operatortype_append(CLIP_OT_slide_marker); WM_operatortype_append(CLIP_OT_delete_track); WM_operatortype_append(CLIP_OT_delete_marker); diff --git a/blender/source/blender/editors/space_clip/tracking_ops.c b/blender/source/blender/editors/space_clip/tracking_ops.c index ffa4ee2..593ed7a 100644 --- a/blender/source/blender/editors/space_clip/tracking_ops.c +++ b/blender/source/blender/editors/space_clip/tracking_ops.c @@ -203,6 +203,72 @@ void CLIP_OT_add_marker_at_center(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } +/********************** add marker operator *********************/ + +static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) +{ + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +static int add_marker_at_click_modal(bContext *C, wmOperator *op, const wmEvent *event) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + MovieClip *clip = ED_space_clip_get_clip(sc); + ARegion *ar = CTX_wm_region(C); + + float pos[2]; + int width, height, sx, sy; + float zoomx, zoomy; + + switch(event->type) { + case MOUSEMOVE: + return OPERATOR_RUNNING_MODAL; + break; + + case LEFTMOUSE: + + if (event->x < ar->winrct.xmin || event->x > ar->winrct.xmax + || event->y < ar->winrct.ymin || event->y > ar->winrct.ymax) + return OPERATOR_CANCELLED; + + ED_clip_point_stable_pos(sc, ar, + event->x - ar->winrct.xmin, + event->y - ar->winrct.ymin, + &pos[0], &pos[1]); + + if (!add_marker(C, pos[0], pos[1])) + return OPERATOR_CANCELLED; + + WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip); + return OPERATOR_FINISHED; + break; + + default: + return OPERATOR_FINISHED; + } + + return OPERATOR_FINISHED; +} + +void CLIP_OT_add_marker_at_click(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Marker at Click"; + ot->idname = "CLIP_OT_add_marker_at_click"; + ot->description = "Place new marker at the desired (clicked) position"; + + /* api callbacks */ + ot->invoke = add_marker_at_click_invoke; + ot->poll = ED_space_clip_tracking_poll; // parece estar correto ?? + ot->modal = add_marker_at_click_modal; + + /* flags */ + // ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + ot->flag= OPTYPE_BLOCKING; +} + /********************** delete track operator *********************/ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op)) -- 1.8.2.1