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
.doc
import doc_name
, doc_idname
, doc_brief
, doc_description
10 class POWER_SEQUENCER_OT_merge_from_scene_strip(bpy
.types
.Operator
):
12 *brief* Copies all sequences and markers from a SceneStrip's scene into
13 the active scene. Optionally delete the source scene and the strip
15 WARNING: Currently the operator doesn't recreate any animation data,
16 be careful by choosing to delete the scene after the merge
20 "name": doc_name(__qualname__
),
22 "description": doc_description(__doc__
),
24 "keymap": "Sequencer",
26 bl_idname
= doc_idname(__qualname__
)
27 bl_label
= doc
["name"]
28 bl_description
= doc_brief(doc
["description"])
29 bl_options
= {"REGISTER", "UNDO"}
31 delete_scene
: bpy
.props
.BoolProperty(
32 name
="Delete Strip's scene",
33 description
="Delete the SceneStrip's scene after the merging",
38 def poll(cls
, context
):
39 return context
.scene
.sequence_editor
.active_strip
41 def invoke(self
, context
, event
):
42 window_manager
= context
.window_manager
43 return window_manager
.invoke_props_dialog(self
)
45 def execute(self
, context
):
46 strip
= context
.scene
.sequence_editor
.active_strip
47 if strip
.type != "SCENE":
49 strip_scene
= strip
.scene
50 start_scene
= context
.window
.scene
52 self
.merge_markers(context
, strip_scene
, start_scene
)
53 self
.merge_strips(context
, strip_scene
, start_scene
)
55 if not self
.delete_scene
:
58 bpy
.ops
.sequencer
.select_all(action
="DESELECT")
60 bpy
.ops
.sequencer
.delete()
61 context
.window
.scene
= strip_scene
62 bpy
.ops
.scene
.delete()
63 context
.window
.scene
= start_scene
64 self
.report(type={"WARNING"}, message
="Merged scenes lose all their animation data.")
68 def merge_strips(self
, context
, source_scene
, target_scene
):
69 context
.window
.scene
= source_scene
70 current_frame
= context
.scene
.frame_current
71 context
.scene
.frame_current
= context
.scene
.frame_start
72 bpy
.ops
.sequencer
.select_all(action
="SELECT")
73 bpy
.ops
.sequencer
.copy()
74 context
.scene
.frame_current
= current_frame
76 context
.window
.scene
= target_scene
77 current_frame
= context
.scene
.frame_current
78 active
= context
.scene
.sequence_editor
.active_strip
79 context
.scene
.frame_current
= active
.frame_start
80 bpy
.ops
.sequencer
.select_all(action
="DESELECT")
81 bpy
.ops
.sequencer
.paste()
83 context
.scene
.frame_current
= current_frame
85 def merge_markers(self
, context
, source_scene
, target_scene
):
86 if len(source_scene
.timeline_markers
) == 0:
89 if len(target_scene
.timeline_markers
) > 0:
90 bpy
.ops
.marker
.select_all(action
="DESELECT")
92 bpy
.context
.window
.scene
= source_scene
93 bpy
.ops
.marker
.select_all(action
="SELECT")
94 bpy
.ops
.marker
.make_links_scene(scene
=target_scene
.name
)
96 bpy
.context
.window
.scene
= target_scene
97 active
= bpy
.context
.window
.scene
.sequence_editor
.active_strip
99 # Offset to account for source scenes starting on any frame.
100 time_offset
= active
.frame_start
- source_scene
.frame_start
101 bpy
.ops
.marker
.move(frames
=time_offset
)
102 bpy
.ops
.marker
.select_all(action
="DESELECT")