Graph Editor - Ctrl-LMB (Click Insert Keyframes) Operator
Now it is possible to add more keyframes to the 'active' F-Curve by simply Ctrl-LMB clicking in the graph space. NOTE: more advanced polling callbacks are needed in the Graph Editor...
This commit is contained in:
		@@ -244,6 +244,89 @@ void GRAPHEDIT_OT_view_all (wmOperatorType *ot)
 | 
			
		||||
 | 
			
		||||
// TODO: insertkey
 | 
			
		||||
 | 
			
		||||
/* ******************** Click-Insert Keyframes Operator ************************* */
 | 
			
		||||
 | 
			
		||||
static int graphkeys_click_insert_exec (bContext *C, wmOperator *op)
 | 
			
		||||
{
 | 
			
		||||
	bAnimContext ac;
 | 
			
		||||
	bAnimListElem *ale;
 | 
			
		||||
	float frame, val;
 | 
			
		||||
	
 | 
			
		||||
	/* get animation context */
 | 
			
		||||
	if (ANIM_animdata_get_context(C, &ac) == 0)
 | 
			
		||||
		return OPERATOR_CANCELLED;
 | 
			
		||||
	
 | 
			
		||||
	/* get active F-Curve 'anim-list-element' */
 | 
			
		||||
	ale= get_active_fcurve_channel(&ac);
 | 
			
		||||
	if (ELEM(NULL, ale, ale->data)) {
 | 
			
		||||
		if (ale) MEM_freeN(ale);
 | 
			
		||||
		return OPERATOR_CANCELLED;
 | 
			
		||||
	}
 | 
			
		||||
		
 | 
			
		||||
	/* get frame and value from props */
 | 
			
		||||
	frame= RNA_float_get(op->ptr, "frame");
 | 
			
		||||
	val= RNA_float_get(op->ptr, "value");
 | 
			
		||||
	
 | 
			
		||||
	/* insert keyframe on the specified frame + value */
 | 
			
		||||
	insert_vert_fcurve((FCurve *)ale->data, frame, val, 0);
 | 
			
		||||
	
 | 
			
		||||
	/* free temp data */
 | 
			
		||||
	MEM_freeN(ale);
 | 
			
		||||
	
 | 
			
		||||
	/* set notifier that things have changed */
 | 
			
		||||
	ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
 | 
			
		||||
	
 | 
			
		||||
	/* done */
 | 
			
		||||
	return OPERATOR_FINISHED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int graphkeys_click_insert_invoke (bContext *C, wmOperator *op, wmEvent *evt)
 | 
			
		||||
{
 | 
			
		||||
	bAnimContext ac;
 | 
			
		||||
	ARegion *ar;
 | 
			
		||||
	View2D *v2d;
 | 
			
		||||
	int mval[2];
 | 
			
		||||
	float x, y;
 | 
			
		||||
	
 | 
			
		||||
	/* get animation context */
 | 
			
		||||
	if (ANIM_animdata_get_context(C, &ac) == 0)
 | 
			
		||||
		return OPERATOR_CANCELLED;
 | 
			
		||||
	
 | 
			
		||||
	/* store mouse coordinates in View2D space, into the operator's properties */
 | 
			
		||||
	ar= ac.ar;
 | 
			
		||||
	v2d= &ar->v2d;
 | 
			
		||||
	
 | 
			
		||||
	mval[0]= (evt->x - ar->winrct.xmin);
 | 
			
		||||
	mval[1]= (evt->y - ar->winrct.ymin);
 | 
			
		||||
	
 | 
			
		||||
	UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
 | 
			
		||||
	
 | 
			
		||||
	RNA_float_set(op->ptr, "frame", x);
 | 
			
		||||
	RNA_float_set(op->ptr, "value", y);
 | 
			
		||||
	
 | 
			
		||||
	/* run exec now */
 | 
			
		||||
	return graphkeys_click_insert_exec(C, op);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRAPHEDIT_OT_keyframes_click_insert (wmOperatorType *ot)
 | 
			
		||||
{
 | 
			
		||||
	/* identifiers */
 | 
			
		||||
	ot->name= "Click-Insert Keyframes";
 | 
			
		||||
	ot->idname= "GRAPHEDIT_OT_keyframes_click_insert";
 | 
			
		||||
	
 | 
			
		||||
	/* api callbacks */
 | 
			
		||||
	ot->invoke= graphkeys_click_insert_invoke;
 | 
			
		||||
	ot->exec= graphkeys_click_insert_exec;
 | 
			
		||||
	ot->poll= ED_operator_areaactive; // XXX active + editable poll
 | 
			
		||||
	
 | 
			
		||||
	/* flags */
 | 
			
		||||
	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 | 
			
		||||
	
 | 
			
		||||
	/* properties */
 | 
			
		||||
	RNA_def_float(ot->srna, "frame", 1.0f, -FLT_MAX, FLT_MAX, "Frame Number", "Frame to insert keyframe on", 0, 100);
 | 
			
		||||
	RNA_def_float(ot->srna, "value", 1.0f, -FLT_MAX, FLT_MAX, "Value", "Value for keyframe on", 0, 100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* ******************** Copy/Paste Keyframes Operator ************************* */
 | 
			
		||||
/* NOTE: the backend code for this is shared with the dopesheet editor */
 | 
			
		||||
 | 
			
		||||
@@ -302,7 +385,7 @@ static int graphkeys_copy_exec(bContext *C, wmOperator *op)
 | 
			
		||||
		return OPERATOR_CANCELLED;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/* set notifier tha things have changed */
 | 
			
		||||
	/* set notifier that things have changed */
 | 
			
		||||
	ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_KEYFRAMES_VALUES);
 | 
			
		||||
	
 | 
			
		||||
	return OPERATOR_FINISHED;
 | 
			
		||||
 
 | 
			
		||||
@@ -82,6 +82,8 @@ enum {
 | 
			
		||||
void GRAPHEDIT_OT_previewrange_set(struct wmOperatorType *ot);
 | 
			
		||||
void GRAPHEDIT_OT_view_all(struct wmOperatorType *ot);
 | 
			
		||||
 | 
			
		||||
void GRAPHEDIT_OT_keyframes_click_insert(struct wmOperatorType *ot);
 | 
			
		||||
 | 
			
		||||
void GRAPHEDIT_OT_keyframes_copy(struct wmOperatorType *ot);
 | 
			
		||||
void GRAPHEDIT_OT_keyframes_paste(struct wmOperatorType *ot);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -125,6 +125,8 @@ void graphedit_operatortypes(void)
 | 
			
		||||
	WM_operatortype_append(GRAPHEDIT_OT_keyframes_copy);
 | 
			
		||||
	WM_operatortype_append(GRAPHEDIT_OT_keyframes_paste);
 | 
			
		||||
	
 | 
			
		||||
	WM_operatortype_append(GRAPHEDIT_OT_keyframes_click_insert);
 | 
			
		||||
	
 | 
			
		||||
	//TODO: insertkey...
 | 
			
		||||
	
 | 
			
		||||
	/* F-Curve Modifiers */
 | 
			
		||||
@@ -189,7 +191,7 @@ static void graphedit_keymap_keyframes (wmWindowManager *wm, ListBase *keymap)
 | 
			
		||||
	WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
 | 
			
		||||
	
 | 
			
		||||
		/* insertkey */
 | 
			
		||||
	// TODO..
 | 
			
		||||
	WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_click_insert", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
 | 
			
		||||
	
 | 
			
		||||
		/* copy/paste */
 | 
			
		||||
	WM_keymap_add_item(keymap, "GRAPHEDIT_OT_keyframes_copy", CKEY, KM_PRESS, KM_CTRL, 0);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user