diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-02 15:58:34 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-02 15:59:10 +0400 |
commit | 26b2645d62f3f60b0125dcb14a8daa03920a6031 (patch) | |
tree | 1a7ad85224314213734fa855fbda6c88f6b6a827 /source/blender/editors | |
parent | 9caf702941dd6b0850fcbdbe2398479813ea5518 (diff) |
Implement fame sliding from IE's cache line
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/space_image/image_intern.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 120 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 4 |
3 files changed, 126 insertions, 0 deletions
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index a6c7e156f90..4d391874f9b 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -88,6 +88,8 @@ void IMAGE_OT_sample(struct wmOperatorType *ot); void IMAGE_OT_sample_line(struct wmOperatorType *ot); void IMAGE_OT_curves_point_set(struct wmOperatorType *ot); +void IMAGE_OT_change_frame(struct wmOperatorType *ot); + /* image_panels.c */ struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree); void image_buttons_register(struct ARegionType *art); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 109525f80cf..d299d690989 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -57,6 +57,7 @@ #include "BKE_packedFile.h" #include "BKE_report.h" #include "BKE_screen.h" +#include "BKE_sound.h" #include "GPU_draw.h" @@ -2496,6 +2497,11 @@ static int image_sample_invoke(bContext *C, wmOperator *op, const wmEvent *event ARegion *ar = CTX_wm_region(C); ImageSampleInfo *info; + if (ar->regiontype == RGN_TYPE_WINDOW) { + if (event->mval[1] <= 16) + return OPERATOR_PASS_THROUGH; + } + if (!ED_space_image_has_buffer(sima)) return OPERATOR_CANCELLED; @@ -2867,3 +2873,117 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot) RNA_def_boolean(ot->srna, "reverse", 0, "Cycle in Reverse", ""); } + +/********************** change frame operator *********************/ + +static int change_frame_poll(bContext *C) +{ + /* prevent changes during render */ + if (G.is_rendering) + return 0; + + return space_image_main_area_poll(C); +} + +static void change_frame_apply(bContext *C, wmOperator *op) +{ + Scene *scene = CTX_data_scene(C); + + /* set the new frame number */ + CFRA = RNA_int_get(op->ptr, "frame"); + FRAMENUMBER_MIN_CLAMP(CFRA); + SUBFRA = 0.0f; + + /* do updates */ + sound_seek_scene(CTX_data_main(C), CTX_data_scene(C)); + WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); +} + +static int change_frame_exec(bContext *C, wmOperator *op) +{ + change_frame_apply(C, op); + + return OPERATOR_FINISHED; +} + +static int frame_from_event(bContext *C, const wmEvent *event) +{ + ARegion *ar = CTX_wm_region(C); + Scene *scene = CTX_data_scene(C); + int framenr = 0; + + if (ar->regiontype == RGN_TYPE_WINDOW) { + float sfra = SFRA, efra = EFRA, framelen = ar->winx / (efra - sfra + 1); + + framenr = sfra + event->mval[0] / framelen; + } + else { + float viewx, viewy; + + UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &viewx, &viewy); + + framenr = iroundf(viewx); + } + + return framenr; +} + +static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + ARegion *ar = CTX_wm_region(C); + + if (ar->regiontype == RGN_TYPE_WINDOW) { + if (event->mval[1] > 16) + return OPERATOR_PASS_THROUGH; + } + + RNA_int_set(op->ptr, "frame", frame_from_event(C, event)); + + change_frame_apply(C, op); + + /* add temp handler */ + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event) +{ + switch (event->type) { + case ESCKEY: + return OPERATOR_FINISHED; + + case MOUSEMOVE: + RNA_int_set(op->ptr, "frame", frame_from_event(C, event)); + change_frame_apply(C, op); + break; + + case LEFTMOUSE: + case RIGHTMOUSE: + if (event->val == KM_RELEASE) + return OPERATOR_FINISHED; + break; + } + + return OPERATOR_RUNNING_MODAL; +} + +void IMAGE_OT_change_frame(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Change Frame"; + ot->idname = "IMAGE_OT_change_frame"; + ot->description = "Interactively change the current frame number"; + + /* api callbacks */ + ot->exec = change_frame_exec; + ot->invoke = change_frame_invoke; + ot->modal = change_frame_modal; + ot->poll = change_frame_poll; + + /* flags */ + ot->flag = OPTYPE_BLOCKING | OPTYPE_UNDO; + + /* rna */ + RNA_def_int(ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME); +} diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 50f3bc2f552..6419baab425 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -257,6 +257,8 @@ static void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_properties); WM_operatortype_append(IMAGE_OT_toolshelf); + + WM_operatortype_append(IMAGE_OT_change_frame); } static void image_keymap(struct wmKeyConfig *keyconf) @@ -312,6 +314,8 @@ static void image_keymap(struct wmKeyConfig *keyconf) RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD4, KM_PRESS, 0, 0)->ptr, "ratio", 0.25f); RNA_float_set(WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_ratio", PAD8, KM_PRESS, 0, 0)->ptr, "ratio", 0.125f); + WM_keymap_add_item(keymap, "IMAGE_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "IMAGE_OT_sample", ACTIONMOUSE, KM_PRESS, 0, 0); RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "point", 0); RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1); |