Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sequencer_kinoraw_tools/ui.py')
-rw-r--r--sequencer_kinoraw_tools/ui.py765
1 files changed, 765 insertions, 0 deletions
diff --git a/sequencer_kinoraw_tools/ui.py b/sequencer_kinoraw_tools/ui.py
new file mode 100644
index 00000000..51b5de42
--- /dev/null
+++ b/sequencer_kinoraw_tools/ui.py
@@ -0,0 +1,765 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+import bpy
+from bpy.types import (
+ Menu,
+ Panel,
+ )
+from . import functions
+
+
+# UI
+class SEQUENCER_EXTRA_MT_input(Menu):
+ bl_label = "Input"
+
+ def draw(self, context):
+ self.layout.label("Kinoraw Input")
+ self.layout.separator()
+
+ self.layout.operator_context = "INVOKE_REGION_WIN"
+ self.layout.operator("sequencerextra.striprename",
+ text="File Name to Strip Name")
+ self.layout.operator("sequencerextra.editexternally",
+ text="Open with External Editor")
+ self.layout.operator("sequencerextra.edit",
+ text="Open with Editor")
+ self.layout.operator("sequencerextra.createmovieclip",
+ text="Create Movieclip strip")
+
+
+def sequencer_header_func(self, context):
+ self.layout.menu("SEQUENCER_EXTRA_MT_input")
+
+
+def sequencer_add_menu_func(self, context):
+ self.layout.operator("sequencerextra.placefromfilebrowser",
+ text="Place from File Browser").insert = False
+ self.layout.operator("sequencerextra.placefromfilebrowser",
+ text="Insert from File Browser").insert = True
+ self.layout.operator("sequencerextra.recursiveload",
+ text="Recursive Load from Browser")
+ self.layout.separator()
+
+
+def sequencer_select_menu_func(self, context):
+ self.layout.operator_menu_enum('sequencerextra.select_all_by_type',
+ 'type', text='All by Type')
+ self.layout.separator()
+ self.layout.operator('sequencerextra.selectcurrentframe',
+ text='Before Current Frame').mode = 'BEFORE'
+ self.layout.operator('sequencerextra.selectcurrentframe',
+ text='After Current Frame').mode = 'AFTER'
+ self.layout.operator('sequencerextra.selectcurrentframe',
+ text='On Current Frame').mode = 'ON'
+ self.layout.separator()
+ self.layout.operator('sequencerextra.selectsamechannel',
+ text='Same Channel')
+
+
+def sequencer_strip_menu_func(self, context):
+ self.layout.operator('sequencerextra.extendtofill',
+ text='Extend to Fill')
+ self.layout.operator_menu_enum('sequencerextra.fadeinout',
+ 'mode', text='Fade')
+ self.layout.operator_menu_enum('sequencerextra.copyproperties',
+ 'prop')
+
+ self.layout.operator("sequencerextra.insert",
+ text="Insert (Single Channel)").singlechannel = True
+ self.layout.operator("sequencerextra.insert",
+ text="Insert").singlechannel = False
+ self.layout.operator("sequencerextra.ripplecut",
+ text="Ripple Cut")
+ self.layout.operator("sequencerextra.rippledelete",
+ text="Ripple Delete")
+ self.layout.separator()
+
+
+def time_frame_menu_func(self, context):
+ self.layout.operator('timeextra.trimtimelinetoselection',
+ text='Trim to Selection')
+ self.layout.operator('timeextra.trimtimeline',
+ text='Trim to Timeline Content')
+ self.layout.separator()
+ self.layout.operator('screenextra.frame_skip',
+ text='Skip Forward One Second').back = False
+ self.layout.operator('screenextra.frame_skip',
+ text='Skip Back One Second').back = True
+ self.layout.separator()
+
+
+def time_header_func(self, context):
+ self.layout.operator('sequencerextra.jogshuttle',
+ text='Jog/Shuttle', icon='NDOF_TURN')
+
+
+def clip_header_func(self, context):
+ self.layout.operator('sequencerextra.jogshuttle',
+ text='Jog/Shuttle', icon='NDOF_TURN')
+
+
+def clip_clip_menu_func(self, context):
+ self.layout.operator('clipextra.openactivestrip',
+ text='Open Active Strip')
+ self.layout.operator('clipextra.openfromfilebrowser',
+ text='Open from File Browser')
+ self.layout.separator()
+
+
+def draw_color_balance(layout, color_balance):
+ layout = layout.split(percentage=0.33)
+ col = layout.column()
+ col.label(text="Lift:")
+ col.template_color_picker(color_balance, "lift", value_slider=True, cubic=True)
+ row = col.row()
+ row.prop(color_balance, "lift", text="")
+ row.prop(color_balance, "invert_lift", text="Invert")
+
+ col = layout.column()
+ col.label(text="Gamma:")
+ col.template_color_picker(color_balance, "gamma", value_slider=True,
+ lock_luminosity=True, cubic=True)
+ row = col.row()
+ row.prop(color_balance, "gamma", text="")
+ row.prop(color_balance, "invert_gamma", text="Invert")
+
+ col = layout.column()
+ col.label(text="Gain:")
+ col.template_color_picker(color_balance, "gain", value_slider=True,
+ lock_luminosity=True, cubic=True)
+ row = col.row()
+ row.prop(color_balance, "gain", text="")
+ row.prop(color_balance, "invert_gain", text="Invert")
+
+
+class JumptoCut(Panel):
+ bl_space_type = "SEQUENCE_EDITOR"
+ bl_region_type = "UI"
+ bl_label = "Jump to Cut"
+
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+ _frame_rate_args_prev = None
+ _preset_class = None
+
+ @staticmethod
+ def _draw_framerate_label(*args):
+ # avoids re-creating text string each draw
+ if JumptoCut._frame_rate_args_prev == args:
+ return JumptoCut._frame_rate_ret
+
+ fps, fps_base, preset_label = args
+
+ if fps_base == 1.0:
+ fps_rate = round(fps)
+ else:
+ fps_rate = round(fps / fps_base, 2)
+
+ # TODO: Change the following to iterate over existing presets
+ custom_framerate = (fps_rate not in {23.98, 24, 25, 29.97, 30, 50, 59.94, 60})
+
+ if custom_framerate is True:
+ fps_label_text = "Custom (%r fps)" % fps_rate
+ show_framerate = True
+ else:
+ fps_label_text = "%r fps" % fps_rate
+ show_framerate = (preset_label == "Custom")
+
+ JumptoCut._frame_rate_args_prev = args
+ JumptoCut._frame_rate_ret = args = (fps_label_text, show_framerate)
+ return args
+
+ @staticmethod
+ def draw_framerate(sub, rd):
+ if JumptoCut._preset_class is None:
+ JumptoCut._preset_class = bpy.types.RENDER_MT_framerate_presets
+
+ args = rd.fps, rd.fps_base, JumptoCut._preset_class.bl_label
+ fps_label_text, show_framerate = JumptoCut._draw_framerate_label(*args)
+
+ sub.menu("RENDER_MT_framerate_presets", text=fps_label_text)
+
+ if show_framerate:
+ sub.prop(rd, "fps")
+ sub.prop(rd, "fps_base", text="/")
+
+ @classmethod
+ def poll(self, context):
+ if context.space_data.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
+ scn = context.scene
+ preferences = context.user_preferences
+ prefs = preferences.addons[__package__].preferences
+ if scn and scn.sequence_editor:
+ if prefs.use_jumptocut:
+ return True
+ else:
+ return False
+
+ def draw_header(self, context):
+ layout = self.layout
+ layout.label(text="", icon="RENDER_ANIMATION")
+
+ def draw(self, context):
+ scn = context.scene
+ strip = functions.act_strip(context)
+
+ preferences = context.user_preferences
+ prefs = preferences.addons[__package__].preferences
+
+ layout = self.layout
+ layout = layout.box()
+ # jump to cut main controls
+ col = layout.column(align=True)
+ row = col.row(align=True)
+ split = row.split(percentage=0.33, align=True)
+ box = split.box()
+
+ row = box.row(align=True)
+ row.label(icon='TIME', text="Jump(sec)")
+ row.operator('screenextra.frame_skip',
+ text="", icon='TRIA_LEFT').back = True
+ row.operator('screenextra.frame_skip',
+ text="", icon='TRIA_RIGHT').back = False
+
+ box = split.box()
+ row = box.row(align=True)
+ row.label(icon='IPO_BOUNCE', text="Cuts")
+ row.operator("sequencer.strip_jump", icon="PLAY_REVERSE", text="").next = False
+ row.operator("sequencer.strip_jump", icon='PLAY', text="").next = True
+
+ box = split.box()
+ row = box.row(align=True)
+ row.label(icon='MARKER_HLT', text="Marker")
+ row.operator("screen.marker_jump", icon="TRIA_LEFT", text="").next = False
+ row.operator("screen.marker_jump", icon='TRIA_RIGHT', text="").next = True
+
+ rd = scn.render
+ screen = context.screen
+ row = col.row(align=True)
+ split = row.split(percentage=0.33, align=True)
+ sub_box = split.box()
+ sub_row = sub_box.row(align=True)
+ sub_row.alignment = "CENTER"
+
+ sub_row.operator("screen.frame_jump", text="", icon='REW').end = False
+ sub_row.operator("screen.keyframe_jump", text="", icon='PREV_KEYFRAME').next = False
+
+ if not screen.is_animation_playing:
+ # if using JACK and A/V sync:
+ # hide the play-reversed button
+ # since JACK transport doesn't support reversed playback
+ if scn.sync_mode == 'AUDIO_SYNC' and \
+ context.user_preferences.system.audio_device == 'JACK':
+ sub = sub_row.row(align=True)
+ sub.scale_x = 2.0
+ sub.operator("screen.animation_play", text="", icon='PLAY')
+ else:
+ sub_row.operator("screen.animation_play", text="",
+ icon='PLAY_REVERSE').reverse = True
+ sub_row.operator("screen.animation_play", text="", icon='PLAY')
+ else:
+ sub = sub_row.row(align=True)
+ sub.scale_x = 2.0
+ sub.operator("screen.animation_play", text="", icon="PAUSE")
+ sub_row.operator("screen.keyframe_jump", text="", icon="NEXT_KEYFRAME").next = True
+ sub_row.operator("screen.frame_jump", text="", icon="FF").end = True
+
+ sub_box = split.box()
+ sub_box.prop(scn, "sync_mode", text="")
+ sub_box = split.box()
+ self.draw_framerate(sub_box, rd)
+
+ row = layout.row(align=True)
+ row.operator("sequencer.refresh_all")
+ row.operator("sequencer.rendersize", text="Set Render size")
+
+ row = layout.row(align=True)
+ row.operator("sequencerextra.setstartend", icon="PREVIEW_RANGE", text="IN/OUT")
+ row.operator("timeextra.trimtimelinetoselection",
+ text="Selection", icon="PREVIEW_RANGE")
+ row.operator("timeextra.trimtimeline", text="All", icon="PREVIEW_RANGE")
+
+ layout = self.layout
+
+ # panel setup
+ row = layout.row(align=True)
+ split = row.split(percentage=0.5)
+ sub_row = split.row(align=True)
+ sub_row.prop(prefs, "kr_show_tools", text="Tools", icon='SEQ_SEQUENCER')
+ if prefs.kr_show_tools:
+ sub_row.prop(prefs, "kr_mini_ui", text="Compact UI", toggle=True)
+
+ row = split.row()
+ row = row.split(percentage=0.33)
+ row.prop(prefs, "kr_show_info", text="", icon='VIEWZOOM')
+ row = row.split(percentage=0.5)
+ row.prop(prefs, "kr_extra_info", text="", icon='BORDERMOVE')
+ row = row.split(percentage=1)
+ row.prop(prefs, "kr_show_modifiers", text="", icon='RESTRICT_VIEW_OFF')
+
+ if prefs.kr_show_tools:
+ layout = self.layout
+ layout = layout.box()
+ # snap, handler selector and meta tools
+
+ if prefs.kr_mini_ui:
+ row = layout.row(align=True)
+ row.operator("sequencerextra.extrasnap", text="", icon="SNAP_ON").align = 0
+ row.operator("sequencerextra.extrasnap", text="", icon="SNAP_SURFACE").align = 1
+ row.operator("sequencerextra.extrasnap", text="", icon="SNAP_ON").align = 2
+
+ row.separator()
+ row.operator("sequencerextra.extrahandles", text="", icon="TRIA_LEFT").side = 0
+ row.operator("sequencerextra.extrahandles", text="", icon="PMARKER").side = 1
+ row.operator("sequencerextra.extrahandles", text="", icon="TRIA_RIGHT").side = 2
+
+ row.separator()
+ row.operator("sequencerextra.metacopy", icon="COPYDOWN", text="")
+ row.operator("sequencerextra.metapaste", icon="PASTEDOWN", text="")
+ row.separator()
+ row.operator("sequencerextra.meta_separate_trim", text="", icon="ALIGN")
+ row.separator()
+ row.prop(prefs, "use_io_tools", text="I/O Tools")
+
+ # In / Out tools
+ if prefs.use_io_tools:
+ row = layout.row(align=True)
+ if scn.kr_auto_markers is True:
+ row.prop(scn, "kr_auto_markers", text="", toggle=True, icon="SPACE2")
+
+ row.separator()
+ row.operator("sequencerextra.sourcein", icon="MARKER_HLT", text="")
+ row.prop(scn, "kr_in_marker")
+ row.operator("sequencerextra.sourceout", icon='MARKER_HLT', text="")
+ row.prop(scn, "kr_out_marker")
+ else:
+ row.prop(scn, "kr_auto_markers", text="Auto I/O", toggle=True, icon="SPACE2")
+ row.operator("sequencerextra.sourcein", icon="MARKER_HLT", text="IN")
+ row.operator("sequencerextra.sourceout", icon='MARKER_HLT', text="OUT")
+
+ row.separator()
+ row.operator("sequencerextra.setinout", icon="ARROW_LEFTRIGHT", text="")
+ row.operator("sequencerextra.triminout", icon="FULLSCREEN_EXIT", text="")
+
+ # miniUI extra actions
+ row = layout.row(align=True)
+ row.operator("sequencerextra.jogshuttle",
+ text="", icon="NDOF_TURN")
+ row.operator("sequencerextra.navigateup",
+ text="", icon="FILE_PARENT")
+ row.operator("sequencerextra.extendtofill",
+ text="", icon="STYLUS_PRESSURE")
+ row.operator("sequencerextra.placefromfilebrowser",
+ text="", icon="TRIA_DOWN").insert = False
+ row.operator("sequencerextra.placefromfilebrowser",
+ text="", icon="TRIA_RIGHT").insert = True
+ row.operator("sequencer.slip",
+ text="", icon="MOD_SHRINKWRAP")
+ row.operator_menu_enum("sequencerextra.fadeinout",
+ "mode", text="Fade", icon="MOD_ARRAY")
+ row.operator_menu_enum("sequencerextra.copyproperties",
+ "prop", text="Copy", icon="SCRIPT")
+
+ else:
+ row = layout.row(align=True)
+ row.label("Snap:")
+
+ row.operator("sequencerextra.extrasnap", text="Left", icon="SNAP_ON").align = 0
+ row.operator("sequencerextra.extrasnap", text="Center", icon="SNAP_SURFACE").align = 1
+ row.operator("sequencerextra.extrasnap", text="Right", icon="SNAP_ON").align = 2
+
+ row = layout.row(align=True)
+ row.label("Handlers:")
+ row.operator("sequencerextra.extrahandles",
+ text="Left", icon="TRIA_LEFT").side = 0
+ row.operator("sequencerextra.extrahandles",
+ text="Both", icon="PMARKER").side = 1
+ row.operator("sequencerextra.extrahandles",
+ text="Right", icon="TRIA_RIGHT").side = 2
+
+ box = layout.box()
+ col = box.column_flow(columns=3, align=True)
+ row1 = col.row(align=True)
+ row1.operator("sequencerextra.metacopy", icon="COPYDOWN", text="Meta Copy")
+ row2 = col.row(align=True)
+ row2.operator("sequencerextra.metapaste", icon='PASTEDOWN', text="Paste Snap")
+ row3 = col.row()
+ row3.operator("sequencerextra.meta_separate_trim",
+ text="unMeta & Trim", icon="ALIGN")
+
+ # in /out tools
+ box = layout.box()
+ col = box.column_flow(columns=3, align=True)
+ row1 = col.row(align=True)
+ row1.operator("sequencerextra.sourcein", icon="MARKER_HLT", text="Set IN")
+ row2 = col.row(align=True)
+ row2.operator("sequencerextra.sourceout", icon='MARKER_HLT', text="Set OUT")
+ row3 = col.row()
+ row3.operator("sequencerextra.setinout", icon="ARROW_LEFTRIGHT", text="Selected")
+
+ sub_col = box.split(percentage=0.67, align=True)
+ row4 = sub_col.row(align=True)
+
+ if scn.kr_auto_markers is False:
+ row4.prop(scn, "kr_auto_markers",
+ text="Auto Markers", toggle=True, icon="SPACE2")
+ else:
+ row4.prop(scn, "kr_auto_markers", text="", icon="SPACE2")
+ row4.prop(scn, "kr_in_marker")
+ row4.prop(scn, "kr_out_marker")
+ box4 = row4.box()
+ box4.scale_x = 0.25
+ box4.scale_y = 0.5
+ box4.label(text="", icon="BLANK1")
+
+ row5 = sub_col.row()
+ row5.operator("sequencerextra.triminout", icon="FULLSCREEN_EXIT",
+ text="Trim", emboss=True)
+
+ # UI extra actions
+ box = layout.box()
+ row = box.row(align=True)
+ row.operator("sequencerextra.jogshuttle",
+ text="Jog/Shuttle", icon="NDOF_TURN")
+ row.operator("sequencerextra.navigateup",
+ text="Navigate Up", icon="FILE_PARENT")
+ row.operator("sequencerextra.extendtofill",
+ text="Extend to Fill", icon="STYLUS_PRESSURE")
+
+ row = box.row(align=True)
+ row.operator("sequencerextra.placefromfilebrowser",
+ text="File Place", icon="TRIA_DOWN").insert = False
+ row.operator("sequencerextra.placefromfilebrowser",
+ text="File Insert", icon="TRIA_RIGHT").insert = True
+ row.operator("sequencer.slip",
+ text="Slip", icon="MOD_SHRINKWRAP")
+ row = layout.row(align=True)
+ row.operator_menu_enum("sequencerextra.fadeinout",
+ "mode", text="Fade", icon="MOD_ARRAY")
+ row.operator_menu_enum("sequencerextra.copyproperties",
+ "prop", icon="SCRIPT")
+
+ # INFO boxes
+ if strip is not None:
+ if prefs.kr_show_info:
+ layout = layout.box()
+ row = layout.split(percentage=0.075)
+ row.prop(prefs, "kr_show_info", text="", icon='VIEWZOOM', emboss=True)
+ row = row.split(percentage=0.3)
+ row.prop(strip, "type", text="")
+ row = row.split(percentage=1)
+ row.prop(strip, "name", text="")
+
+ # mute information
+ layout.active = (not strip.mute)
+
+ # basic info
+ row = layout.row()
+ row.prop(strip, "channel")
+ row.prop(strip, "frame_start")
+ row.prop(strip, "frame_final_duration")
+
+ # source info
+ row = layout.split(percentage=0.8)
+
+ if strip.type == 'MOVIE':
+ row.prop(strip, "filepath", text="")
+
+ if strip.type == 'SOUND':
+ # Note: sound strip has a different structure
+ sound = strip.sound
+ if sound is not None:
+ row.prop(sound, "filepath", text="")
+
+ if strip.type == 'IMAGE':
+ row.prop(strip, "directory", text="")
+ # Current element for the filename
+ elem = strip.strip_elem_from_frame(context.scene.frame_current)
+ if elem:
+ row = layout.row()
+ # strip.elements[0] could be a fallback
+ row.prop(elem, "filename", text="File")
+ row.operator("sequencer.change_path", text="change files")
+
+ if strip.type == 'COLOR':
+ row.prop(strip, "color", text="")
+
+ # trim info
+ if strip.type not in {"SPEED", "WIPE", "CROSS", "ADJUSTMENT"}:
+ row = row.split(percentage=1)
+ row.prop(prefs, "kr_show_trim", text="Trim", toggle=True)
+ if prefs.kr_show_trim:
+ box = layout.box()
+ if not isinstance(strip, bpy.types.EffectSequence):
+ row = box.row(align=True)
+ row.label(text="Hard:")
+ row.prop(strip, "animation_offset_start", text="Start")
+ row.prop(strip, "animation_offset_end", text="End")
+ row = box.row(align=True)
+ row.label(text="Soft:")
+ row.prop(strip, "frame_offset_start", text="Start")
+ row.prop(strip, "frame_offset_end", text="End")
+
+ row = layout.row()
+
+ # special strips info
+ if strip.type == 'SPEED':
+ row.prop(strip, "multiply_speed")
+
+ if strip.type in {'CROSS', 'GAMMA_CROSS', 'WIPE',
+ 'ALPHA_OVER', 'ALPHA_UNDER', 'OVER_DROP'}:
+ row.prop(strip, "use_default_fade", "Default Fade")
+ if not strip.use_default_fade:
+ row.prop(strip, "effect_fader", text="Effect fader")
+
+ if strip.type == 'GAUSSIAN_BLUR':
+ row.prop(strip, "size_x")
+ row.prop(strip, "size_y")
+
+ if strip.type == 'WIPE':
+ row = layout.row()
+ row.prop(strip, "transition_type", expand=True)
+ row = layout.row()
+ row.prop(strip, "direction", expand=True)
+ row.prop(strip, "blur_width", slider=True)
+ if strip.transition_type in {'SINGLE', 'DOUBLE'}:
+ row.prop(strip, "angle")
+
+ if strip.type == 'GLOW':
+ flow = layout.column_flow()
+ flow.prop(strip, "threshold", slider=True)
+ flow.prop(strip, "clamp", slider=True)
+ flow.prop(strip, "boost_factor")
+ flow.prop(strip, "blur_radius")
+
+ row = layout.row()
+ row.prop(strip, "quality", slider=True)
+ row.prop(strip, "use_only_boost")
+
+ if strip.type == 'SPEED':
+ row = layout.row()
+ row.prop(strip, "use_default_fade", "Stretch to input strip length")
+ if not strip.use_default_fade:
+ row.prop(strip, "use_as_speed")
+ if strip.use_as_speed:
+ layout.prop(strip, "speed_factor")
+ else:
+ layout.prop(strip, "speed_factor", text="Frame number")
+ layout.prop(strip, "scale_to_length")
+
+ if strip.type == 'TRANSFORM':
+ row = layout.row(align=True)
+ row.prop(strip, "interpolation")
+ row.prop(strip, "translation_unit")
+ row = layout.row(align=True)
+ row.prop(strip, "translate_start_x", text="Pos X")
+ row.prop(strip, "translate_start_y", text="Pos Y")
+
+ row = layout.row(align=True)
+ if strip.use_uniform_scale:
+ row.prop(strip, "scale_start_x", text="Scale")
+ else:
+ row.prop(strip, "scale_start_x", text="Scale X")
+ row.prop(strip, "scale_start_y", text="Scale Y")
+ row = layout.row(align=True)
+ row.prop(strip, "use_uniform_scale")
+ row.prop(strip, "rotation_start", text="Rotation")
+
+ if strip.type == 'MULTICAM':
+ layout.prop(strip, "multicam_source")
+
+ row = layout.row(align=True)
+ sub = row.row(align=True)
+ sub.scale_x = 2.0
+
+ sub.operator("screen.animation_play", text="", icon='PAUSE' if
+ context.screen.is_animation_playing else 'PLAY')
+
+ row.label("Cut To")
+ for i in range(1, strip.channel):
+ row.operator("sequencer.cut_multicam", text="%d" % i).camera = i
+
+ try:
+ if strip.input_count > 0:
+ col = layout.column()
+ col.prop(strip, "input_1")
+ if strip.input_count > 1:
+ col.prop(strip, "input_2")
+ except AttributeError:
+ pass
+
+ # extra info box:
+ if prefs.kr_extra_info:
+ layout = self.layout
+ box = layout.box()
+ if strip.type not in {'SOUND'}:
+ row = box.row(align=True)
+ sub = row.row(align=True)
+ # mute this box
+ box.active = (not strip.mute)
+ sub.prop(prefs, "kr_extra_info", text="", icon='BORDERMOVE', emboss=True)
+ sub.separator()
+ sub.prop(strip, "blend_alpha", text="Opacity", slider=True)
+ row.prop(strip, "mute", toggle=True, icon_only=True)
+ row.prop(strip, "lock", toggle=True, icon_only=True)
+
+ split = box.split(percentage=0.5)
+ left_box = split.box()
+ row = left_box.row()
+ row.prop(strip, "strobe")
+
+ col = left_box.column(align=True)
+ col.separator()
+ col.prop(strip, "use_flip_x", text="Flip X", toggle=True)
+ col.prop(strip, "use_flip_y", text="Flip Y", toggle=True)
+ col.prop(strip, "use_reverse_frames", text="Backwards", toggle=True)
+ col.prop(strip, "use_deinterlace", toggle=True)
+
+ right_box = split.box()
+ col = right_box.column()
+ col.prop(strip, "blend_type", icon='COLOR')
+ col.prop(strip, "alpha_mode")
+
+ col = right_box.column()
+ col.prop(strip, "color_saturation", text="Saturation")
+ col.prop(strip, "color_multiply", text="Multiply")
+ col.prop(strip, "use_float", text="Convert Float")
+
+ row = box.row(align=True)
+ row.prop(strip, "use_translation", text="Image Offset", icon="AXIS_TOP")
+ row.prop(strip, "use_crop", text="Image Crop", icon="BORDER_RECT")
+ if strip.use_translation:
+ row = box.row(align=True)
+ row.prop(strip.transform, "offset_x", text="X")
+ row.prop(strip.transform, "offset_y", text="Y")
+ if strip.use_crop:
+ row = box.row(align=True)
+ row.prop(strip.crop, "max_y")
+ row.prop(strip.crop, "min_x")
+ row.prop(strip.crop, "min_y")
+ row.prop(strip.crop, "max_x")
+
+ else:
+ # sound type
+ row = box.row()
+ row.prop(prefs, "kr_extra_info", text="", icon='BORDERMOVE', emboss=True)
+ sub = row.row(align=True)
+ sub.prop(strip, "volume")
+ sub.prop(strip, "mute", toggle=True, icon_only=True)
+ sub.prop(strip, "lock", toggle=True, icon_only=True)
+
+ sound = strip.sound
+ if sound is not None:
+ row = box.row()
+ if sound.packed_file:
+ row.operator("sound.unpack", icon='PACKAGE', text="Unpack")
+ else:
+ row.operator("sound.pack", icon='UGLYPACKAGE', text="Pack")
+
+ row.prop(sound, "use_memory_cache", toggle=True, icon="DISK_DRIVE")
+
+ row.prop(strip, "show_waveform", toggle=True, icon="RNDCURVE")
+
+ row = box.row(align=True)
+ row.prop(strip, "pitch")
+ row.prop(strip, "pan")
+
+ # modifiers
+ if strip.type != 'SOUND' and prefs.kr_show_modifiers:
+ sequencer = context.scene.sequence_editor
+ layout = self.layout
+ layout = layout.box()
+ # mute this box
+ layout.active = (not strip.mute)
+ row = layout.split(percentage=0.075)
+ row.prop(prefs, "kr_show_modifiers", text="",
+ icon='RESTRICT_VIEW_OFF', emboss=True)
+ row = row.split(percentage=0.40)
+ row.prop(strip, "use_linear_modifiers", text="Linear")
+ row = row.split(percentage=1)
+ row.operator_menu_enum("sequencer.strip_modifier_add", "type")
+
+ for mod in strip.modifiers:
+ box = layout.box()
+
+ row = box.row()
+ row.prop(mod, "show_expanded", text="", emboss=False)
+ row.prop(mod, "name", text="")
+
+ row.prop(mod, "mute", text="")
+
+ sub = row.row(align=True)
+ props = sub.operator("sequencer.strip_modifier_move", text="", icon='TRIA_UP')
+ props.name = mod.name
+ props.direction = 'UP'
+ props = sub.operator("sequencer.strip_modifier_move", text="", icon='TRIA_DOWN')
+ props.name = mod.name
+ props.direction = 'DOWN'
+
+ row.operator("sequencer.strip_modifier_remove", text="", icon='X',
+ emboss=False).name = mod.name
+
+ if mod.show_expanded:
+ row = box.row()
+ row.prop(mod, "input_mask_type", expand=True)
+
+ if mod.input_mask_type == 'STRIP':
+ sequences_object = sequencer
+ if sequencer.meta_stack:
+ sequences_object = sequencer.meta_stack[-1]
+ box.prop_search(mod, "input_mask_strip",
+ sequences_object, "sequences", text="Mask")
+ else:
+ box.prop(mod, "input_mask_id")
+ row = box.row()
+ row.prop(mod, "mask_time", expand=True)
+
+ if mod.type == 'COLOR_BALANCE':
+ box.prop(mod, "color_multiply")
+ draw_color_balance(box, mod.color_balance)
+ elif mod.type == 'CURVES':
+ box.template_curve_mapping(mod, "curve_mapping", type='COLOR')
+ elif mod.type == 'HUE_CORRECT':
+ box.template_curve_mapping(mod, "curve_mapping", type='HUE')
+ elif mod.type == 'BRIGHT_CONTRAST':
+ col = box.column()
+ col.prop(mod, "bright")
+ col.prop(mod, "contrast")
+ elif mod.type == 'WHITE_BALANCE':
+ col = box.column()
+ col.prop(mod, "white_value")
+ elif mod.type == 'TONEMAP':
+ col = box.column()
+ col.prop(mod, "tonemap_type")
+ if mod.tonemap_type == 'RD_PHOTORECEPTOR':
+ col.prop(mod, "intensity")
+ col.prop(mod, "contrast")
+ col.prop(mod, "adaptation")
+ col.prop(mod, "correction")
+ elif mod.tonemap_type == 'RH_SIMPLE':
+ col.prop(mod, "key")
+ col.prop(mod, "offset")
+ col.prop(mod, "gamma")
+
+ if "copy_modifiers" in dir(bpy.ops.sequencer):
+ row = layout.row(align=True)
+ row.operator("sequencer.copy_modifiers",
+ text="Copy Modifiers", icon='COPYDOWN')
+ row.operator("sequencer.paste_modifiers",
+ text="Paste Modifiers", icon='PASTEDOWN')