diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index e3b67cb4350..9bf325ae9f0 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -2759,9 +2759,19 @@ def km_nla_editor(params): {"properties": [("mode", 'TIME_SCALE')]}), ("marker.add", {"type": 'M', "value": 'PRESS'}, None), *_template_items_context_menu("NLA_MT_context_menu", params.context_menu_event), - *_template_items_change_frame(params), ]) + if params.select_mouse == 'LEFTMOUSE' and not params.legacy: + items.extend([ + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True}, + {"properties": [("seq_solo_preview", True)]}), + ]) + else: + items.extend([ + ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, + {"properties": [("seq_solo_preview", True)]}), + ]) + return keymap @@ -8114,7 +8124,8 @@ def km_sequencer_editor_tool_generic_select_timeline_rcs(params): ("sequencer.select_handle", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("sequencer.select_handle", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True}, {"properties": [("ignore_connections", True)]}), - *_template_items_change_frame(params), + ("anim.change_frame", {"type": params.action_mouse, "value": 'PRESS'}, + {"properties": [("seq_solo_preview", True)]}), # Change frame takes precedence over the sequence slide operator. If a # mouse press happens on a strip handle, it is canceled, and the sequence # slide below activates instead. @@ -8128,7 +8139,8 @@ def km_sequencer_editor_tool_generic_select_timeline_lcs(params): ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None), ("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, {"properties": [("toggle", True)]}), - *_template_items_change_frame(params), + ("anim.change_frame", {"type": 'RIGHTMOUSE', "value": 'PRESS', + "shift": True}, {"properties": [("seq_solo_preview", True)]}), ] diff --git a/source/blender/editors/animation/anim_ops.cc b/source/blender/editors/animation/anim_ops.cc index e6627a4fbf9..8bc7f89685d 100644 --- a/source/blender/editors/animation/anim_ops.cc +++ b/source/blender/editors/animation/anim_ops.cc @@ -25,6 +25,8 @@ #include "BKE_report.hh" #include "BKE_scene.hh" +#include "BLT_translation.hh" + #include "UI_view2d.hh" #include "RNA_access.hh" @@ -276,9 +278,12 @@ static int change_frame_invoke(bContext *C, wmOperator *op, const wmEvent *event } screen->scrubbing = true; - SpaceSeq *sseq = CTX_wm_space_seq(C); - if (sseq) { - change_frame_seq_preview_begin(C, event, sseq); + + if (RNA_boolean_get(op->ptr, "seq_solo_preview")) { + SpaceSeq *sseq = CTX_wm_space_seq(C); + if (sseq) { + change_frame_seq_preview_begin(C, event, sseq); + } } change_frame_apply(C, op, true); @@ -303,14 +308,16 @@ static bool need_extra_redraw_after_scrubbing_ends(bContext *C) return false; } -static void change_frame_cancel(bContext *C, wmOperator * /*op*/) +static void change_frame_cancel(bContext *C, wmOperator *op) { bScreen *screen = CTX_wm_screen(C); screen->scrubbing = false; - SpaceSeq *sseq = CTX_wm_space_seq(C); - if (sseq != nullptr) { - change_frame_seq_preview_end(sseq); + if (RNA_boolean_get(op->ptr, "seq_solo_preview")) { + SpaceSeq *sseq = CTX_wm_space_seq(C); + if (sseq != nullptr) { + change_frame_seq_preview_end(sseq); + } } if (need_extra_redraw_after_scrubbing_ends(C)) { @@ -369,10 +376,13 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event) bScreen *screen = CTX_wm_screen(C); screen->scrubbing = false; - SpaceSeq *sseq = CTX_wm_space_seq(C); - if (sseq != nullptr) { - change_frame_seq_preview_end(sseq); + if (RNA_boolean_get(op->ptr, "seq_solo_preview")) { + SpaceSeq *sseq = CTX_wm_space_seq(C); + if (sseq != nullptr) { + change_frame_seq_preview_end(sseq); + } } + if (need_extra_redraw_after_scrubbing_ends(C)) { Scene *scene = CTX_data_scene(C); WM_event_add_notifier(C, NC_SCENE | ND_FRAME, scene); @@ -382,6 +392,15 @@ static int change_frame_modal(bContext *C, wmOperator *op, const wmEvent *event) return ret; } +static std::string change_frame_get_name(wmOperatorType * /*ot*/, PointerRNA *ptr) +{ + if (RNA_boolean_get(ptr, "seq_solo_preview")) { + return CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Set Frame (Strip Preview)"); + } + + return {}; +} + static void ANIM_OT_change_frame(wmOperatorType *ot) { PropertyRNA *prop; @@ -397,6 +416,7 @@ static void ANIM_OT_change_frame(wmOperatorType *ot) ot->cancel = change_frame_cancel; ot->modal = change_frame_modal; ot->poll = change_frame_poll; + ot->get_name = change_frame_get_name; /* flags */ ot->flag = OPTYPE_BLOCKING | OPTYPE_GRAB_CURSOR_X | OPTYPE_UNDO_GROUPED; @@ -406,6 +426,7 @@ static void ANIM_OT_change_frame(wmOperatorType *ot) ot->prop = RNA_def_float( ot->srna, "frame", 0, MINAFRAME, MAXFRAME, "Frame", "", MINAFRAME, MAXFRAME); prop = RNA_def_boolean(ot->srna, "snap", false, "Snap", ""); + prop = RNA_def_boolean(ot->srna, "seq_solo_preview", false, "Strip Preview", ""); RNA_def_property_flag(prop, PROP_SKIP_SAVE); }