1 # SPDX-FileCopyrightText: 2016-2020 by Nathan Lovato, Daniel Oakey, Razvan Radulescu, and contributors
3 # SPDX-License-Identifier: GPL-3.0-or-later
7 from .utils
.functions
import slice_selection
8 from .utils
.doc
import doc_name
, doc_idname
, doc_brief
, doc_description
11 class POWER_SEQUENCER_OT_expand_to_surrounding_cuts(bpy
.types
.Operator
):
13 *Brief* Expand selected strips to surrounding cuts
15 Finds potential gaps surrounding each block of selected sequences and extends the corresponding
20 "name": doc_name(__qualname__
),
22 "description": doc_description(__doc__
),
25 {"type": "E", "value": "PRESS", "ctrl": True},
27 "Expand to Surrounding Cuts",
30 "keymap": "Sequencer",
32 bl_idname
= doc_idname(__qualname__
)
33 bl_label
= doc
["name"]
34 bl_description
= doc_brief(doc
["description"])
35 bl_options
= {"REGISTER", "UNDO"}
37 margin
: bpy
.props
.FloatProperty(
39 description
="Margin to leave on either sides of the trim in seconds",
43 gap_remove
: bpy
.props
.BoolProperty(
45 description
="When trimming the sequences, remove gaps automatically",
50 def poll(cls
, context
):
51 return context
.selected_sequences
53 def invoke(self
, context
, event
):
54 sequence_blocks
= slice_selection(context
, context
.selected_sequences
)
55 for sequences
in sequence_blocks
:
56 sequences_frame_start
= min(
57 sequences
, key
=lambda s
: s
.frame_final_start
59 sequences_frame_end
= max(sequences
, key
=lambda s
: s
.frame_final_end
).frame_final_end
61 frame_left
, frame_right
= find_closest_cuts(
62 context
, sequences_frame_start
, sequences_frame_end
64 if sequences_frame_start
== frame_left
and sequences_frame_end
== frame_right
:
67 to_extend_left
= [s
for s
in sequences
if s
.frame_final_start
== sequences_frame_start
]
68 to_extend_right
= [s
for s
in sequences
if s
.frame_final_end
== sequences_frame_end
]
70 for s
in to_extend_left
:
71 s
.frame_final_start
= (
72 frame_left
if frame_left
< sequences_frame_start
else sequences_frame_start
74 for s
in to_extend_right
:
76 frame_right
if frame_right
> sequences_frame_end
else sequences_frame_end
81 def find_closest_cuts(context
, frame_min
, frame_max
):
84 key
=lambda s
: s
.frame_final_end
if s
.frame_final_end
<= frame_min
else -1,
88 key
=lambda s
: s
.frame_final_start
if s
.frame_final_start
>= frame_max
else 1000000,
90 return frame_left
, frame_right