rna data path names which are more likely to break animations.
[blender-staging.git] / release / scripts / op / sequencer.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 import bpy
22
23 from bpy.props import *
24
25
26 class SequencerCrossfadeSounds(bpy.types.Operator):
27     '''Do crossfading volume animation of two selected sound strips.'''
28
29     bl_idname = "sequencer.crossfade_sounds"
30     bl_label = "Crossfade sounds"
31     bl_options = {'REGISTER', 'UNDO'}
32
33     @classmethod
34     def poll(cls, context):
35         if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
36             return context.scene.sequence_editor.active_strip.type == 'SOUND'
37         else:
38             return False
39
40     def execute(self, context):
41         seq1 = None
42         seq2 = None
43         for s in context.scene.sequence_editor.sequences:
44             if s.select and s.type == 'SOUND':
45                 if seq1 == None:
46                     seq1 = s
47                 elif seq2 == None:
48                     seq2 = s
49                 else:
50                     seq2 = None
51                     break
52         if seq2 == None:
53             self.report({'ERROR'}, "Select 2 sound strips.")
54             return {'CANCELLED'}
55         if seq1.frame_final_start > seq2.frame_final_start:
56             s = seq1
57             seq1 = seq2
58             seq2 = s
59         if seq1.frame_final_end > seq2.frame_final_start:
60             tempcfra = context.scene.frame_current
61             context.scene.frame_current = seq2.frame_final_start
62             seq1.keyframe_insert('volume')
63             context.scene.frame_current = seq1.frame_final_end
64             seq1.volume = 0
65             seq1.keyframe_insert('volume')
66             seq2.keyframe_insert('volume')
67             context.scene.frame_current = seq2.frame_final_start
68             seq2.volume = 0
69             seq2.keyframe_insert('volume')
70             context.scene.frame_current = tempcfra
71             return {'FINISHED'}
72         else:
73             self.report({'ERROR'}, "The selected strips don't overlap.")
74             return {'CANCELLED'}
75
76
77 class SequencerCutMulticam(bpy.types.Operator):
78     '''Cut multicam strip and select camera.'''
79
80     bl_idname = "sequencer.cut_multicam"
81     bl_label = "Cut multicam"
82     bl_options = {'REGISTER', 'UNDO'}
83
84     camera = IntProperty(name="Camera",
85             default=1, min=1, max=32, soft_min=1, soft_max=32)
86
87     @classmethod
88     def poll(cls, context):
89         if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
90             return context.scene.sequence_editor.active_strip.type == 'MULTICAM'
91         else:
92             return False
93
94     def execute(self, context):
95         camera = self.properties.camera
96
97         s = context.scene.sequence_editor.active_strip
98
99         if s.multicam_source == camera or camera >= s.channel:
100             return {'FINISHED'}
101
102         if not s.select:
103             s.select = True
104
105         cfra = context.scene.frame_current
106         bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT')
107         for s in context.scene.sequence_editor.sequences_all:
108             if s.select and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end:
109                 context.scene.sequence_editor.active_strip = s
110
111         context.scene.sequence_editor.active_strip.multicam_source = camera
112         return {'FINISHED'}
113
114
115 class SequencerDeinterlaceSelectedMovies(bpy.types.Operator):
116     '''Deinterlace all selected movie sources.'''
117
118     bl_idname = "sequencer.deinterlace_selected_movies"
119     bl_label = "Deinterlace Movies"
120     bl_options = {'REGISTER', 'UNDO'}
121
122     @classmethod
123     def poll(cls, context):
124         if context.scene and context.scene.sequence_editor:
125             return True
126         else:
127             return False
128
129     def execute(self, context):
130         for s in context.scene.sequence_editor.sequences_all:
131             if s.select and s.type == 'MOVIE':
132                 s.use_deinterlace = True
133
134         return {'FINISHED'}
135
136
137 def register():
138     pass
139
140
141 def unregister():
142     pass
143
144
145 if __name__ == "__main__":
146     register()