From 541e2b3cdd3ca546500cf779e56a2e0f6567d23c Mon Sep 17 00:00:00 2001 From: Mukhesh Date: Tue, 22 Apr 2025 08:18:21 +0200 Subject: [PATCH] VSE: Hide-Reveal strips operator in sequencer preview This pull request adds options to hide and show strips in the Sequencer Preview, using the same shortcuts. Included "Show/Hide" operators in the Strips menu of preview mode. It only works on strips that are visible in the preview at the current frame. The Unmute operator now shows all hidden strips in the preview at the current frame, since it's not possible to select hidden strips in sequencer preview. See video in PR description. Pull Request: https://projects.blender.org/blender/blender/pulls/137781 --- .../keyconfig/keymap_data/blender_default.py | 6 ++++++ scripts/startup/bl_ui/space_sequencer.py | 15 +++++++++++++++ .../editors/space_sequencer/sequencer_edit.cc | 18 ++++++++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index b25dc3d6e01..6aae270d4f6 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -3217,6 +3217,12 @@ def km_sequencer_preview(params): {"properties": [("property", 'ROTATION')]}), ("sequencer.preview_duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), + ("sequencer.mute", {"type": 'H', "value": 'PRESS'}, + {"properties": [("unselected", False)]}), + ("sequencer.mute", {"type": 'H', "value": 'PRESS', "shift": True}, + {"properties": [("unselected", True)]}), + ("sequencer.unmute", {"type": 'H', "value": 'PRESS', "alt": True}, + {"properties": [("unselected", False)]}), ("sequencer.delete", {"type": 'X', "value": 'PRESS'}, None), ("sequencer.delete", {"type": 'DEL', "value": 'PRESS'}, None), diff --git a/scripts/startup/bl_ui/space_sequencer.py b/scripts/startup/bl_ui/space_sequencer.py index 9cf21aefa0a..d6eedab1a2e 100644 --- a/scripts/startup/bl_ui/space_sequencer.py +++ b/scripts/startup/bl_ui/space_sequencer.py @@ -941,6 +941,18 @@ class SEQUENCER_MT_strip_text(Menu): layout.operator("sequencer.text_deselect_all") +class SEQUENCER_MT_strip_show_hide(Menu): + bl_label = "Show/Hide" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_PREVIEW' + layout.operator("sequencer.unmute", text="Show Hidden Strips").unselected = False + layout.separator() + layout.operator("sequencer.mute", text="Hide Selected").unselected = False + layout.operator("sequencer.mute", text="Hide Unselected").unselected = True + + class SEQUENCER_MT_strip_input(Menu): bl_label = "Inputs" @@ -1061,6 +1073,8 @@ class SEQUENCER_MT_strip(Menu): layout.separator() layout.operator("sequencer.preview_duplicate_move", text="Duplicate") layout.separator() + layout.menu("SEQUENCER_MT_strip_show_hide") + layout.separator() if strip and strip.type == 'TEXT': layout.menu("SEQUENCER_MT_strip_text") @@ -3114,6 +3128,7 @@ classes = ( SEQUENCER_MT_strip_transform, SEQUENCER_MT_strip_retiming, SEQUENCER_MT_strip_text, + SEQUENCER_MT_strip_show_hide, SEQUENCER_MT_strip_input, SEQUENCER_MT_strip_lock_mute, SEQUENCER_MT_image, diff --git a/source/blender/editors/space_sequencer/sequencer_edit.cc b/source/blender/editors/space_sequencer/sequencer_edit.cc index d25e1ce8848..eafd15dc418 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.cc +++ b/source/blender/editors/space_sequencer/sequencer_edit.cc @@ -888,9 +888,9 @@ void SEQUENCER_OT_slip(wmOperatorType *ot) static wmOperatorStatus sequencer_mute_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); - Editing *ed = seq::editing_get(scene); + blender::VectorSet strips = all_strips_from_context(C); - LISTBASE_FOREACH (Strip *, strip, ed->seqbasep) { + for (Strip *strip : strips) { if (!RNA_boolean_get(op->ptr, "unselected")) { if (strip->flag & SELECT) { strip->flag |= SEQ_MUTE; @@ -939,9 +939,19 @@ static wmOperatorStatus sequencer_unmute_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); Editing *ed = seq::editing_get(scene); - + ARegion *region = CTX_wm_region(C); + const bool is_preview = (region->regiontype == RGN_TYPE_PREVIEW) && + sequencer_view_preview_only_poll(C); LISTBASE_FOREACH (Strip *, strip, ed->seqbasep) { - if (!RNA_boolean_get(op->ptr, "unselected")) { + if (is_preview) { + if (seq::time_strip_intersects_frame(scene, strip, scene->r.cfra) && + strip->type != STRIP_TYPE_SOUND_RAM) + { + strip->flag &= ~SEQ_MUTE; + seq::relations_invalidate_dependent(scene, strip); + } + } + else if (!RNA_boolean_get(op->ptr, "unselected")) { if (strip->flag & SELECT) { strip->flag &= ~SEQ_MUTE; seq::relations_invalidate_dependent(scene, strip);