Graph Editor: Adjusting Change Frame and Jump to Keyframes operators to work with Drivers Cursor

This commit is contained in:
Joshua Leung
2015-10-26 19:29:23 +13:00
parent 0860fdc53c
commit b3edd7bdcd
2 changed files with 41 additions and 24 deletions

View File

@@ -1934,10 +1934,18 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
SpaceIpo *sipo = (SpaceIpo *)ac.sl;
Scene *scene = ac.scene;
/* take the average values, rounding to the nearest int for the current frame */
CFRA = iroundf(ked.f1 / ked.i1);
SUBFRA = 0.f;
sipo->cursorVal = ked.f2 / (float)ked.i1;
/* take the average values, rounding to the nearest int as necessary for int results */
if (sipo->mode == SIPO_MODE_DRIVERS) {
/* Drivers Mode - Affects cursor (float) */
sipo->cursorTime = ked.f1 / (float)ked.i1;
sipo->cursorVal = ked.f2 / (float)ked.i1;
}
else {
/* Animation Mode - Affects current frame (int) */
CFRA = iroundf(ked.f1 / ked.i1);
SUBFRA = 0.f;
sipo->cursorVal = ked.f2 / (float)ked.i1;
}
}
/* set notifier that things have changed */

View File

@@ -82,19 +82,33 @@ static void graphview_cursor_apply(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
SpaceIpo *sipo = CTX_wm_space_graph(C);
float frame = RNA_float_get(op->ptr, "frame"); /* this isn't technically "frame", but it'll do... */
/* adjust the frame or the cursor x-value */
if (sipo->mode == SIPO_MODE_DRIVERS) {
/* adjust cursor x-value */
sipo->cursorTime = (float)RNA_int_get(op->ptr, "frame"); // XXX: need new prop
sipo->cursorTime = frame;
}
else {
/* adjust the frame
* NOTE: sync this part of the code with ANIM_OT_change_frame
*/
CFRA = RNA_int_get(op->ptr, "frame");
FRAMENUMBER_MIN_CLAMP(CFRA);
SUBFRA = 0.f;
/* 1) frame is rounded to the nearest int, since frames are ints */
CFRA = iroundf(frame);
if (scene->r.flag & SCER_LOCK_FRAME_SELECTION) {
/* Clip to preview range
* NOTE: Preview range won't go into negative values,
* so only clamping once should be fine.
*/
CLAMP(CFRA, PSFRA, PEFRA);
}
else {
/* Prevent negative frames */
FRAMENUMBER_MIN_CLAMP(CFRA);
}
SUBFRA = 0.0f;
BKE_sound_seek_scene(bmain, scene);
}
@@ -122,7 +136,6 @@ static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent
Scene *scene = CTX_data_scene(C);
ARegion *ar = CTX_wm_region(C);
float viewx, viewy;
int frame;
/* abort if not active region (should not really be possible) */
if (ar == NULL)
@@ -131,15 +144,9 @@ static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent
/* convert from region coordinates to View2D 'tot' space */
UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &viewx, &viewy);
/* frame is rounded to the nearest int, since frames are ints */
frame = iroundf(viewx);
if (scene->r.flag & SCER_LOCK_FRAME_SELECTION) {
CLAMP(frame, PSFRA, PEFRA);
}
/* store the values in the operator properties */
RNA_int_set(op->ptr, "frame", frame);
/* NOTE: we don't clamp frame here, as it might be used for the drivers cursor */
RNA_float_set(op->ptr, "frame", viewx);
RNA_float_set(op->ptr, "value", viewy);
}
@@ -147,18 +154,18 @@ static void graphview_cursor_setprops(bContext *C, wmOperator *op, const wmEvent
static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
bScreen *screen = CTX_wm_screen(C);
/* Change to frame that mouse is over before adding modal handler,
* as user could click on a single frame (jump to frame) as well as
* click-dragging over a range (modal scrubbing).
* click-dragging over a range (modal scrubbing). Apply this change.
*/
graphview_cursor_setprops(C, op, event);
/* apply these changes first */
graphview_cursor_apply(C, op);
/* Signal that a scrubbing operating is starting */
if (screen)
screen->scrubbing = true;
/* add temp handler */
WM_event_add_modal_handler(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -168,13 +175,15 @@ static int graphview_cursor_invoke(bContext *C, wmOperator *op, const wmEvent *e
static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
bScreen *screen = CTX_wm_screen(C);
Scene *scene = CTX_data_scene(C);
/* execute the events */
switch (event->type) {
case ESCKEY:
if (screen)
screen->scrubbing = false;
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, CTX_data_scene(C));
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
return OPERATOR_FINISHED;
case MOUSEMOVE:
@@ -193,7 +202,7 @@ static int graphview_cursor_modal(bContext *C, wmOperator *op, const wmEvent *ev
if (screen)
screen->scrubbing = false;
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, CTX_data_scene(C));
WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene);
return OPERATOR_FINISHED;
}
break;
@@ -219,7 +228,7 @@ static void GRAPH_OT_cursor_set(wmOperatorType *ot)
ot->flag = OPTYPE_BLOCKING | OPTYPE_UNDO;
/* rna */
RNA_def_int(ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME);
RNA_def_float(ot->srna, "frame", 0, MINAFRAMEF, MAXFRAMEF, "Frame", "", MINAFRAMEF, MAXFRAMEF);
RNA_def_float(ot->srna, "value", 0, -FLT_MAX, FLT_MAX, "Value", "", -100.0f, 100.0f);
}