diff options
-rw-r--r-- | release/scripts/startup/bl_ui/space_graph.py | 23 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_buttons.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_edit.c | 40 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/space_graph/graph_ops.c | 1 |
5 files changed, 64 insertions, 2 deletions
diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py index 078b1c9ff38..212a3d5ea2b 100644 --- a/release/scripts/startup/bl_ui/space_graph.py +++ b/release/scripts/startup/bl_ui/space_graph.py @@ -262,8 +262,7 @@ class GRAPH_MT_key(Menu): layout = self.layout layout.menu("GRAPH_MT_key_transform", text="Transform") - - layout.operator_menu_enum("graph.snap", "type", text="Snap") + layout.menu("GRAPH_MT_key_snap", text="Snap") layout.operator_menu_enum("graph.mirror", "type", text="Mirror") layout.separator() @@ -319,6 +318,23 @@ class GRAPH_MT_key_transform(Menu): layout.operator("transform.resize", text="Scale") +class GRAPH_MT_key_snap(Menu): + bl_label = "Snap" + + def draw(self, _context): + layout = self.layout + + layout.operator("graph.snap", text="Current Frame").type = 'CFRA' + layout.operator("graph.snap", text="Cursor Value").type = 'VALUE' + layout.operator("graph.snap", text="Nearest Frame").type = 'NEAREST_FRAME' + layout.operator("graph.snap", text="Nearest Second").type = 'NEAREST_SECOND' + layout.operator("graph.snap", text="Nearest Marker").type = 'NEAREST_MARKER' + layout.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL' + layout.separator() + layout.operator("graph.frame_jump", text="Cursor to Selection") + layout.operator("graph.snap_cursor_value", text="Cursor Value to Selection") + + class GRAPH_MT_delete(Menu): bl_label = "Delete" @@ -389,6 +405,8 @@ class GRAPH_MT_snap_pie(Menu): pie.operator("graph.snap", text="Nearest Second").type = 'NEAREST_SECOND' pie.operator("graph.snap", text="Nearest Marker").type = 'NEAREST_MARKER' pie.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL' + pie.operator("graph.frame_jump", text="Cursor to Selection") + pie.operator("graph.snap_cursor_value", text="Cursor Value to Selection") class GRAPH_MT_channel_context_menu(Menu): @@ -441,6 +459,7 @@ classes = ( GRAPH_MT_channel, GRAPH_MT_key, GRAPH_MT_key_transform, + GRAPH_MT_key_snap, GRAPH_MT_delete, GRAPH_MT_context_menu, GRAPH_MT_channel_context_menu, diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index be3e49fd810..a491ce29bd4 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -161,6 +161,7 @@ static void graph_panel_cursor(const bContext *C, Panel *panel) sub = uiLayoutColumn(col, true); uiItemO(sub, IFACE_("Cursor to Selection"), ICON_NONE, "GRAPH_OT_frame_jump"); + uiItemO(sub, IFACE_("Cursor Value to Selection"), ICON_NONE, "GRAPH_OT_snap_cursor_value"); } /* ******************* active F-Curve ************** */ diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index 3ec68971dea..c9b26674351 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -2838,6 +2838,46 @@ void GRAPH_OT_frame_jump(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } +/* snap 2D cursor value to the average value of selected keyframe */ +static int graphkeys_snap_cursor_value_exec(bContext *C, wmOperator *UNUSED(op)) +{ + bAnimContext ac; + + if (ANIM_animdata_get_context(C, &ac) == 0) { + return OPERATOR_CANCELLED; + } + + const KeyframeEditData keyframe_sum = sum_selected_keyframes(&ac); + const float sum_value = keyframe_sum.f2; + const int num_keyframes = keyframe_sum.i1; + + if (num_keyframes == 0) { + return OPERATOR_FINISHED; + } + + SpaceGraph *sipo = (SpaceGraph *)ac.sl; + sipo->cursorVal = sum_value / (float)num_keyframes; + // WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene); + ED_region_tag_redraw(CTX_wm_region(C)); + + return OPERATOR_FINISHED; +} + +void GRAPH_OT_snap_cursor_value(wmOperatorType *ot) +{ + /* Identifiers. */ + ot->name = "Snap Cursor Value to Selected"; + ot->idname = "GRAPH_OT_snap_cursor_value"; + ot->description = "Place the cursor value on the average value of selected keyframes"; + + /* API callbacks. */ + ot->exec = graphkeys_snap_cursor_value_exec; + ot->poll = graphkeys_framejump_poll; + + /* Flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + /* ******************** Snap Keyframes Operator *********************** */ /* defines for snap keyframes tool */ diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h index c39ffdf42ed..eaa14fedb93 100644 --- a/source/blender/editors/space_graph/graph_intern.h +++ b/source/blender/editors/space_graph/graph_intern.h @@ -113,6 +113,7 @@ void GRAPH_OT_extrapolation_type(struct wmOperatorType *ot); void GRAPH_OT_easing_type(struct wmOperatorType *ot); void GRAPH_OT_frame_jump(struct wmOperatorType *ot); +void GRAPH_OT_snap_cursor_value(struct wmOperatorType *ot); void GRAPH_OT_snap(struct wmOperatorType *ot); void GRAPH_OT_mirror(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 4d337fdeb5e..fd68303e759 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -452,6 +452,7 @@ void graphedit_operatortypes(void) WM_operatortype_append(GRAPH_OT_snap); WM_operatortype_append(GRAPH_OT_mirror); WM_operatortype_append(GRAPH_OT_frame_jump); + WM_operatortype_append(GRAPH_OT_snap_cursor_value); WM_operatortype_append(GRAPH_OT_handle_type); WM_operatortype_append(GRAPH_OT_interpolation_type); WM_operatortype_append(GRAPH_OT_extrapolation_type); |