Graph Editor: Adjusting Change Frame and Jump to Keyframes operators to work with Drivers Cursor
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user