diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-04 23:34:01 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-03-04 23:34:01 +0400 |
commit | f79232cf3459c64d3024fbfb374770aca91865d0 (patch) | |
tree | f659dc7ecc5b7411025834c5cbb76d634dcb2701 /source | |
parent | a0ab2eefb9c99140ebb3daad3be2303caea64b96 (diff) |
Movie clip editor: implemented border select operator for curves view
Diffstat (limited to 'source')
4 files changed, 92 insertions, 0 deletions
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c index f902422ab43..581b8787edb 100644 --- a/source/blender/editors/space_clip/clip_graph_ops.c +++ b/source/blender/editors/space_clip/clip_graph_ops.c @@ -37,6 +37,7 @@ #include "BLI_utildefines.h" #include "BLI_math.h" #include "BLI_listbase.h" +#include "BLI_rect.h" #include "BKE_context.h" #include "BKE_movieclip.h" @@ -304,6 +305,92 @@ void CLIP_OT_graph_select(wmOperatorType *ot) "Extend", "Extend selection rather than clearing the existing selection"); } +/********************** border select operator *********************/ + +typedef struct BorderSelectuserData { + rctf rect; + int change, mode, extend; +} BorderSelectuserData; + +static void border_select_cb(void *userdata, MovieTrackingTrack *UNUSED(track), + MovieTrackingMarker *marker, int coord, float val) +{ + BorderSelectuserData *data = (BorderSelectuserData *) userdata; + + if (BLI_in_rctf(&data->rect, marker->framenr, val)) { + int flag = 0; + + if (coord == 0) + flag = MARKER_GRAPH_SEL_X; + else + flag = MARKER_GRAPH_SEL_Y; + + if (data->mode == GESTURE_MODAL_SELECT) + marker->flag |= flag; + else + marker->flag &= ~flag; + + data->change = TRUE; + } + else if (!data->extend) { + marker->flag&= ~(MARKER_GRAPH_SEL_X|MARKER_GRAPH_SEL_Y); + } +} + +static int border_select_graph_exec(bContext *C, wmOperator *op) +{ + SpaceClip *sc = CTX_wm_space_clip(C); + ARegion *ar = CTX_wm_region(C); + MovieClip *clip = ED_space_clip(sc); + MovieTracking *tracking= &clip->tracking; + MovieTrackingTrack *act_track= BKE_tracking_active_track(tracking); + BorderSelectuserData userdata; + rcti rect; + + /* get rectangle from operator */ + rect.xmin = RNA_int_get(op->ptr, "xmin"); + rect.ymin = RNA_int_get(op->ptr, "ymin"); + rect.xmax = RNA_int_get(op->ptr, "xmax"); + rect.ymax = RNA_int_get(op->ptr, "ymax"); + + UI_view2d_region_to_view(&ar->v2d, rect.xmin, rect.ymin, &userdata.rect.xmin, &userdata.rect.ymin); + UI_view2d_region_to_view(&ar->v2d, rect.xmax, rect.ymax, &userdata.rect.xmax, &userdata.rect.ymax); + + userdata.change = FALSE; + userdata.mode = RNA_int_get(op->ptr, "gesture_mode"); + userdata.extend = RNA_boolean_get(op->ptr, "extend"); + + clip_graph_tracking_values_iterate_track(sc, act_track, &userdata, border_select_cb, NULL, NULL); + + if (userdata.change) { + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, NULL); + + return OPERATOR_FINISHED; + } + + return OPERATOR_CANCELLED; +} + +void CLIP_OT_graph_select_border(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Border Select"; + ot->description = "Select curve points using border selection"; + ot->idname = "CLIP_OT_graph_select_border"; + + /* api callbacks */ + ot->invoke = WM_border_select_invoke; + ot->exec = border_select_graph_exec; + ot->modal = WM_border_select_modal; + ot->poll = ED_space_clip_graph_poll; + + /* flags */ + ot->flag = OPTYPE_UNDO; + + /* properties */ + WM_operator_properties_gesture_border(ot, TRUE); +} + /******************** delete curve operator ********************/ static int delete_curve_exec(bContext *C, wmOperator *UNUSED(op)) diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h index c0b7137b5d8..d9457368c89 100644 --- a/source/blender/editors/space_clip/clip_intern.h +++ b/source/blender/editors/space_clip/clip_intern.h @@ -58,6 +58,7 @@ void clip_draw_graph(struct SpaceClip *sc, struct ARegion *ar, struct Scene *sce void ED_clip_graph_center_current_frame(struct Scene *scene, struct ARegion *ar); void CLIP_OT_graph_select(struct wmOperatorType *ot); +void CLIP_OT_graph_select_border(struct wmOperatorType *ot); void CLIP_OT_graph_delete_curve(struct wmOperatorType *ot); void CLIP_OT_graph_delete_knot(struct wmOperatorType *ot); void CLIP_OT_graph_view_all(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 00b997ba190..43890405ac3 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -370,6 +370,7 @@ static void clip_operatortypes(void) /* graph editing */ WM_operatortype_append(CLIP_OT_graph_select); + WM_operatortype_append(CLIP_OT_graph_select_border); WM_operatortype_append(CLIP_OT_graph_delete_curve); WM_operatortype_append(CLIP_OT_graph_delete_knot); WM_operatortype_append(CLIP_OT_graph_view_all); @@ -553,6 +554,8 @@ static void clip_keymap(struct wmKeyConfig *keyconf) kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", TRUE); + WM_keymap_add_item(keymap, "CLIP_OT_graph_select_border", BKEY, KM_PRESS, 0, 0); + /* delete */ WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", XKEY, KM_PRESS, 0, 0); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 22b13a72795..f9cbfc88301 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3835,6 +3835,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf) WM_modalkeymap_assign(keymap, "SEQUENCER_OT_view_ghost_border"); WM_modalkeymap_assign(keymap, "UV_OT_select_border"); WM_modalkeymap_assign(keymap, "CLIP_OT_select_border"); + WM_modalkeymap_assign(keymap, "CLIP_OT_graph_select_border"); WM_modalkeymap_assign(keymap, "VIEW2D_OT_zoom_border"); WM_modalkeymap_assign(keymap, "VIEW3D_OT_clip_border"); WM_modalkeymap_assign(keymap, "VIEW3D_OT_render_border"); |