Fix T44362 no easy way to repeatedly duplicate keyframes in action
editors. Reporter used a hacky work-around by placing cursor at end of keyframe range and doing ctrl-C ctrl-V repeatedly. This was working on 2.73 but not anymore since the old selection is not kept. Much better is to have duplication operator be repeatable. This commit takes care of that.
This commit is contained in:
parent
27ded012d6
commit
54c18d4849
Notes:
blender-bot
2023-02-14 09:44:47 +01:00
Referenced by issue #44362, Dope Sheet Bug, After Copy, Jump to Next Next Keframe, Paste the Copied Keyframe, Previous Selection Gone/Deselect Referenced by issue #42856, redo doesn't work for time translate keyframes in dopesheet
|
@ -792,13 +792,6 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
|
||||
{
|
||||
actkeys_duplicate_exec(C, op);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void ACTION_OT_duplicate(wmOperatorType *ot)
|
||||
{
|
||||
|
@ -808,7 +801,6 @@ void ACTION_OT_duplicate(wmOperatorType *ot)
|
|||
ot->description = "Make a copy of all selected keyframes";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke = actkeys_duplicate_invoke;
|
||||
ot->exec = actkeys_duplicate_exec;
|
||||
ot->poll = ED_operator_action_active;
|
||||
|
||||
|
|
|
@ -883,13 +883,6 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
|
||||
{
|
||||
graphkeys_duplicate_exec(C, op);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void GRAPH_OT_duplicate(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
|
@ -898,7 +891,6 @@ void GRAPH_OT_duplicate(wmOperatorType *ot)
|
|||
ot->description = "Make a copy of all selected keyframes";
|
||||
|
||||
/* api callbacks */
|
||||
ot->invoke = graphkeys_duplicate_invoke;
|
||||
ot->exec = graphkeys_duplicate_exec;
|
||||
ot->poll = graphop_editable_keyframes_poll;
|
||||
|
||||
|
|
|
@ -7591,7 +7591,7 @@ static void headerTimeTranslate(TransInfo *t, char str[MAX_INFO_LEN])
|
|||
}
|
||||
}
|
||||
|
||||
static void applyTimeTranslateValue(TransInfo *t, float UNUSED(sval))
|
||||
static void applyTimeTranslateValue(TransInfo *t)
|
||||
{
|
||||
TransData *td = t->data;
|
||||
TransData2D *td2d = t->data2d;
|
||||
|
@ -7649,15 +7649,17 @@ static void applyTimeTranslateValue(TransInfo *t, float UNUSED(sval))
|
|||
static void applyTimeTranslate(TransInfo *t, const int mval[2])
|
||||
{
|
||||
View2D *v2d = (View2D *)t->view;
|
||||
float cval[2], sval[2];
|
||||
char str[MAX_INFO_LEN];
|
||||
|
||||
/* calculate translation amount from mouse movement - in 'time-grid space' */
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[0], &cval[0], &cval[1]);
|
||||
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]);
|
||||
if (t->flag & T_MODAL) {
|
||||
float cval[2], sval[2];
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[0], &cval[0], &cval[1]);
|
||||
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[0], &sval[0], &sval[1]);
|
||||
|
||||
/* we only need to calculate effect for time (applyTimeTranslate only needs that) */
|
||||
t->values[0] = cval[0] - sval[0];
|
||||
/* we only need to calculate effect for time (applyTimeTranslate only needs that) */
|
||||
t->values[0] = cval[0] - sval[0];
|
||||
}
|
||||
|
||||
/* handle numeric-input stuff */
|
||||
t->vec[0] = t->values[0];
|
||||
|
@ -7665,7 +7667,7 @@ static void applyTimeTranslate(TransInfo *t, const int mval[2])
|
|||
t->values[0] = t->vec[0];
|
||||
headerTimeTranslate(t, str);
|
||||
|
||||
applyTimeTranslateValue(t, sval[0]);
|
||||
applyTimeTranslateValue(t);
|
||||
|
||||
recalcData(t);
|
||||
|
||||
|
|
Loading…
Reference in New Issue