2023-08-16 00:20:26 +10:00
|
|
|
# SPDX-FileCopyrightText: 2009-2023 Blender Authors
|
2023-06-15 13:09:04 +10:00
|
|
|
#
|
2022-02-11 09:07:11 +11:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2023-06-15 13:09:04 +10:00
|
|
|
|
2009-06-08 16:48:12 +00:00
|
|
|
import bpy
|
2019-05-19 20:44:28 +10:00
|
|
|
from bpy.types import (
|
|
|
|
|
Header,
|
|
|
|
|
Menu,
|
|
|
|
|
Panel,
|
|
|
|
|
)
|
|
|
|
|
from bpy.app.translations import (
|
|
|
|
|
contexts as i18n_contexts,
|
2025-06-30 20:31:55 +02:00
|
|
|
pgettext_iface as iface_,
|
2024-01-11 19:49:03 +01:00
|
|
|
pgettext_rpt as rpt_,
|
2019-05-19 20:44:28 +10:00
|
|
|
)
|
2019-06-11 16:08:32 +10:00
|
|
|
from bl_ui.properties_grease_pencil_common import (
|
2018-08-22 16:59:04 +02:00
|
|
|
AnnotationDataPanel,
|
2020-04-18 10:47:25 +02:00
|
|
|
AnnotationOnionSkin,
|
2017-10-09 13:47:05 +11:00
|
|
|
)
|
2020-01-22 14:54:44 +01:00
|
|
|
from bl_ui.space_toolsystem_common import (
|
|
|
|
|
ToolActivePanelHelper,
|
2025-06-01 15:11:51 +10:00
|
|
|
)
|
|
|
|
|
from bl_ui.utils import (
|
2025-05-22 10:17:19 +02:00
|
|
|
PlayheadSnappingPanel,
|
2020-01-22 14:54:44 +01:00
|
|
|
)
|
2025-06-01 15:11:51 +10:00
|
|
|
|
2019-05-19 20:44:28 +10:00
|
|
|
from rna_prop_ui import PropertyPanel
|
2025-06-19 15:54:53 +02:00
|
|
|
from bl_ui.space_time import playback_controls
|
2013-02-10 09:09:26 +00:00
|
|
|
|
2010-05-16 12:15:04 +00:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
def _space_view_types(st):
|
|
|
|
|
view_type = st.view_type
|
|
|
|
|
return (
|
|
|
|
|
view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'},
|
2021-11-30 11:09:58 +01:00
|
|
|
view_type == 'PREVIEW',
|
2021-10-28 14:31:17 +11:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
def selected_strips_count(context):
|
2025-01-21 11:30:20 +01:00
|
|
|
selected_strips = getattr(context, "selected_strips", None)
|
2025-01-16 01:40:36 +01:00
|
|
|
if selected_strips is None:
|
|
|
|
|
return 0, 0
|
|
|
|
|
|
|
|
|
|
total_count = len(selected_strips)
|
|
|
|
|
nonsound_count = sum(1 for strip in selected_strips if strip.type != 'SOUND')
|
|
|
|
|
|
|
|
|
|
return total_count, nonsound_count
|
2018-11-09 11:53:09 +01:00
|
|
|
|
|
|
|
|
|
2012-08-19 15:41:56 +00:00
|
|
|
def draw_color_balance(layout, color_balance):
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2021-09-30 21:09:47 +02:00
|
|
|
layout.prop(color_balance, "correction_method")
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False)
|
2024-08-01 11:28:58 +02:00
|
|
|
flow.use_property_split = False
|
2021-09-30 21:09:47 +02:00
|
|
|
|
|
|
|
|
if color_balance.correction_method == 'LIFT_GAMMA_GAIN':
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2024-07-31 14:07:22 +02:00
|
|
|
col.label(text="Lift")
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "lift", text="")
|
|
|
|
|
col.prop(color_balance, "invert_lift", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "lift", value_slider=True, cubic=True)
|
|
|
|
|
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2024-07-31 14:07:22 +02:00
|
|
|
col.label(text="Gamma")
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "gamma", text="")
|
|
|
|
|
col.prop(color_balance, "invert_gamma", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "gamma", value_slider=True, lock_luminosity=True, cubic=True)
|
|
|
|
|
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2024-07-31 14:07:22 +02:00
|
|
|
col.label(text="Gain")
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "gain", text="")
|
|
|
|
|
col.prop(color_balance, "invert_gain", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True)
|
|
|
|
|
|
|
|
|
|
elif color_balance.correction_method == 'OFFSET_POWER_SLOPE':
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2024-07-31 14:07:22 +02:00
|
|
|
col.label(text="Offset")
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "offset", text="")
|
|
|
|
|
col.prop(color_balance, "invert_offset", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "offset", value_slider=True, cubic=True)
|
|
|
|
|
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2025-01-03 16:34:47 +01:00
|
|
|
col.label(text="Power", text_ctxt=i18n_contexts.id_movieclip)
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "power", text="")
|
|
|
|
|
col.prop(color_balance, "invert_power", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "power", value_slider=True, cubic=True)
|
|
|
|
|
|
|
|
|
|
col = flow.column()
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.35)
|
|
|
|
|
col = split.column(align=True)
|
2024-07-31 14:07:22 +02:00
|
|
|
col.label(text="Slope")
|
2021-09-30 21:09:47 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.separator()
|
|
|
|
|
col.prop(color_balance, "slope", text="")
|
|
|
|
|
col.prop(color_balance, "invert_slope", text="Invert", icon='ARROW_LEFTRIGHT')
|
|
|
|
|
split.template_color_picker(color_balance, "slope", value_slider=True, cubic=True)
|
2012-08-19 15:41:56 +00:00
|
|
|
|
|
|
|
|
|
2020-01-22 14:54:44 +01:00
|
|
|
class SEQUENCER_PT_active_tool(ToolActivePanelHelper, Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
|
|
|
|
bl_category = "Tool"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_HT_tool_header(Header):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'TOOL_HEADER'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2022-03-04 11:03:36 +11:00
|
|
|
# layout = self.layout
|
2020-01-22 14:54:44 +01:00
|
|
|
|
|
|
|
|
self.draw_tool_settings(context)
|
|
|
|
|
|
|
|
|
|
# TODO: options popover.
|
|
|
|
|
|
|
|
|
|
def draw_tool_settings(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
# Active Tool
|
|
|
|
|
# -----------
|
|
|
|
|
from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
|
2021-03-22 21:55:30 +11:00
|
|
|
# Most callers assign the `tool` & `tool_mode`, currently the result is not used.
|
|
|
|
|
"""
|
2020-01-22 14:54:44 +01:00
|
|
|
tool = ToolSelectPanelHelper.draw_active_tool_header(context, layout)
|
|
|
|
|
tool_mode = context.mode if tool is None else tool.mode
|
2021-03-22 21:55:30 +11:00
|
|
|
"""
|
|
|
|
|
# Only draw the header.
|
|
|
|
|
ToolSelectPanelHelper.draw_active_tool_header(context, layout)
|
2020-01-22 14:54:44 +01:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_HT_header(Header):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
|
|
|
|
|
2021-09-28 14:44:36 +10:00
|
|
|
layout.template_header()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2018-05-01 18:47:26 +02:00
|
|
|
layout.prop(st, "view_type", text="")
|
|
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
SEQUENCER_MT_editor_menus.draw_collapsible(context, layout)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2021-01-10 16:37:18 +01:00
|
|
|
layout.separator_spacer()
|
2019-08-24 00:24:43 +02:00
|
|
|
|
2021-09-21 09:38:30 +02:00
|
|
|
tool_settings = context.tool_settings
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
sequencer_tool_settings = tool_settings.sequencer_tool_settings if tool_settings else None
|
2021-09-21 09:38:30 +02:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if st.view_type == 'SEQUENCER':
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.template_ID(context.workspace, "sequencer_scene", new="scene.new_sequencer_scene")
|
|
|
|
|
|
|
|
|
|
if sequencer_tool_settings and st.view_type == 'PREVIEW':
|
2021-09-21 09:38:30 +02:00
|
|
|
layout.prop(sequencer_tool_settings, "pivot_point", text="", icon_only=True)
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if sequencer_tool_settings and st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
|
2021-08-27 12:59:46 +02:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.prop(sequencer_tool_settings, "overlap_mode", text="")
|
2021-10-01 23:22:04 +02:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if tool_settings:
|
2025-08-05 09:01:56 +02:00
|
|
|
row = layout.row(align=True)
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
row.prop(tool_settings, "use_snap_sequencer", text="")
|
2025-08-05 09:01:56 +02:00
|
|
|
sub = row.row(align=True)
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
sub.popover(panel="SEQUENCER_PT_snapping")
|
|
|
|
|
if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.prop(tool_settings, "use_snap_playhead", text="")
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.popover(panel="SEQUENCER_PT_playhead_snapping", text="")
|
2024-07-06 15:24:52 +02:00
|
|
|
layout.separator_spacer()
|
2021-06-29 20:12:19 +02:00
|
|
|
|
2021-08-08 13:30:30 -04:00
|
|
|
if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}:
|
|
|
|
|
layout.prop(st, "display_mode", text="", icon_only=True)
|
|
|
|
|
layout.prop(st, "preview_channels", text="", icon_only=True)
|
|
|
|
|
|
2021-10-08 17:07:56 +11:00
|
|
|
# Gizmo toggle & popover.
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
|
# FIXME: place-holder icon.
|
|
|
|
|
row.prop(st, "show_gizmo", text="", toggle=True, icon='GIZMO')
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.active = st.show_gizmo
|
|
|
|
|
sub.popover(
|
|
|
|
|
panel="SEQUENCER_PT_gizmo_display",
|
|
|
|
|
text="",
|
|
|
|
|
)
|
|
|
|
|
|
2020-12-15 23:15:32 +01:00
|
|
|
row = layout.row(align=True)
|
2021-10-18 15:47:28 +11:00
|
|
|
row.prop(st, "show_overlays", text="", icon='OVERLAY')
|
2020-12-15 23:15:32 +01:00
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.popover(panel="SEQUENCER_PT_overlay", text="")
|
2021-10-18 15:47:28 +11:00
|
|
|
sub.active = st.show_overlays
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
|
2025-06-19 15:54:53 +02:00
|
|
|
class SEQUENCER_HT_playback_controls(Header):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'FOOTER'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
playback_controls(layout, context)
|
|
|
|
|
|
|
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
class SEQUENCER_MT_editor_menus(Menu):
|
|
|
|
|
bl_idname = "SEQUENCER_MT_editor_menus"
|
|
|
|
|
bl_label = ""
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2018-12-20 12:02:21 +11:00
|
|
|
layout = self.layout
|
2014-01-27 18:38:53 +11:00
|
|
|
st = context.space_data
|
2021-10-28 14:31:17 +11:00
|
|
|
has_sequencer, _has_preview = _space_view_types(st)
|
2014-01-27 18:38:53 +11:00
|
|
|
|
|
|
|
|
layout.menu("SEQUENCER_MT_view")
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.menu("SEQUENCER_MT_select")
|
2014-01-27 18:38:53 +11:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if has_sequencer and context.sequencer_scene:
|
2019-11-30 17:03:22 +11:00
|
|
|
if st.show_markers:
|
|
|
|
|
layout.menu("SEQUENCER_MT_marker")
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("SEQUENCER_MT_add")
|
2021-10-28 14:31:17 +11:00
|
|
|
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip")
|
2014-01-27 18:38:53 +11:00
|
|
|
|
2021-11-30 11:09:58 +01:00
|
|
|
if st.view_type in {'SEQUENCER', 'PREVIEW'}:
|
|
|
|
|
layout.menu("SEQUENCER_MT_image")
|
2021-10-25 22:19:04 -04:00
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
|
2021-10-08 17:07:56 +11:00
|
|
|
class SEQUENCER_PT_gizmo_display(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
2021-11-09 11:42:15 -05:00
|
|
|
bl_label = "Gizmos"
|
2021-10-08 17:07:56 +11:00
|
|
|
bl_ui_units_x = 8
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.label(text="Viewport Gizmos")
|
|
|
|
|
col.separator()
|
|
|
|
|
|
|
|
|
|
col.active = st.show_gizmo
|
|
|
|
|
colsub = col.column()
|
|
|
|
|
colsub.prop(st, "show_gizmo_navigate", text="Navigate")
|
|
|
|
|
colsub.prop(st, "show_gizmo_tool", text="Active Tools")
|
|
|
|
|
# colsub.prop(st, "show_gizmo_context", text="Active Object") # Currently unused.
|
|
|
|
|
|
|
|
|
|
|
2020-12-15 23:15:32 +01:00
|
|
|
class SEQUENCER_PT_overlay(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_label = "Overlays"
|
2024-05-13 12:25:35 +02:00
|
|
|
bl_ui_units_x = 13
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_preview_overlay(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
2023-09-29 14:32:54 +10:00
|
|
|
bl_parent_id = "SEQUENCER_PT_overlay"
|
2020-12-15 23:15:32 +01:00
|
|
|
bl_label = "Preview Overlays"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'} and context.sequencer_scene
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2020-12-15 23:15:32 +01:00
|
|
|
st = context.space_data
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = st.preview_overlay
|
2020-12-15 23:15:32 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2024-06-03 16:38:47 +02:00
|
|
|
layout.active = st.show_overlays and st.display_mode == 'IMAGE'
|
|
|
|
|
|
|
|
|
|
split = layout.column().split()
|
|
|
|
|
col = split.column()
|
|
|
|
|
col.prop(overlay_settings, "show_image_outline")
|
|
|
|
|
col.prop(ed, "show_overlay_frame", text="Frame Overlay")
|
|
|
|
|
col.prop(overlay_settings, "show_metadata", text="Metadata")
|
|
|
|
|
|
|
|
|
|
col = split.column()
|
|
|
|
|
col.prop(overlay_settings, "show_cursor")
|
|
|
|
|
col.prop(overlay_settings, "show_safe_areas", text="Safe Areas")
|
|
|
|
|
col.prop(overlay_settings, "show_annotation", text="Annotations")
|
2020-12-16 18:02:40 +11:00
|
|
|
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
class SEQUENCER_PT_sequencer_overlay(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
2023-09-29 14:32:54 +10:00
|
|
|
bl_parent_id = "SEQUENCER_PT_overlay"
|
2020-12-15 23:15:32 +01:00
|
|
|
bl_label = "Sequencer Overlays"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
return st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
st = context.space_data
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = st.timeline_overlay
|
2020-12-15 23:15:32 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2021-10-18 15:47:28 +11:00
|
|
|
layout.active = st.show_overlays
|
2024-05-13 12:25:35 +02:00
|
|
|
split = layout.column().split()
|
2020-12-15 23:15:32 +01:00
|
|
|
|
2024-05-13 12:25:35 +02:00
|
|
|
col = split.column()
|
|
|
|
|
col.prop(overlay_settings, "show_grid", text="Grid")
|
2020-12-15 23:15:32 +01:00
|
|
|
|
2024-05-13 12:25:35 +02:00
|
|
|
col = split.column()
|
|
|
|
|
col.prop(st.cache_overlay, "show_cache", text="Cache")
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
|
2024-05-13 12:25:35 +02:00
|
|
|
class SEQUENCER_PT_sequencer_overlay_strips(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_overlay"
|
|
|
|
|
bl_label = "Strips"
|
|
|
|
|
|
2024-06-03 16:38:47 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
return st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
2024-05-13 12:25:35 +02:00
|
|
|
def draw(self, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
overlay_settings = st.timeline_overlay
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.active = st.show_overlays
|
|
|
|
|
split = layout.column().split()
|
|
|
|
|
|
|
|
|
|
col = split.column()
|
|
|
|
|
col.prop(overlay_settings, "show_strip_name", text="Name")
|
|
|
|
|
col.prop(overlay_settings, "show_strip_source", text="Source")
|
|
|
|
|
col.prop(overlay_settings, "show_strip_duration", text="Duration")
|
|
|
|
|
col.prop(overlay_settings, "show_fcurves", text="Animation Curves")
|
|
|
|
|
|
|
|
|
|
col = split.column()
|
|
|
|
|
col.prop(overlay_settings, "show_thumbnails", text="Thumbnails")
|
|
|
|
|
col.prop(overlay_settings, "show_strip_tag_color", text="Color Tags")
|
|
|
|
|
col.prop(overlay_settings, "show_strip_offset", text="Offsets")
|
|
|
|
|
col.prop(overlay_settings, "show_strip_retiming", text="Retiming")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_sequencer_overlay_waveforms(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_overlay"
|
|
|
|
|
bl_label = "Waveforms"
|
|
|
|
|
|
2024-06-03 16:38:47 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
return st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
2024-05-13 12:25:35 +02:00
|
|
|
def draw(self, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
overlay_settings = st.timeline_overlay
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.active = st.show_overlays
|
2020-12-15 23:15:32 +01:00
|
|
|
|
2023-12-19 18:49:28 +01:00
|
|
|
layout.row().prop(overlay_settings, "waveform_display_type", expand=True)
|
2024-05-13 12:25:35 +02:00
|
|
|
|
|
|
|
|
row = layout.row()
|
|
|
|
|
row.prop(overlay_settings, "waveform_display_style", expand=True)
|
|
|
|
|
row.active = overlay_settings.waveform_display_type != 'NO_WAVEFORMS'
|
2020-12-15 23:15:32 +01:00
|
|
|
|
|
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
class SEQUENCER_MT_range(Menu):
|
|
|
|
|
bl_label = "Range"
|
|
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-20 18:04:35 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2019-05-22 00:27:01 +10:00
|
|
|
layout.operator("anim.previewrange_set", text="Set Preview Range")
|
2019-11-02 22:53:39 -07:00
|
|
|
layout.operator("sequencer.set_range_to_strips", text="Set Preview Range to Strips").preview = True
|
2019-05-22 00:27:01 +10:00
|
|
|
layout.operator("anim.previewrange_clear", text="Clear Preview Range")
|
2019-05-20 18:04:35 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-22 00:27:01 +10:00
|
|
|
layout.operator("anim.start_frame_set", text="Set Start Frame")
|
|
|
|
|
layout.operator("anim.end_frame_set", text="Set End Frame")
|
2019-11-02 22:53:39 -07:00
|
|
|
layout.operator("sequencer.set_range_to_strips", text="Set Frame Range to Strips")
|
2019-05-20 18:04:35 +02:00
|
|
|
|
|
|
|
|
|
2019-08-09 15:35:42 +02:00
|
|
|
class SEQUENCER_MT_preview_zoom(Menu):
|
2024-04-26 21:35:49 +02:00
|
|
|
bl_label = "Zoom"
|
2019-08-09 15:35:42 +02:00
|
|
|
|
2024-04-27 14:54:14 +10:00
|
|
|
def draw(self, context):
|
2019-08-09 15:35:42 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
2024-04-26 21:35:49 +02:00
|
|
|
from math import isclose
|
2019-08-09 15:35:42 +02:00
|
|
|
|
2024-04-27 14:54:14 +10:00
|
|
|
current_zoom = context.space_data.zoom_percentage
|
2019-08-09 15:35:42 +02:00
|
|
|
ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1))
|
|
|
|
|
|
2024-04-27 14:54:14 +10:00
|
|
|
for (a, b) in ratios:
|
|
|
|
|
ratio = a / b
|
|
|
|
|
percent = ratio * 100.0
|
2019-08-09 15:35:42 +02:00
|
|
|
|
|
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.view_zoom_ratio",
|
2024-04-27 16:02:36 +10:00
|
|
|
text="{:g}% ({:d}:{:d})".format(percent, a, b),
|
2019-08-09 15:35:42 +02:00
|
|
|
translate=False,
|
2024-04-27 14:54:14 +10:00
|
|
|
icon='LAYER_ACTIVE' if isclose(percent, current_zoom, abs_tol=0.5) else 'NONE',
|
|
|
|
|
).ratio = ratio
|
2024-04-26 21:35:49 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("view2d.zoom_in")
|
|
|
|
|
layout.operator("view2d.zoom_out")
|
|
|
|
|
layout.operator("view2d.zoom_border", text="Zoom Region...")
|
2019-08-09 15:35:42 +02:00
|
|
|
|
|
|
|
|
|
2020-06-01 05:32:36 +02:00
|
|
|
class SEQUENCER_MT_proxy(Menu):
|
|
|
|
|
bl_label = "Proxy"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
st = context.space_data
|
2025-01-16 01:40:36 +01:00
|
|
|
_, nonsound = selected_strips_count(context)
|
|
|
|
|
|
2020-06-01 05:32:36 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.enable_proxies", text="Setup")
|
|
|
|
|
col.operator("sequencer.rebuild_proxy", text="Rebuild")
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = nonsound >= 1
|
2020-06-01 05:32:36 +02:00
|
|
|
layout.prop(st, "proxy_render_size", text="")
|
|
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_MT_view(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
2014-12-18 13:47:04 +01:00
|
|
|
is_preview = st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
is_sequencer_view = st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
2024-12-05 09:20:15 +01:00
|
|
|
is_sequencer_only = st.view_type == 'SEQUENCER'
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-12-18 13:47:04 +01:00
|
|
|
if st.view_type == 'PREVIEW':
|
2012-09-21 13:29:38 +00:00
|
|
|
# Specifying the REGION_PREVIEW context is needed in preview-only
|
|
|
|
|
# mode, else the lookup for the shortcut will fail in
|
2023-02-12 14:37:16 +11:00
|
|
|
# wm_keymap_item_find_props() (see #32595).
|
2012-09-21 13:29:38 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.prop(st, "show_region_toolbar")
|
2019-04-18 12:16:03 +02:00
|
|
|
layout.prop(st, "show_region_ui")
|
2021-10-15 23:35:49 +02:00
|
|
|
layout.prop(st, "show_region_tool_header")
|
2012-09-21 13:29:38 +00:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2020-01-22 02:07:54 +01:00
|
|
|
if is_sequencer_view:
|
|
|
|
|
layout.prop(st, "show_region_hud")
|
2024-12-05 09:20:15 +01:00
|
|
|
if is_sequencer_only:
|
2022-04-04 12:52:48 +02:00
|
|
|
layout.prop(st, "show_region_channels")
|
2025-06-19 15:54:53 +02:00
|
|
|
layout.prop(st, "show_region_footer")
|
2021-03-20 01:21:07 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
2025-04-30 14:10:40 +02:00
|
|
|
if is_preview:
|
2021-03-20 01:21:07 +01:00
|
|
|
layout.prop(st, "show_transform_preview", text="Preview During Transform")
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.separator()
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
layout.operator("sequencer.refresh_all", icon='FILE_REFRESH', text="Refresh All")
|
|
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2010-07-30 14:56:17 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2022-04-21 00:38:39 +02:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
if st.view_type == 'PREVIEW':
|
2023-02-12 14:37:16 +11:00
|
|
|
# See above (#32595)
|
2022-04-21 00:38:39 +02:00
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
layout.operator("sequencer.view_selected", text="Frame Selected")
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if is_sequencer_view and context.sequencer_scene:
|
2015-09-10 15:31:37 +10:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2020-05-12 15:44:59 +02:00
|
|
|
layout.operator("sequencer.view_all")
|
2025-01-14 12:46:40 +11:00
|
|
|
layout.operator(
|
|
|
|
|
"anim.scene_range_frame",
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
text="Frame Preview Range" if context.sequencer_scene.use_preview_range else "Frame Scene Range",
|
2025-01-14 12:46:40 +11:00
|
|
|
)
|
2023-05-19 00:44:48 +02:00
|
|
|
layout.operator("sequencer.view_frame")
|
2022-04-29 09:43:03 +10:00
|
|
|
layout.prop(st, "use_clamp_view")
|
2019-05-20 18:04:35 +02:00
|
|
|
|
2019-08-09 15:35:42 +02:00
|
|
|
if is_preview:
|
2024-01-23 12:11:22 +01:00
|
|
|
if is_sequencer_view:
|
|
|
|
|
layout.separator()
|
2019-08-09 15:35:42 +02:00
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
layout.operator("sequencer.view_all_preview", text="Fit Preview in Window")
|
2019-08-10 00:21:47 +10:00
|
|
|
if is_sequencer_view:
|
2024-04-26 21:35:49 +02:00
|
|
|
layout.menu("SEQUENCER_MT_preview_zoom", text="Preview Zoom")
|
2019-08-10 00:21:47 +10:00
|
|
|
else:
|
2019-08-09 15:35:42 +02:00
|
|
|
layout.menu("SEQUENCER_MT_preview_zoom")
|
2024-04-26 21:35:49 +02:00
|
|
|
layout.prop(st, "use_zoom_to_fit", text="Auto Zoom")
|
2020-06-01 05:32:36 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_proxy")
|
2019-08-09 15:35:42 +02:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.separator()
|
2019-08-09 15:35:42 +02:00
|
|
|
|
|
|
|
|
if is_sequencer_view:
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.separator()
|
2019-05-18 10:05:13 +02:00
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.prop(st, "show_markers")
|
|
|
|
|
layout.prop(st, "show_seconds")
|
|
|
|
|
layout.prop(st, "show_locked_time")
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2015-09-10 15:31:37 +10:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2019-05-18 10:05:13 +02:00
|
|
|
layout.menu("SEQUENCER_MT_navigation")
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.menu("SEQUENCER_MT_range")
|
2019-05-18 10:05:13 +02:00
|
|
|
layout.separator()
|
2020-05-28 12:23:11 -04:00
|
|
|
|
2019-03-19 21:41:12 +01:00
|
|
|
layout.operator("render.opengl", text="Sequence Render Image", icon='RENDER_STILL').sequencer = True
|
2018-11-05 15:12:27 +01:00
|
|
|
props = layout.operator("render.opengl", text="Sequence Render Animation", icon='RENDER_ANIMATION')
|
2018-10-08 19:10:10 +02:00
|
|
|
props.animation = True
|
|
|
|
|
props.sequencer = True
|
2019-08-09 14:08:20 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.operator("sequencer.export_subtitles", text="Export Subtitles", icon='EXPORT')
|
2018-11-05 15:12:27 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
2020-06-11 16:05:40 +10:00
|
|
|
# Note that the context is needed for the shortcut to display properly.
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW' if is_preview else 'INVOKE_REGION_WIN'
|
|
|
|
|
props = layout.operator(
|
|
|
|
|
"wm.context_toggle_enum",
|
|
|
|
|
text="Toggle Sequencer/Preview",
|
|
|
|
|
icon='SEQ_SEQUENCER' if is_preview else 'SEQ_PREVIEW',
|
|
|
|
|
)
|
|
|
|
|
props.data_path = "space_data.view_type"
|
|
|
|
|
props.value_1 = 'SEQUENCER'
|
|
|
|
|
props.value_2 = 'PREVIEW'
|
|
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2018-05-24 18:35:19 +02:00
|
|
|
layout.menu("INFO_MT_area")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
class SEQUENCER_MT_select_handle(Menu):
|
|
|
|
|
bl_label = "Select Handle"
|
|
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-20 18:04:35 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.operator("sequencer.select_handles", text="Both").side = 'BOTH'
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("sequencer.select_handles", text="Left").side = 'LEFT'
|
|
|
|
|
layout.operator("sequencer.select_handles", text="Right").side = 'RIGHT'
|
|
|
|
|
|
2020-12-20 06:23:08 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.select_handles", text="Both Neighbors").side = 'BOTH_NEIGHBORS'
|
|
|
|
|
layout.operator("sequencer.select_handles", text="Left Neighbor").side = 'LEFT_NEIGHBOR'
|
|
|
|
|
layout.operator("sequencer.select_handles", text="Right Neighbor").side = 'RIGHT_NEIGHBOR'
|
2019-05-20 18:04:35 +02:00
|
|
|
|
2021-07-06 12:05:27 +10:00
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
class SEQUENCER_MT_select_channel(Menu):
|
|
|
|
|
bl_label = "Select Channel"
|
|
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-20 18:04:35 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2019-11-01 08:39:03 +11:00
|
|
|
layout.operator("sequencer.select_side", text="Left").side = 'LEFT'
|
|
|
|
|
layout.operator("sequencer.select_side", text="Right").side = 'RIGHT'
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.select_side", text="Both Sides").side = 'BOTH'
|
2019-05-20 18:04:35 +02:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_MT_select(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
def draw(self, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2025-01-21 23:30:55 +11:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
st = context.space_data
|
2024-06-26 05:54:28 +02:00
|
|
|
has_sequencer, has_preview = _space_view_types(st)
|
2025-01-21 23:30:55 +11:00
|
|
|
is_retiming = (
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
context.sequencer_scene and
|
|
|
|
|
context.sequencer_scene.sequence_editor is not None and
|
|
|
|
|
context.sequencer_scene.sequence_editor.selected_retiming_keys
|
2025-01-21 23:30:55 +11:00
|
|
|
)
|
2025-05-03 02:20:56 +02:00
|
|
|
if has_preview:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
else:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2024-07-17 13:12:43 +02:00
|
|
|
layout.operator("sequencer.select_all", text="All").action = 'SELECT'
|
2018-07-03 15:44:56 +02:00
|
|
|
layout.operator("sequencer.select_all", text="None").action = 'DESELECT'
|
|
|
|
|
layout.operator("sequencer.select_all", text="Invert").action = 'INVERT'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
col = layout.column()
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_sequencer:
|
2024-06-26 05:54:28 +02:00
|
|
|
col.operator("sequencer.select_box", text="Box Select")
|
2023-10-04 19:27:28 +02:00
|
|
|
props = col.operator("sequencer.select_box", text="Box Select (Include Handles)")
|
2021-10-28 14:31:17 +11:00
|
|
|
props.include_handles = True
|
2024-06-26 05:54:28 +02:00
|
|
|
elif has_preview:
|
|
|
|
|
col.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
col.operator("sequencer.select_box", text="Box Select")
|
2019-05-18 01:11:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
col.separator()
|
2019-05-18 01:11:45 +02:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_sequencer:
|
2024-05-13 16:27:23 +02:00
|
|
|
col.operator("sequencer.select_more", text="More")
|
|
|
|
|
col.operator("sequencer.select_less", text="Less")
|
2023-10-04 19:27:28 +02:00
|
|
|
col.separator()
|
2014-09-17 18:36:17 +10:00
|
|
|
|
2024-05-13 16:27:23 +02:00
|
|
|
col.operator_menu_enum("sequencer.select_grouped", "type", text="Select Grouped")
|
2023-10-04 19:27:28 +02:00
|
|
|
col.enabled = not is_retiming
|
2024-05-13 16:27:23 +02:00
|
|
|
if has_sequencer:
|
|
|
|
|
col.operator("sequencer.select_linked", text="Select Linked")
|
|
|
|
|
col.separator()
|
|
|
|
|
|
|
|
|
|
if has_sequencer:
|
|
|
|
|
col.operator_menu_enum("sequencer.select_side_of_frame", "side", text="Side of Frame...")
|
|
|
|
|
col.menu("SEQUENCER_MT_select_handle", text="Handle")
|
|
|
|
|
col.menu("SEQUENCER_MT_select_channel", text="Channel")
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_MT_marker(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Marker"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
2018-11-05 15:11:18 +01:00
|
|
|
st = context.space_data
|
|
|
|
|
is_sequencer_view = st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
2019-06-11 16:08:32 +10:00
|
|
|
from bl_ui.space_time import marker_menu_generic
|
2019-03-13 11:52:54 +11:00
|
|
|
marker_menu_generic(layout, context)
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2018-11-05 15:11:18 +01:00
|
|
|
if is_sequencer_view:
|
|
|
|
|
layout.prop(st, "use_marker_sync")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
|
2019-01-15 18:33:37 +01:00
|
|
|
class SEQUENCER_MT_change(Menu):
|
|
|
|
|
bl_label = "Change"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-01-15 18:33:37 +01:00
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2022-05-16 19:41:50 +02:00
|
|
|
if strip and strip.type == 'SCENE':
|
|
|
|
|
bpy_data_scenes_len = len(bpy.data.scenes)
|
|
|
|
|
if bpy_data_scenes_len > 10:
|
|
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
|
|
|
layout.operator("sequencer.change_scene", text="Change Scene...")
|
|
|
|
|
elif bpy_data_scenes_len > 1:
|
|
|
|
|
layout.operator_menu_enum("sequencer.change_scene", "scene", text="Change Scene")
|
|
|
|
|
del bpy_data_scenes_len
|
2019-01-15 18:33:37 +01:00
|
|
|
|
2022-05-16 19:41:50 +02:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2025-07-05 01:34:24 +02:00
|
|
|
if strip and strip.type in {
|
2025-06-20 23:55:59 +02:00
|
|
|
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
|
|
|
|
|
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
|
|
|
|
|
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
|
|
|
|
|
'GAUSSIAN_BLUR',
|
|
|
|
|
}:
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_effect_change")
|
|
|
|
|
layout.operator("sequencer.swap_inputs")
|
2023-04-13 13:14:01 +10:00
|
|
|
props = layout.operator("sequencer.change_path", text="Path/Files")
|
2019-01-15 18:33:37 +01:00
|
|
|
|
|
|
|
|
if strip:
|
2019-06-22 11:02:33 +10:00
|
|
|
strip_type = strip.type
|
2019-01-15 18:33:37 +01:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type == 'IMAGE':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_image = True
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'MOVIE':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_movie = True
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'SOUND':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_sound = True
|
2019-01-15 18:33:37 +01:00
|
|
|
|
|
|
|
|
|
2019-05-18 10:05:13 +02:00
|
|
|
class SEQUENCER_MT_navigation(Menu):
|
|
|
|
|
bl_label = "Navigation"
|
2014-09-01 14:22:34 +02:00
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2014-09-01 14:22:34 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("screen.animation_play")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2020-07-01 19:54:12 +10:00
|
|
|
layout.operator("sequencer.view_frame")
|
2014-09-01 14:22:34 +02:00
|
|
|
|
2016-03-17 10:57:40 +11:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
props = layout.operator("sequencer.strip_jump", text="Jump to Previous Strip")
|
|
|
|
|
props.next = False
|
|
|
|
|
props.center = False
|
|
|
|
|
props = layout.operator("sequencer.strip_jump", text="Jump to Next Strip")
|
|
|
|
|
props.next = True
|
|
|
|
|
props.center = False
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
props = layout.operator("sequencer.strip_jump", text="Jump to Previous Strip (Center)")
|
|
|
|
|
props.next = False
|
|
|
|
|
props.center = True
|
|
|
|
|
props = layout.operator("sequencer.strip_jump", text="Jump to Next Strip (Center)")
|
|
|
|
|
props.next = True
|
|
|
|
|
props.center = True
|
|
|
|
|
|
2014-09-17 18:36:17 +10:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_MT_add(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Add"
|
2019-05-13 17:27:40 +02:00
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
2023-11-08 12:56:58 +01:00
|
|
|
bl_options = {'SEARCH_ON_KEY_PRESS'}
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
layout = self.layout
|
2009-10-31 19:31:45 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
2022-05-16 19:46:20 +02:00
|
|
|
layout.menu("SEQUENCER_MT_add_scene", text="Scene", icon='SCENE_DATA')
|
2010-12-02 22:58:23 +00:00
|
|
|
|
2018-12-29 10:19:38 +11:00
|
|
|
bpy_data_movieclips_len = len(bpy.data.movieclips)
|
|
|
|
|
if bpy_data_movieclips_len > 10:
|
2012-03-21 18:02:29 +00:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2019-01-02 19:17:30 +11:00
|
|
|
layout.operator("sequencer.movieclip_strip_add", text="Clip...", icon='TRACKER')
|
2018-12-29 10:19:38 +11:00
|
|
|
elif bpy_data_movieclips_len > 0:
|
2019-01-02 19:17:30 +11:00
|
|
|
layout.operator_menu_enum("sequencer.movieclip_strip_add", "clip", text="Clip", icon='TRACKER')
|
2012-03-21 18:02:29 +00:00
|
|
|
else:
|
2022-10-10 13:03:13 +02:00
|
|
|
layout.menu("SEQUENCER_MT_add_empty", text="Clip", text_ctxt=i18n_contexts.id_movieclip, icon='TRACKER')
|
2018-12-29 10:19:38 +11:00
|
|
|
del bpy_data_movieclips_len
|
2012-03-21 18:02:29 +00:00
|
|
|
|
2018-12-29 10:19:38 +11:00
|
|
|
bpy_data_masks_len = len(bpy.data.masks)
|
|
|
|
|
if bpy_data_masks_len > 10:
|
2012-06-07 18:24:36 +00:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.operator("sequencer.mask_strip_add", text="Mask...", icon='MOD_MASK')
|
2018-12-29 10:19:38 +11:00
|
|
|
elif bpy_data_masks_len > 0:
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.operator_menu_enum("sequencer.mask_strip_add", "mask", text="Mask", icon='MOD_MASK')
|
2012-06-07 18:24:36 +00:00
|
|
|
else:
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.menu("SEQUENCER_MT_add_empty", text="Mask", icon='MOD_MASK')
|
2018-12-29 10:19:38 +11:00
|
|
|
del bpy_data_masks_len
|
2018-11-08 16:01:02 +01:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.movie_strip_add", text="Movie", icon='FILE_MOVIE')
|
|
|
|
|
layout.operator("sequencer.sound_strip_add", text="Sound", icon='FILE_SOUND')
|
|
|
|
|
layout.operator("sequencer.image_strip_add", text="Image/Sequence", icon='FILE_IMAGE')
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
layout.operator("sequencer.effect_strip_add", text="Color", icon='COLOR').type = 'COLOR'
|
|
|
|
|
layout.operator("sequencer.effect_strip_add", text="Text", icon='FONT_DATA').type = 'TEXT'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
2012-06-07 18:24:36 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.operator("sequencer.effect_strip_add", text="Adjustment Layer", icon='COLOR').type = 'ADJUSTMENT'
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2019-05-18 01:11:45 +02:00
|
|
|
layout.menu("SEQUENCER_MT_add_effect", icon='SHADERFX')
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
total, nonsound = selected_strips_count(context)
|
|
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
col = layout.column()
|
2019-05-18 01:11:45 +02:00
|
|
|
col.menu("SEQUENCER_MT_add_transitions", icon='ARROW_LEFTRIGHT')
|
2025-01-20 11:19:23 +11:00
|
|
|
# Enable for video transitions or sound cross-fade.
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = nonsound == 2 or (nonsound == 0 and total == 2)
|
2018-11-08 16:01:02 +01:00
|
|
|
|
2019-09-13 17:24:02 -07:00
|
|
|
col = layout.column()
|
2019-12-17 12:55:56 +11:00
|
|
|
col.operator_menu_enum("sequencer.fades_add", "type", text="Fade", icon='IPO_EASE_IN_OUT')
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = total >= 1
|
2019-09-13 17:24:02 -07:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2022-05-16 19:46:20 +02:00
|
|
|
class SEQUENCER_MT_add_scene(Menu):
|
|
|
|
|
bl_label = "Scene"
|
|
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
VSE: Copy settings of active scene when adding new scene
The `Add` > `Scene` > `New Scene` operator was behaving as follows:
* If there is no active scene strip, create an empty blank scene and
assign it to a new scene strip.
* Otherwise, use the scene referenced by the active scene strip and
use one of the copy scene methods (blank, copy settings, copy linked,
or full copy) to create a new scene and assign it to a
new scene strip.
This was not ideal for 2 reasons:
1. With no strip selected, creating blank scenes is generally not very
useful as it means that the user has to e.g. update all the render
settings, add a camera, etc.
2. The behavior of copying an existing scene by using the active strip
is very hidden. Also because adding the strip immedialty calls the
move operator, so you cannot even adjust the copy method of the
scene.
This PR changes 3 things:
1. Don't use at the active scene strip. Instead use the active scene.
2. Don't create an empty blank scene, copy the settings of the active
scene by default. This means that e.g. render settings can be reused.
3. The operator entry in the `Add` > `Scene` menu is now called `Empty Scene`.
Part of #144063.
Pull Request: https://projects.blender.org/blender/blender/pulls/144069
2025-08-08 10:50:58 +02:00
|
|
|
layout.operator("sequencer.scene_strip_add_new", text="Empty Scene", icon='ADD').type = 'EMPTY'
|
2022-05-16 19:46:20 +02:00
|
|
|
|
2025-08-13 13:11:47 +02:00
|
|
|
layout.menu_contents("SEQUENCER_MT_scene_add_root_catalogs")
|
|
|
|
|
|
2022-05-16 19:46:20 +02:00
|
|
|
bpy_data_scenes_len = len(bpy.data.scenes)
|
|
|
|
|
if bpy_data_scenes_len > 10:
|
2025-08-13 13:11:47 +02:00
|
|
|
layout.label(text="Scenes", icon='NONE')
|
2022-05-16 19:46:20 +02:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
|
|
|
layout.operator("sequencer.scene_strip_add", text="Scene...", icon='SCENE_DATA')
|
|
|
|
|
elif bpy_data_scenes_len > 1:
|
2025-08-13 13:11:47 +02:00
|
|
|
layout.label(text="Scenes", icon='NONE')
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
scene = context.sequencer_scene
|
2022-05-16 19:46:20 +02:00
|
|
|
for sc_item in bpy.data.scenes:
|
|
|
|
|
if sc_item == scene:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2025-06-30 11:12:48 +02:00
|
|
|
layout.operator("sequencer.scene_strip_add", text=sc_item.name, translate=False).scene = sc_item.name
|
2022-05-16 19:46:20 +02:00
|
|
|
|
|
|
|
|
del bpy_data_scenes_len
|
|
|
|
|
|
|
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
class SEQUENCER_MT_add_empty(Menu):
|
|
|
|
|
bl_label = "Empty"
|
2018-07-30 16:46:55 +10:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2018-07-30 16:46:55 +10:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
layout.label(text="No Items Available")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_MT_add_transitions(Menu):
|
2019-08-12 15:46:07 -04:00
|
|
|
bl_label = "Transition"
|
2018-11-08 16:01:02 +01:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-16 01:40:36 +01:00
|
|
|
total, nonsound = selected_strips_count(context)
|
2018-11-08 16:01:02 +01:00
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
2019-05-18 01:11:45 +02:00
|
|
|
col.operator("sequencer.crossfade_sounds", text="Sound Crossfade")
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = (nonsound == 0 and total == 2)
|
2019-05-18 01:11:45 +02:00
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
layout.separator()
|
2019-05-18 01:11:45 +02:00
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
col = layout.column()
|
2025-05-29 17:16:29 -05:00
|
|
|
col.operator("sequencer.effect_strip_add", text="Crossfade").type = 'CROSS'
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Gamma Crossfade").type = 'GAMMA_CROSS'
|
2018-11-08 16:01:02 +01:00
|
|
|
|
|
|
|
|
col.separator()
|
|
|
|
|
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Wipe").type = 'WIPE'
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = nonsound == 2
|
2018-07-30 16:46:55 +10:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_MT_add_effect(Menu):
|
2017-05-28 20:41:23 -04:00
|
|
|
bl_label = "Effect Strip"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
layout = self.layout
|
2009-10-31 19:31:45 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2025-01-16 01:40:36 +01:00
|
|
|
_, nonsound = selected_strips_count(context)
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.effect_strip_add", text="Multicam Selector").type = 'MULTICAM'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Transform").type = 'TRANSFORM'
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Speed Control").type = 'SPEED'
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Glow").type = 'GLOW'
|
|
|
|
|
col.operator("sequencer.effect_strip_add", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
|
|
|
|
|
col.enabled = nonsound == 1
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2018-11-08 16:01:02 +01:00
|
|
|
col = layout.column()
|
2025-01-14 12:46:40 +11:00
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Add",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'ADD'
|
|
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Subtract",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'SUBTRACT'
|
|
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Multiply",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'MULTIPLY'
|
|
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Alpha Over",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'ALPHA_OVER'
|
|
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Alpha Under",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'ALPHA_UNDER'
|
|
|
|
|
col.operator(
|
|
|
|
|
"sequencer.effect_strip_add",
|
|
|
|
|
text="Color Mix",
|
|
|
|
|
text_ctxt=i18n_contexts.id_sequence,
|
|
|
|
|
).type = 'COLORMIX'
|
2025-01-16 01:40:36 +01:00
|
|
|
col.enabled = nonsound == 2
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
class SEQUENCER_MT_strip_transform(Menu):
|
|
|
|
|
bl_label = "Transform"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
def draw(self, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
2021-10-28 14:31:17 +11:00
|
|
|
st = context.space_data
|
|
|
|
|
has_sequencer, has_preview = _space_view_types(st)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_preview:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
else:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2013-03-26 15:00:56 +00:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col = layout.column()
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_preview:
|
2025-08-26 11:53:49 +02:00
|
|
|
col.operator("transform.translate", text="Move")
|
|
|
|
|
col.operator("transform.rotate", text="Rotate")
|
|
|
|
|
col.operator("transform.resize", text="Scale")
|
2021-10-28 14:31:17 +11:00
|
|
|
else:
|
2025-08-26 11:53:49 +02:00
|
|
|
col.operator("transform.seq_slide", text="Move").view2d_edge_pan = True
|
|
|
|
|
col.operator("transform.transform", text="Move/Extend from Current Frame").mode = 'TIME_EXTEND'
|
|
|
|
|
col.operator("sequencer.slip", text="Slip Strip Contents")
|
2019-05-18 10:05:13 +02:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
# TODO (for preview)
|
|
|
|
|
if has_sequencer:
|
2025-08-26 11:53:49 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.operator("sequencer.snap")
|
|
|
|
|
col.operator("sequencer.offset_clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col.separator()
|
2021-10-28 14:31:17 +11:00
|
|
|
|
|
|
|
|
if has_sequencer:
|
2025-08-26 11:53:49 +02:00
|
|
|
col.operator_menu_enum("sequencer.swap", "side")
|
2021-10-28 14:31:17 +11:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.operator("sequencer.gap_remove").all = False
|
|
|
|
|
col.operator("sequencer.gap_remove", text="Remove Gaps (All)").all = True
|
|
|
|
|
col.operator("sequencer.gap_insert")
|
|
|
|
|
|
|
|
|
|
col.enabled = bool(context.sequencer_scene)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
|
2024-12-19 15:48:06 +01:00
|
|
|
class SEQUENCER_MT_strip_text(Menu):
|
|
|
|
|
bl_label = "Text"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
layout.operator("sequencer.text_edit_mode_toggle")
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.text_edit_copy", icon='COPYDOWN')
|
|
|
|
|
layout.operator("sequencer.text_edit_paste", icon='PASTEDOWN')
|
|
|
|
|
layout.operator("sequencer.text_edit_cut")
|
|
|
|
|
layout.separator()
|
|
|
|
|
props = layout.operator("sequencer.text_delete")
|
|
|
|
|
props.type = 'PREVIOUS_OR_SELECTION'
|
|
|
|
|
layout.operator("sequencer.text_line_break")
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.text_select_all")
|
|
|
|
|
layout.operator("sequencer.text_deselect_all")
|
|
|
|
|
|
|
|
|
|
|
2025-04-22 08:18:21 +02:00
|
|
|
class SEQUENCER_MT_strip_show_hide(Menu):
|
|
|
|
|
bl_label = "Show/Hide"
|
|
|
|
|
|
2025-04-22 21:22:43 +10:00
|
|
|
def draw(self, _context):
|
2025-04-22 08:18:21 +02:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2025-06-25 02:56:55 +02:00
|
|
|
class SEQUENCER_MT_strip_animation(Menu):
|
|
|
|
|
bl_label = "Animation"
|
|
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
def draw(self, context):
|
2025-06-25 02:56:55 +02:00
|
|
|
layout = self.layout
|
2025-08-25 22:02:39 +02:00
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
2025-06-25 02:56:55 +02:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("anim.keyframe_insert", text="Insert Keyframe")
|
|
|
|
|
col.operator("anim.keyframe_insert_menu", text="Insert Keyframe with Keying Set").always_prompt = True
|
|
|
|
|
col.operator("anim.keying_set_active_set", text="Change Keying Set...")
|
|
|
|
|
col.operator("anim.keyframe_delete_vse", text="Delete Keyframes...")
|
|
|
|
|
col.operator("anim.keyframe_clear_vse", text="Clear Keyframes...")
|
|
|
|
|
col.enabled = bool(context.sequencer_scene)
|
2025-06-25 02:56:55 +02:00
|
|
|
|
|
|
|
|
|
2025-08-17 14:01:40 +02:00
|
|
|
class SEQUENCER_MT_strip_mirror(Menu):
|
|
|
|
|
bl_label = "Mirror"
|
|
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
def draw(self, context):
|
2025-08-17 14:01:40 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("transform.mirror", text="Interactive Mirror")
|
2025-08-17 14:01:40 +02:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col.separator()
|
2025-08-17 14:01:40 +02:00
|
|
|
|
|
|
|
|
for (space_name, space_id) in (("Global", 'GLOBAL'), ("Local", 'LOCAL')):
|
|
|
|
|
for axis_index, axis_name in enumerate("XY"):
|
2025-08-26 11:53:49 +02:00
|
|
|
props = col.operator(
|
2025-08-17 14:01:40 +02:00
|
|
|
"transform.mirror",
|
|
|
|
|
text="{:s} {:s}".format(axis_name, iface_(space_name)),
|
|
|
|
|
translate=False,
|
|
|
|
|
)
|
|
|
|
|
props.constraint_axis[axis_index] = True
|
|
|
|
|
props.orient_type = space_id
|
|
|
|
|
|
|
|
|
|
if space_id == 'GLOBAL':
|
2025-08-26 11:53:49 +02:00
|
|
|
col.separator()
|
|
|
|
|
col.enabled = bool(context.sequencer_scene)
|
2025-08-17 14:01:40 +02:00
|
|
|
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
class SEQUENCER_MT_strip_input(Menu):
|
|
|
|
|
bl_label = "Inputs"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
layout.operator("sequencer.reload", text="Reload Strips")
|
|
|
|
|
layout.operator("sequencer.reload", text="Reload Strips and Adjust Length").adjust_length = True
|
2023-04-13 13:14:01 +10:00
|
|
|
props = layout.operator("sequencer.change_path", text="Change Path/Files")
|
2017-10-09 13:47:05 +11:00
|
|
|
layout.operator("sequencer.swap_data", text="Swap Data")
|
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
if strip:
|
2019-06-22 11:02:33 +10:00
|
|
|
strip_type = strip.type
|
2010-04-17 19:05:53 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type == 'IMAGE':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_image = True
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'MOVIE':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_movie = True
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'SOUND':
|
2023-04-13 13:14:01 +10:00
|
|
|
props.filter_sound = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
class SEQUENCER_MT_strip_lock_mute(Menu):
|
|
|
|
|
bl_label = "Lock/Mute"
|
|
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2017-10-09 13:47:05 +11:00
|
|
|
layout = self.layout
|
2013-08-23 20:41:21 +00:00
|
|
|
|
2019-05-30 15:26:17 -07:00
|
|
|
layout.operator("sequencer.lock")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("sequencer.unlock")
|
2018-11-08 16:01:02 +01:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("sequencer.mute").unselected = False
|
2015-01-29 17:34:05 +01:00
|
|
|
layout.operator("sequencer.unmute").unselected = False
|
2018-11-22 02:02:03 +01:00
|
|
|
layout.operator("sequencer.mute", text="Mute Unselected Strips").unselected = True
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("sequencer.unmute", text="Unmute Deselected Strips").unselected = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
|
2019-05-22 14:59:04 +02:00
|
|
|
class SEQUENCER_MT_strip_effect(Menu):
|
|
|
|
|
bl_label = "Effect Strip"
|
|
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-22 14:59:04 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_effect_change")
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.operator("sequencer.reassign_inputs")
|
|
|
|
|
layout.operator("sequencer.swap_inputs")
|
|
|
|
|
|
|
|
|
|
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
class SEQUENCER_MT_strip_effect_change(Menu):
|
|
|
|
|
bl_label = "Change Effect Type"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
strip = context.active_strip
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
2025-05-29 16:16:06 -05:00
|
|
|
col.operator("sequencer.change_effect_type", text="Adjustment Layer").type = 'ADJUSTMENT'
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
col.operator("sequencer.change_effect_type", text="Multicam Selector").type = 'MULTICAM'
|
|
|
|
|
col.enabled = strip.input_count == 0
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Transform").type = 'TRANSFORM'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Speed Control").type = 'SPEED'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Glow").type = 'GLOW'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Gaussian Blur").type = 'GAUSSIAN_BLUR'
|
|
|
|
|
col.enabled = strip.input_count == 1
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Add").type = 'ADD'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Subtract").type = 'SUBTRACT'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Multiply").type = 'MULTIPLY'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Alpha Over").type = 'ALPHA_OVER'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Alpha Under").type = 'ALPHA_UNDER'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Color Mix").type = 'COLORMIX'
|
2025-05-29 17:16:29 -05:00
|
|
|
col.operator("sequencer.change_effect_type", text="Crossfade").type = 'CROSS'
|
|
|
|
|
col.operator("sequencer.change_effect_type", text="Gamma Crossfade").type = 'GAMMA_CROSS'
|
2025-05-29 16:16:06 -05:00
|
|
|
col.operator("sequencer.change_effect_type", text="Wipe").type = 'WIPE'
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
col.enabled = strip.input_count == 2
|
|
|
|
|
|
|
|
|
|
|
2019-05-22 14:59:04 +02:00
|
|
|
class SEQUENCER_MT_strip_movie(Menu):
|
|
|
|
|
bl_label = "Movie Strip"
|
|
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-22 14:59:04 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.rendersize")
|
|
|
|
|
layout.operator("sequencer.deinterlace_selected_movies")
|
|
|
|
|
|
|
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
class SEQUENCER_MT_strip_retiming(Menu):
|
|
|
|
|
bl_label = "Retiming"
|
|
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
def draw(self, context):
|
2025-01-21 23:30:55 +11:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
is_retiming = (
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
context.sequencer_scene and
|
|
|
|
|
context.sequencer_scene.sequence_editor is not None and
|
|
|
|
|
context.sequencer_scene.sequence_editor.selected_retiming_keys
|
2025-01-21 23:30:55 +11:00
|
|
|
)
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
|
|
|
|
|
layout.operator("sequencer.retiming_key_add")
|
2024-01-14 19:44:33 +01:00
|
|
|
layout.operator("sequencer.retiming_add_freeze_frame_slide")
|
2023-10-04 19:27:28 +02:00
|
|
|
col = layout.column()
|
2024-01-14 19:44:33 +01:00
|
|
|
col.operator("sequencer.retiming_add_transition_slide")
|
2023-10-04 19:27:28 +02:00
|
|
|
col.enabled = is_retiming
|
|
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
2024-06-28 17:06:44 +02:00
|
|
|
layout.operator("sequencer.retiming_key_delete")
|
2023-10-04 19:27:28 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.retiming_reset")
|
|
|
|
|
col.enabled = not is_retiming
|
|
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.retiming_segment_speed_set")
|
2023-09-29 14:54:14 +10:00
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.retiming_show",
|
|
|
|
|
icon='CHECKBOX_HLT' if (strip and strip.show_retiming_keys) else 'CHECKBOX_DEHLT',
|
2023-10-04 19:27:28 +02:00
|
|
|
text="Toggle Retiming Keys",
|
2023-09-29 14:54:14 +10:00
|
|
|
)
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
class SEQUENCER_MT_strip(Menu):
|
|
|
|
|
bl_label = "Strip"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2023-10-05 13:07:57 +11:00
|
|
|
from bl_ui_utils.layout import operator_context
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
layout = self.layout
|
2021-10-28 14:31:17 +11:00
|
|
|
st = context.space_data
|
2024-12-17 15:52:23 +01:00
|
|
|
has_sequencer, has_preview = _space_view_types(st)
|
|
|
|
|
|
2024-12-19 15:48:06 +01:00
|
|
|
layout.menu("SEQUENCER_MT_strip_transform")
|
|
|
|
|
|
2024-12-17 15:52:23 +01:00
|
|
|
if has_preview:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
else:
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2017-10-09 13:47:05 +11:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-20 18:04:35 +02:00
|
|
|
|
2024-12-17 15:52:23 +01:00
|
|
|
if has_preview:
|
2025-08-17 14:01:40 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_mirror")
|
2024-12-17 15:52:23 +01:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.preview_duplicate_move", text="Duplicate")
|
2025-08-11 21:40:04 +02:00
|
|
|
layout.operator("sequencer.copy", text="Copy")
|
|
|
|
|
layout.operator("sequencer.paste", text="Paste")
|
2024-12-19 15:48:06 +01:00
|
|
|
layout.separator()
|
2025-06-25 02:56:55 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_animation")
|
|
|
|
|
layout.separator()
|
2025-04-22 08:18:21 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_show_hide")
|
|
|
|
|
layout.separator()
|
2024-12-19 15:48:06 +01:00
|
|
|
if strip and strip.type == 'TEXT':
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_text")
|
2024-12-17 15:52:23 +01:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_sequencer:
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_retiming")
|
|
|
|
|
layout.separator()
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2023-10-02 16:20:31 +02:00
|
|
|
with operator_context(layout, 'EXEC_REGION_WIN'):
|
|
|
|
|
props = layout.operator("sequencer.split", text="Split")
|
|
|
|
|
props.type = 'SOFT'
|
2023-02-15 12:03:27 +01:00
|
|
|
|
2023-10-02 16:20:31 +02:00
|
|
|
props = layout.operator("sequencer.split", text="Hold Split")
|
|
|
|
|
props.type = 'HARD'
|
2023-02-15 12:03:27 +01:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.separator()
|
2017-10-09 13:47:05 +11:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.operator("sequencer.copy", text="Copy")
|
|
|
|
|
layout.operator("sequencer.paste", text="Paste")
|
2024-12-09 11:33:24 +01:00
|
|
|
layout.operator("sequencer.duplicate_move", text="Duplicate")
|
2025-08-11 15:20:35 +02:00
|
|
|
layout.operator("sequencer.duplicate_move_linked", text="Duplicate Linked")
|
2017-10-09 13:47:05 +11:00
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
layout.separator()
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.operator("sequencer.delete", text="Delete")
|
2019-05-30 15:26:17 -07:00
|
|
|
|
2022-05-16 20:19:33 +02:00
|
|
|
if strip and strip.type == 'SCENE':
|
|
|
|
|
layout.operator("sequencer.delete", text="Delete Strip & Data").delete_data = True
|
2023-01-30 07:47:29 +01:00
|
|
|
layout.operator("sequencer.scene_frame_range_update")
|
2022-05-16 20:19:33 +02:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
if has_sequencer:
|
|
|
|
|
if strip:
|
|
|
|
|
strip_type = strip.type
|
2023-09-07 21:13:10 +10:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator_menu_enum("sequencer.strip_modifier_add", "type", text="Add Modifier")
|
|
|
|
|
layout.operator("sequencer.strip_modifier_copy", text="Copy Modifiers to Selection")
|
2021-10-28 14:31:17 +11:00
|
|
|
|
|
|
|
|
if strip_type in {
|
|
|
|
|
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
|
2025-02-10 16:10:01 +01:00
|
|
|
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
|
2021-10-28 14:31:17 +11:00
|
|
|
'GAUSSIAN_BLUR',
|
|
|
|
|
}:
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_effect")
|
|
|
|
|
elif strip_type == 'MOVIE':
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_movie")
|
|
|
|
|
elif strip_type == 'IMAGE':
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.rendersize")
|
|
|
|
|
layout.operator("sequencer.images_separate")
|
|
|
|
|
elif strip_type == 'META':
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.meta_make")
|
|
|
|
|
layout.operator("sequencer.meta_separate")
|
|
|
|
|
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
|
|
|
|
|
if strip_type != 'META':
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.meta_make")
|
|
|
|
|
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
|
|
|
|
|
|
|
|
|
|
if has_sequencer:
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_color_tag_picker")
|
2017-10-09 13:47:05 +11:00
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_lock_mute")
|
|
|
|
|
|
2024-08-22 14:54:42 +02:00
|
|
|
layout.separator()
|
2025-01-21 23:50:17 +11:00
|
|
|
layout.operator("sequencer.connect", icon='LINKED').toggle = True
|
2024-08-22 14:54:42 +02:00
|
|
|
layout.operator("sequencer.disconnect")
|
|
|
|
|
|
2021-10-28 14:31:17 +11:00
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_input")
|
2017-10-09 13:47:05 +11:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2021-10-25 22:19:04 -04:00
|
|
|
class SEQUENCER_MT_image(Menu):
|
|
|
|
|
bl_label = "Image"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
st = context.space_data
|
|
|
|
|
|
2025-01-14 12:16:39 +11:00
|
|
|
if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}:
|
2021-10-25 22:19:04 -04:00
|
|
|
layout.menu("SEQUENCER_MT_image_transform")
|
|
|
|
|
|
|
|
|
|
layout.menu("SEQUENCER_MT_image_clear")
|
|
|
|
|
layout.menu("SEQUENCER_MT_image_apply")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_MT_image_transform(Menu):
|
2021-11-01 17:28:07 +01:00
|
|
|
bl_label = "Transform"
|
2021-10-25 22:19:04 -04:00
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
def draw(self, context):
|
2021-10-25 22:19:04 -04:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
|
2025-08-26 11:53:49 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("transform.translate")
|
|
|
|
|
col.operator("transform.rotate")
|
|
|
|
|
col.operator("transform.resize", text="Scale")
|
|
|
|
|
col.separator()
|
|
|
|
|
col.operator("transform.translate", text="Move Origin").translate_origin = True
|
|
|
|
|
col.enabled = bool(context.sequencer_scene)
|
2021-10-25 22:19:04 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_MT_image_clear(Menu):
|
|
|
|
|
bl_label = "Clear"
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
2025-01-14 12:46:40 +11:00
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.strip_transform_clear",
|
|
|
|
|
text="Position",
|
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
|
).property = 'POSITION'
|
|
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.strip_transform_clear",
|
|
|
|
|
text="Scale",
|
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
|
).property = 'SCALE'
|
|
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.strip_transform_clear",
|
|
|
|
|
text="Rotation",
|
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
|
).property = 'ROTATION'
|
|
|
|
|
layout.operator(
|
|
|
|
|
"sequencer.strip_transform_clear",
|
|
|
|
|
text="All Transforms",
|
|
|
|
|
).property = 'ALL'
|
2021-10-25 22:19:04 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_MT_image_apply(Menu):
|
|
|
|
|
bl_label = "Apply"
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.strip_transform_fit", text="Scale To Fit").fit_method = 'FIT'
|
|
|
|
|
layout.operator("sequencer.strip_transform_fit", text="Scale to Fill").fit_method = 'FILL'
|
|
|
|
|
layout.operator("sequencer.strip_transform_fit", text="Stretch To Fill").fit_method = 'STRETCH'
|
|
|
|
|
|
|
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
class SEQUENCER_MT_retiming(Menu):
|
|
|
|
|
bl_label = "Retiming"
|
|
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.retiming_key_add")
|
2024-01-14 19:44:33 +01:00
|
|
|
layout.operator("sequencer.retiming_add_freeze_frame_slide")
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
|
|
|
|
|
|
2019-05-07 21:07:52 +02:00
|
|
|
class SEQUENCER_MT_context_menu(Menu):
|
2023-09-25 16:25:55 +02:00
|
|
|
bl_label = "Sequencer"
|
2019-05-07 21:07:52 +02:00
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
def draw_generic(self, context):
|
2019-05-07 21:07:52 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
2020-02-17 16:38:53 +01:00
|
|
|
layout.operator("sequencer.split", text="Split").type = 'SOFT'
|
2019-05-07 21:12:22 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("sequencer.copy", text="Copy", icon='COPYDOWN')
|
|
|
|
|
layout.operator("sequencer.paste", text="Paste", icon='PASTEDOWN')
|
2019-05-07 21:07:52 +02:00
|
|
|
layout.operator("sequencer.duplicate_move")
|
2019-10-14 18:04:16 +02:00
|
|
|
props = layout.operator("wm.call_panel", text="Rename...")
|
|
|
|
|
props.name = "TOPBAR_PT_name"
|
|
|
|
|
props.keep_open = False
|
2020-08-06 14:48:47 +02:00
|
|
|
layout.operator("sequencer.delete", text="Delete")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2022-05-16 20:19:33 +02:00
|
|
|
if strip and strip.type == 'SCENE':
|
|
|
|
|
layout.operator("sequencer.delete", text="Delete Strip & Data").delete_data = True
|
2023-01-30 07:47:29 +01:00
|
|
|
layout.operator("sequencer.scene_frame_range_update")
|
2022-05-16 20:19:33 +02:00
|
|
|
|
2019-05-07 21:07:52 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("sequencer.slip", text="Slip Strip Contents")
|
|
|
|
|
layout.operator("sequencer.snap")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-11-02 22:53:39 -07:00
|
|
|
layout.operator("sequencer.set_range_to_strips", text="Set Preview Range to Strips").preview = True
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.operator("sequencer.gap_remove").all = False
|
|
|
|
|
layout.operator("sequencer.gap_insert")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2019-09-13 17:24:02 -07:00
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-07 21:07:52 +02:00
|
|
|
if strip:
|
2019-06-22 11:02:33 +10:00
|
|
|
strip_type = strip.type
|
2025-01-16 01:40:36 +01:00
|
|
|
total, nonsound = selected_strips_count(context)
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2023-09-07 21:13:10 +10:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator_menu_enum("sequencer.strip_modifier_add", "type", text="Add Modifier")
|
|
|
|
|
layout.operator("sequencer.strip_modifier_copy", text="Copy Modifiers to Selection")
|
|
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
if total == 2:
|
|
|
|
|
if nonsound == 2:
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.separator()
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.menu("SEQUENCER_MT_add_transitions", text="Add Transition")
|
2025-01-16 01:40:36 +01:00
|
|
|
elif nonsound == 0:
|
2023-08-30 22:36:36 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.crossfade_sounds", text="Crossfade Sounds")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2025-01-16 01:40:36 +01:00
|
|
|
if total >= 1:
|
2019-09-13 17:24:02 -07:00
|
|
|
col = layout.column()
|
|
|
|
|
col.operator_menu_enum("sequencer.fades_add", "type", text="Fade")
|
|
|
|
|
layout.operator("sequencer.fades_clear", text="Clear Fade")
|
|
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type in {
|
2019-05-22 14:59:04 +02:00
|
|
|
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
|
2025-02-10 16:10:01 +01:00
|
|
|
'GAMMA_CROSS', 'MULTIPLY', 'WIPE', 'GLOW',
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
'TRANSFORM', 'SPEED', 'MULTICAM', 'ADJUSTMENT',
|
2019-08-09 14:08:20 +02:00
|
|
|
'GAUSSIAN_BLUR',
|
2019-05-22 14:59:04 +02:00
|
|
|
}:
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_effect")
|
2020-02-15 09:49:22 +11:00
|
|
|
elif strip_type == 'MOVIE':
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_strip_movie")
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'IMAGE':
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.rendersize")
|
|
|
|
|
layout.operator("sequencer.images_separate")
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'META':
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.meta_make")
|
|
|
|
|
layout.operator("sequencer.meta_separate")
|
|
|
|
|
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type != 'META':
|
2019-05-22 14:59:04 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("sequencer.meta_make")
|
|
|
|
|
layout.operator("sequencer.meta_toggle", text="Toggle Meta")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2021-09-29 14:29:32 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.menu("SEQUENCER_MT_color_tag_picker")
|
|
|
|
|
|
2019-05-07 21:07:52 +02:00
|
|
|
layout.separator()
|
2019-05-20 18:04:35 +02:00
|
|
|
layout.menu("SEQUENCER_MT_strip_lock_mute")
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2024-08-22 14:54:42 +02:00
|
|
|
layout.separator()
|
2025-01-21 23:50:17 +11:00
|
|
|
layout.operator("sequencer.connect", icon='LINKED').toggle = True
|
2024-08-22 14:54:42 +02:00
|
|
|
layout.operator("sequencer.disconnect")
|
|
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
def draw_retime(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if context.sequencer_scene.sequence_editor.selected_retiming_keys:
|
2024-01-14 19:44:33 +01:00
|
|
|
layout.operator("sequencer.retiming_add_freeze_frame_slide")
|
|
|
|
|
layout.operator("sequencer.retiming_add_transition_slide")
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("sequencer.retiming_segment_speed_set")
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2025-03-26 04:00:35 +01:00
|
|
|
layout.operator("sequencer.retiming_key_delete", text="Delete Retiming Keys")
|
2024-01-09 18:58:10 +01:00
|
|
|
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
def draw(self, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
if ed.selected_retiming_keys:
|
|
|
|
|
|
|
|
|
|
self.draw_retime(context)
|
|
|
|
|
else:
|
|
|
|
|
self.draw_generic(context)
|
|
|
|
|
|
2019-05-07 21:07:52 +02:00
|
|
|
|
2021-10-06 14:45:34 +11:00
|
|
|
class SEQUENCER_MT_preview_context_menu(Menu):
|
2023-09-25 16:25:55 +02:00
|
|
|
bl_label = "Sequencer Preview"
|
2021-10-06 14:45:34 +11:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
|
|
|
|
props = layout.operator("wm.call_panel", text="Rename...")
|
|
|
|
|
props.name = "TOPBAR_PT_name"
|
|
|
|
|
props.keep_open = False
|
|
|
|
|
|
|
|
|
|
# TODO: support in preview.
|
|
|
|
|
# layout.operator("sequencer.delete", text="Delete")
|
|
|
|
|
|
|
|
|
|
|
2021-10-07 12:32:04 +11:00
|
|
|
class SEQUENCER_MT_pivot_pie(Menu):
|
|
|
|
|
bl_label = "Pivot Point"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
pie = layout.menu_pie()
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if context.tool_settings:
|
|
|
|
|
sequencer_tool_settings = context.tool_settings.sequencer_tool_settings
|
2021-10-07 12:32:04 +11:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
pie.prop_enum(sequencer_tool_settings, "pivot_point", value='CENTER')
|
|
|
|
|
pie.prop_enum(sequencer_tool_settings, "pivot_point", value='CURSOR')
|
|
|
|
|
pie.prop_enum(sequencer_tool_settings, "pivot_point", value='INDIVIDUAL_ORIGINS')
|
|
|
|
|
pie.prop_enum(sequencer_tool_settings, "pivot_point", value='MEDIAN')
|
2021-10-07 12:32:04 +11:00
|
|
|
|
|
|
|
|
|
UI: Introduce View pie in more editors
#### Motivation
The View pie menu is a convenient way to access operators such as `Frame Selected` and `Frame All` which are usually mapped to `PERIOD` or `HOME` keys on the right side of most keyboard, making it hard hard to reach with the left hand.
The motivation for this patch comes from working with a 75% keyboard (no numpad). Most laptops face a similar problem.
#### Implementation
The View pie menu has been added to the following editors and sub-modes where applicable:
* Node Editor
* Video Sequencer
* Dopesheet
* Graph
* NLA
* Image
* Clip
* Outliner
More options could definitely be added to this menu for convenience, as long as it maintains the common options in the same place (Frame Selected on the left, Frame All on the right).
For positioning I went with the following layout:
{F11791186, size=full}
I've added `Zoom 1:1`to the Image Editor and the VSE Preview since there is no way to reset the zoom on keyboards without numpad (unless Emulate Numpad is turned on).
The Outliner uses `Show Active` and `Show Hierarchy` which are the closest ones to the equivalent in other editors. Should `Show Active` be renamed to `Frame Selected`?
The shortcut assigned is the same as the 3D Viewport (`ACCENT_GRAVE`).
#### Screenshots
Node Editor
{F11778387, size=full}
Dopesheet
{F11778400, size=full}
Graph
{F11778403, size=full}
Image Editor (Paint and View)
{F11791113, size=full}
Image Editor (Mask)
{F11791114, size=full}
UV Editor
{F11791119, size=full}
Clip Editor (Tracking)
{F11791137, size=full}
Clip Editor (Mask)
{F11791140, size=full}
Clip Editor (Graph)
{F11791151, size=full}
View operators are not yet implemented in Clip Editor Dopesheet mode (left a note about this in the menu poll).
Reviewed By: #user_interface, campbellbarton
Differential Revision: https://developer.blender.org/D13169
2021-11-10 02:17:24 +01:00
|
|
|
class SEQUENCER_MT_view_pie(Menu):
|
|
|
|
|
bl_label = "View"
|
|
|
|
|
|
2024-05-30 17:19:10 +02:00
|
|
|
def draw(self, context):
|
UI: Introduce View pie in more editors
#### Motivation
The View pie menu is a convenient way to access operators such as `Frame Selected` and `Frame All` which are usually mapped to `PERIOD` or `HOME` keys on the right side of most keyboard, making it hard hard to reach with the left hand.
The motivation for this patch comes from working with a 75% keyboard (no numpad). Most laptops face a similar problem.
#### Implementation
The View pie menu has been added to the following editors and sub-modes where applicable:
* Node Editor
* Video Sequencer
* Dopesheet
* Graph
* NLA
* Image
* Clip
* Outliner
More options could definitely be added to this menu for convenience, as long as it maintains the common options in the same place (Frame Selected on the left, Frame All on the right).
For positioning I went with the following layout:
{F11791186, size=full}
I've added `Zoom 1:1`to the Image Editor and the VSE Preview since there is no way to reset the zoom on keyboards without numpad (unless Emulate Numpad is turned on).
The Outliner uses `Show Active` and `Show Hierarchy` which are the closest ones to the equivalent in other editors. Should `Show Active` be renamed to `Frame Selected`?
The shortcut assigned is the same as the 3D Viewport (`ACCENT_GRAVE`).
#### Screenshots
Node Editor
{F11778387, size=full}
Dopesheet
{F11778400, size=full}
Graph
{F11778403, size=full}
Image Editor (Paint and View)
{F11791113, size=full}
Image Editor (Mask)
{F11791114, size=full}
UV Editor
{F11791119, size=full}
Clip Editor (Tracking)
{F11791137, size=full}
Clip Editor (Mask)
{F11791140, size=full}
Clip Editor (Graph)
{F11791151, size=full}
View operators are not yet implemented in Clip Editor Dopesheet mode (left a note about this in the menu poll).
Reviewed By: #user_interface, campbellbarton
Differential Revision: https://developer.blender.org/D13169
2021-11-10 02:17:24 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
pie = layout.menu_pie()
|
|
|
|
|
pie.operator("sequencer.view_all")
|
|
|
|
|
pie.operator("sequencer.view_selected", text="Frame Selected", icon='ZOOM_SELECTED')
|
2024-05-30 17:19:10 +02:00
|
|
|
pie.separator()
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if context.sequencer_scene.use_preview_range:
|
2024-05-30 17:19:10 +02:00
|
|
|
pie.operator("anim.scene_range_frame", text="Frame Preview Range")
|
|
|
|
|
else:
|
|
|
|
|
pie.operator("anim.scene_range_frame", text="Frame Scene Range")
|
UI: Introduce View pie in more editors
#### Motivation
The View pie menu is a convenient way to access operators such as `Frame Selected` and `Frame All` which are usually mapped to `PERIOD` or `HOME` keys on the right side of most keyboard, making it hard hard to reach with the left hand.
The motivation for this patch comes from working with a 75% keyboard (no numpad). Most laptops face a similar problem.
#### Implementation
The View pie menu has been added to the following editors and sub-modes where applicable:
* Node Editor
* Video Sequencer
* Dopesheet
* Graph
* NLA
* Image
* Clip
* Outliner
More options could definitely be added to this menu for convenience, as long as it maintains the common options in the same place (Frame Selected on the left, Frame All on the right).
For positioning I went with the following layout:
{F11791186, size=full}
I've added `Zoom 1:1`to the Image Editor and the VSE Preview since there is no way to reset the zoom on keyboards without numpad (unless Emulate Numpad is turned on).
The Outliner uses `Show Active` and `Show Hierarchy` which are the closest ones to the equivalent in other editors. Should `Show Active` be renamed to `Frame Selected`?
The shortcut assigned is the same as the 3D Viewport (`ACCENT_GRAVE`).
#### Screenshots
Node Editor
{F11778387, size=full}
Dopesheet
{F11778400, size=full}
Graph
{F11778403, size=full}
Image Editor (Paint and View)
{F11791113, size=full}
Image Editor (Mask)
{F11791114, size=full}
UV Editor
{F11791119, size=full}
Clip Editor (Tracking)
{F11791137, size=full}
Clip Editor (Mask)
{F11791140, size=full}
Clip Editor (Graph)
{F11791151, size=full}
View operators are not yet implemented in Clip Editor Dopesheet mode (left a note about this in the menu poll).
Reviewed By: #user_interface, campbellbarton
Differential Revision: https://developer.blender.org/D13169
2021-11-10 02:17:24 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_MT_preview_view_pie(Menu):
|
|
|
|
|
bl_label = "View"
|
|
|
|
|
|
2022-01-07 14:39:01 +11:00
|
|
|
def draw(self, _context):
|
UI: Introduce View pie in more editors
#### Motivation
The View pie menu is a convenient way to access operators such as `Frame Selected` and `Frame All` which are usually mapped to `PERIOD` or `HOME` keys on the right side of most keyboard, making it hard hard to reach with the left hand.
The motivation for this patch comes from working with a 75% keyboard (no numpad). Most laptops face a similar problem.
#### Implementation
The View pie menu has been added to the following editors and sub-modes where applicable:
* Node Editor
* Video Sequencer
* Dopesheet
* Graph
* NLA
* Image
* Clip
* Outliner
More options could definitely be added to this menu for convenience, as long as it maintains the common options in the same place (Frame Selected on the left, Frame All on the right).
For positioning I went with the following layout:
{F11791186, size=full}
I've added `Zoom 1:1`to the Image Editor and the VSE Preview since there is no way to reset the zoom on keyboards without numpad (unless Emulate Numpad is turned on).
The Outliner uses `Show Active` and `Show Hierarchy` which are the closest ones to the equivalent in other editors. Should `Show Active` be renamed to `Frame Selected`?
The shortcut assigned is the same as the 3D Viewport (`ACCENT_GRAVE`).
#### Screenshots
Node Editor
{F11778387, size=full}
Dopesheet
{F11778400, size=full}
Graph
{F11778403, size=full}
Image Editor (Paint and View)
{F11791113, size=full}
Image Editor (Mask)
{F11791114, size=full}
UV Editor
{F11791119, size=full}
Clip Editor (Tracking)
{F11791137, size=full}
Clip Editor (Mask)
{F11791140, size=full}
Clip Editor (Graph)
{F11791151, size=full}
View operators are not yet implemented in Clip Editor Dopesheet mode (left a note about this in the menu poll).
Reviewed By: #user_interface, campbellbarton
Differential Revision: https://developer.blender.org/D13169
2021-11-10 02:17:24 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
pie = layout.menu_pie()
|
|
|
|
|
pie.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
pie.operator("sequencer.view_all_preview")
|
|
|
|
|
pie.operator("sequencer.view_selected", text="Frame Selected", icon='ZOOM_SELECTED')
|
|
|
|
|
pie.separator()
|
|
|
|
|
pie.operator("sequencer.view_zoom_ratio", text="Zoom 1:1").ratio = 1
|
|
|
|
|
|
|
|
|
|
|
2015-01-29 15:35:06 +11:00
|
|
|
class SequencerButtonsPanel:
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2009-12-16 13:27:30 +00:00
|
|
|
|
2010-08-05 21:58:57 +00:00
|
|
|
@staticmethod
|
|
|
|
|
def has_sequencer(context):
|
2011-06-24 03:30:50 +00:00
|
|
|
return (context.space_data.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'})
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
return cls.has_sequencer(context) and (context.active_strip is not None)
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2015-01-29 15:35:06 +11:00
|
|
|
class SequencerButtonsPanel_Output:
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2009-06-09 16:19:34 +00:00
|
|
|
|
2010-08-05 21:58:57 +00:00
|
|
|
@staticmethod
|
|
|
|
|
def has_preview(context):
|
2015-01-06 12:17:06 +01:00
|
|
|
st = context.space_data
|
2025-04-30 14:10:40 +02:00
|
|
|
return (st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'})
|
2009-12-14 21:42:25 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
return cls.has_preview(context)
|
2009-06-08 16:48:12 +00:00
|
|
|
|
2019-06-21 21:18:57 +10:00
|
|
|
|
2021-10-04 08:14:06 +02:00
|
|
|
class SequencerColorTagPicker:
|
2021-09-29 14:29:32 +02:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2021-10-05 10:59:48 +11:00
|
|
|
|
2021-10-04 08:14:06 +02:00
|
|
|
@staticmethod
|
|
|
|
|
def has_sequencer(context):
|
|
|
|
|
return (context.space_data.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'})
|
2021-09-29 14:29:32 +02:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
return cls.has_sequencer(context) and context.active_strip is not None
|
2021-10-04 08:14:06 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_color_tag_picker(SequencerColorTagPicker, Panel):
|
|
|
|
|
bl_label = "Color Tag"
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
bl_options = {'HIDE_HEADER', 'INSTANCED'}
|
2021-09-29 14:29:32 +02:00
|
|
|
|
2022-01-07 14:39:01 +11:00
|
|
|
def draw(self, _context):
|
2021-09-29 14:29:32 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
2021-10-20 09:13:38 +11:00
|
|
|
row.operator("sequencer.strip_color_tag_set", icon='X').color = 'NONE'
|
2021-09-29 14:29:32 +02:00
|
|
|
for i in range(1, 10):
|
2025-01-07 16:05:12 +01:00
|
|
|
icon = 'STRIP_COLOR_{:02d}'.format(i)
|
2024-04-27 16:02:36 +10:00
|
|
|
row.operator("sequencer.strip_color_tag_set", icon=icon).color = 'COLOR_{:02d}'.format(i)
|
2021-09-29 14:29:32 +02:00
|
|
|
|
|
|
|
|
|
2021-10-04 08:14:06 +02:00
|
|
|
class SEQUENCER_MT_color_tag_picker(SequencerColorTagPicker, Menu):
|
2021-09-29 14:29:32 +02:00
|
|
|
bl_label = "Set Color Tag"
|
|
|
|
|
|
2022-01-07 14:39:01 +11:00
|
|
|
def draw(self, _context):
|
2021-09-29 14:29:32 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.operator_enum("sequencer.strip_color_tag_set", "color", icon_only=True)
|
|
|
|
|
|
|
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
class SEQUENCER_PT_strip(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = ""
|
|
|
|
|
bl_options = {'HIDE_HEADER'}
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-06-23 00:16:26 +02:00
|
|
|
strip_type = strip.type
|
|
|
|
|
|
|
|
|
|
if strip_type in {
|
|
|
|
|
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER', 'MULTIPLY',
|
2025-02-10 16:10:01 +01:00
|
|
|
'GLOW', 'TRANSFORM', 'SPEED', 'MULTICAM',
|
2019-06-23 00:16:26 +02:00
|
|
|
'GAUSSIAN_BLUR', 'COLORMIX',
|
|
|
|
|
}:
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'SHADERFX'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type in {
|
|
|
|
|
'CROSS', 'GAMMA_CROSS', 'WIPE',
|
|
|
|
|
}:
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'ARROW_LEFTRIGHT'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'SCENE':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'SCENE_DATA'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'MOVIECLIP':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'TRACKER'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'MASK':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'MOD_MASK'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'MOVIE':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'FILE_MOVIE'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'SOUND':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'FILE_SOUND'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'IMAGE':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'FILE_IMAGE'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'COLOR':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'COLOR'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'TEXT':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'FONT_DATA'
|
2019-06-23 00:16:26 +02:00
|
|
|
elif strip_type == 'ADJUSTMENT':
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'COLOR'
|
2019-08-24 12:25:51 +02:00
|
|
|
elif strip_type == 'META':
|
|
|
|
|
icon_header = 'SEQ_STRIP_META'
|
2019-06-23 00:16:26 +02:00
|
|
|
else:
|
2019-06-23 11:33:50 +10:00
|
|
|
icon_header = 'SEQ_SEQUENCER'
|
2019-06-21 11:22:56 +02:00
|
|
|
|
2021-09-29 14:29:32 +02:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.use_property_decorate = False
|
2019-06-23 00:16:26 +02:00
|
|
|
row.label(text="", icon=icon_header)
|
2021-09-29 14:29:32 +02:00
|
|
|
row.separator()
|
2019-06-21 11:22:56 +02:00
|
|
|
row.prop(strip, "name", text="")
|
2021-09-29 14:29:32 +02:00
|
|
|
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
if strip.color_tag == 'NONE':
|
|
|
|
|
sub.popover(panel="SEQUENCER_PT_color_tag_picker", text="", icon='COLOR')
|
|
|
|
|
else:
|
2025-01-30 15:45:58 +01:00
|
|
|
icon = 'STRIP_' + strip.color_tag
|
2021-09-29 14:29:32 +02:00
|
|
|
sub.popover(panel="SEQUENCER_PT_color_tag_picker", text="", icon=icon)
|
|
|
|
|
|
|
|
|
|
row.separator()
|
2019-06-21 11:22:56 +02:00
|
|
|
row.prop(strip, "mute", toggle=True, icon_only=True, emboss=False)
|
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2020-11-02 22:15:52 +01:00
|
|
|
class SEQUENCER_PT_adjust_crop(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Crop"
|
2019-05-16 13:58:04 +02:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-05-16 15:02:15 +02:00
|
|
|
bl_category = "Strip"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2020-11-02 22:15:52 +01:00
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
2020-11-02 20:59:21 +01:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2020-11-02 22:15:52 +01:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
2020-11-02 20:59:21 +01:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
return strip.type != 'SOUND'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
2020-11-02 22:15:52 +01:00
|
|
|
layout.active = not strip.mute
|
2019-06-21 11:22:56 +02:00
|
|
|
|
2019-05-23 11:50:15 -07:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.crop, "min_x")
|
|
|
|
|
col.prop(strip.crop, "max_x")
|
|
|
|
|
col.prop(strip.crop, "max_y")
|
|
|
|
|
col.prop(strip.crop, "min_y")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Effect Strip"
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
2009-10-31 19:31:45 +00:00
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
return strip.type in {
|
|
|
|
|
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
|
2025-02-10 16:10:01 +01:00
|
|
|
'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
|
2017-10-09 13:47:05 +11:00
|
|
|
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
|
2022-12-15 17:24:23 +11:00
|
|
|
'MULTICAM', 'GAUSSIAN_BLUR', 'TEXT', 'COLORMIX',
|
2017-10-09 13:47:05 +11:00
|
|
|
}
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2012-08-11 14:37:58 +00:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2010-10-30 12:04:00 +00:00
|
|
|
if strip.input_count > 0:
|
|
|
|
|
col = layout.column()
|
2020-05-28 14:17:22 -04:00
|
|
|
row = col.row()
|
|
|
|
|
row.prop(strip, "input_1")
|
|
|
|
|
|
2010-10-30 12:04:00 +00:00
|
|
|
if strip.input_count > 1:
|
2020-05-29 12:45:20 +10:00
|
|
|
row.operator("sequencer.swap_inputs", text="", icon='SORT_ASC')
|
2020-05-28 14:17:22 -04:00
|
|
|
row = col.row()
|
|
|
|
|
row.prop(strip, "input_2")
|
2020-05-29 12:45:20 +10:00
|
|
|
row.operator("sequencer.swap_inputs", text="", icon='SORT_DESC')
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
strip_type = strip.type
|
|
|
|
|
|
|
|
|
|
if strip_type == 'COLOR':
|
2020-06-01 05:17:20 +02:00
|
|
|
layout.template_color_picker(strip, "color", value_slider=True, cubic=True)
|
|
|
|
|
layout.prop(strip, "color", text="")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'WIPE':
|
2009-10-31 19:31:45 +00:00
|
|
|
col = layout.column()
|
2009-11-23 00:27:30 +00:00
|
|
|
col.prop(strip, "transition_type")
|
2019-05-22 00:27:01 +10:00
|
|
|
col.alignment = 'RIGHT'
|
2009-11-23 00:27:30 +00:00
|
|
|
col.row().prop(strip, "direction", expand=True)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
col = layout.column()
|
2009-11-23 00:27:30 +00:00
|
|
|
col.prop(strip, "blur_width", slider=True)
|
2011-03-07 13:23:45 +00:00
|
|
|
if strip.transition_type in {'SINGLE', 'DOUBLE'}:
|
2009-11-23 00:27:30 +00:00
|
|
|
col.prop(strip, "angle")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'GLOW':
|
2009-10-31 19:31:45 +00:00
|
|
|
flow = layout.column_flow()
|
2009-11-23 00:27:30 +00:00
|
|
|
flow.prop(strip, "threshold", slider=True)
|
|
|
|
|
flow.prop(strip, "clamp", slider=True)
|
|
|
|
|
flow.prop(strip, "boost_factor")
|
2010-08-20 06:09:58 +00:00
|
|
|
flow.prop(strip, "blur_radius")
|
2019-10-30 06:13:32 +11:00
|
|
|
flow.prop(strip, "quality", slider=True)
|
|
|
|
|
flow.prop(strip, "use_only_boost")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'SPEED':
|
2021-07-01 15:03:14 -03:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip, "speed_control", text="Speed Control")
|
2021-10-20 09:13:38 +11:00
|
|
|
if strip.speed_control == 'MULTIPLY':
|
2021-07-01 15:03:14 -03:00
|
|
|
col.prop(strip, "speed_factor", text=" ")
|
2021-10-20 09:13:38 +11:00
|
|
|
elif strip.speed_control == 'LENGTH':
|
2021-07-01 15:03:14 -03:00
|
|
|
col.prop(strip, "speed_length", text=" ")
|
2021-10-20 09:13:38 +11:00
|
|
|
elif strip.speed_control == 'FRAME_NUMBER':
|
2021-07-01 15:03:14 -03:00
|
|
|
col.prop(strip, "speed_frame_number", text=" ")
|
|
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
2021-10-20 09:13:38 +11:00
|
|
|
row.enabled = strip.speed_control != 'STRETCH'
|
2021-07-01 15:03:14 -03:00
|
|
|
row = layout.row(align=True, heading="Interpolation")
|
|
|
|
|
row.prop(strip, "use_frame_interpolate", text="")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'TRANSFORM':
|
2012-05-20 00:34:54 +00:00
|
|
|
col = layout.column()
|
2012-06-19 22:17:19 +00:00
|
|
|
|
2012-05-20 00:34:54 +00:00
|
|
|
col.prop(strip, "interpolation")
|
|
|
|
|
col.prop(strip, "translation_unit")
|
2019-06-21 07:32:03 +10:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip, "translate_start_x", text="Position X")
|
|
|
|
|
col.prop(strip, "translate_start_y", text="Y")
|
2012-05-20 00:34:54 +00:00
|
|
|
|
2019-06-21 07:32:03 +10:00
|
|
|
col.separator()
|
2012-06-19 22:17:19 +00:00
|
|
|
|
2019-06-21 07:32:03 +10:00
|
|
|
colsub = col.column(align=True)
|
|
|
|
|
colsub.prop(strip, "use_uniform_scale")
|
2012-08-17 18:36:20 +00:00
|
|
|
if strip.use_uniform_scale:
|
2019-06-21 07:32:03 +10:00
|
|
|
colsub = col.column(align=True)
|
|
|
|
|
colsub.prop(strip, "scale_start_x", text="Scale")
|
2012-05-20 00:34:54 +00:00
|
|
|
else:
|
2019-06-21 07:32:03 +10:00
|
|
|
col.prop(strip, "scale_start_x", text="Scale X")
|
|
|
|
|
col.prop(strip, "scale_start_y", text="Y")
|
2012-05-20 00:34:54 +00:00
|
|
|
|
2019-06-21 07:32:03 +10:00
|
|
|
col.separator()
|
2012-05-20 00:34:54 +00:00
|
|
|
|
2019-06-21 07:32:03 +10:00
|
|
|
col.prop(strip, "rotation_start", text="Rotation")
|
2010-05-03 16:00:42 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'MULTICAM':
|
2017-02-11 11:35:02 -05:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
strip_channel = strip.channel
|
|
|
|
|
|
|
|
|
|
col.prop(strip, "multicam_source", text="Source Channel")
|
|
|
|
|
|
|
|
|
|
# The multicam strip needs at least 2 strips to be useful
|
|
|
|
|
if strip_channel > 2:
|
|
|
|
|
BT_ROW = 4
|
2020-10-24 11:42:17 -07:00
|
|
|
col.label(text="Cut To")
|
2017-02-11 11:35:02 -05:00
|
|
|
row = col.row()
|
|
|
|
|
|
|
|
|
|
for i in range(1, strip_channel):
|
|
|
|
|
if (i % BT_ROW) == 1:
|
|
|
|
|
row = col.row(align=True)
|
|
|
|
|
|
2017-03-01 14:12:03 -05:00
|
|
|
# Workaround - .enabled has to have a separate UI block to work
|
2017-02-11 11:35:02 -05:00
|
|
|
if i == strip.multicam_source:
|
|
|
|
|
sub = row.row(align=True)
|
2017-03-01 13:05:34 -05:00
|
|
|
sub.enabled = False
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
sub.operator("sequencer.split_multicam", text="{:d}".format(i), translate=False).camera = i
|
2017-02-11 11:35:02 -05:00
|
|
|
else:
|
|
|
|
|
sub_1 = row.row(align=True)
|
2017-03-01 13:05:34 -05:00
|
|
|
sub_1.enabled = True
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
sub_1.operator("sequencer.split_multicam", text="{:d}".format(i), translate=False).camera = i
|
2017-02-11 11:35:02 -05:00
|
|
|
|
|
|
|
|
if strip.channel > BT_ROW and (strip_channel - 1) % BT_ROW:
|
|
|
|
|
for i in range(strip.channel, strip_channel + ((BT_ROW + 1 - strip_channel) % BT_ROW)):
|
2018-08-28 12:34:51 +10:00
|
|
|
row.label(text="")
|
2017-02-11 11:35:02 -05:00
|
|
|
else:
|
|
|
|
|
col.separator()
|
2017-09-02 15:42:29 +10:00
|
|
|
col.label(text="Two or more channels are needed below this strip", icon='INFO')
|
2010-05-02 17:36:38 +00:00
|
|
|
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'TEXT':
|
2019-08-09 14:08:20 +02:00
|
|
|
layout = self.layout
|
2020-06-01 05:38:48 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.scale_x = 1.3
|
|
|
|
|
col.scale_y = 1.3
|
|
|
|
|
col.use_property_split = False
|
|
|
|
|
col.prop(strip, "text", text="")
|
|
|
|
|
col.use_property_split = True
|
|
|
|
|
layout.prop(strip, "wrap_width", text="Wrap Width")
|
2015-07-01 20:29:18 +02:00
|
|
|
|
2009-11-14 14:58:19 +00:00
|
|
|
col = layout.column(align=True)
|
2025-02-10 16:10:01 +01:00
|
|
|
if strip_type in {'CROSS', 'GAMMA_CROSS', 'WIPE', 'ALPHA_OVER', 'ALPHA_UNDER'}:
|
2020-10-24 11:42:17 -07:00
|
|
|
col.prop(strip, "use_default_fade", text="Default Fade")
|
2011-11-19 16:17:35 +00:00
|
|
|
if not strip.use_default_fade:
|
2017-09-02 15:42:29 +10:00
|
|
|
col.prop(strip, "effect_fader", text="Effect Fader")
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'GAUSSIAN_BLUR':
|
2019-06-21 07:32:03 +10:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip, "size_x", text="Size X")
|
|
|
|
|
col.prop(strip, "size_y", text="Y")
|
2019-06-22 11:02:33 +10:00
|
|
|
elif strip_type == 'COLORMIX':
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.prop(strip, "blend_effect", text="Blend Mode")
|
2017-11-27 23:33:08 +01:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.prop(strip, "factor", slider=True)
|
2016-02-01 00:47:10 +11:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2019-08-09 14:08:20 +02:00
|
|
|
class SEQUENCER_PT_effect_text_layout(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Layout"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_effect"
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-08-09 14:08:20 +02:00
|
|
|
return strip.type == 'TEXT'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-08-09 14:08:20 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "location", text="Location")
|
VSE: Add text alignment feature
Previously, alignment did exist, but it only changed whole text block
position in relation to a fixed point. This was later renamed to "Anchor".
Now it correctly aligns each line of text. Alignment works with newline
character and word wrapping.
Currently newline characters can't be entered directly, but this should
be resolved soon.
To keep existing anchoring feature, new DNA fields are added and
values from old alignment are copied there.
This PR is part of bigger change [1], and originally I expected to
implement this feature at later stage. But the design called for drawing
text character by character, which would mean, that I would have to
rewrite text alignment anyway.
To render the text, a struct is built, where position and width of each
character is stored. In addition, width of each line is stored. This allows
to implement proper text alignment feature, instead of existing
anchoring. Text is then drawn character by character in a loop.
There are some small differences in text rendering, since this is only
approximation of how BLF library draws glyphs, but it is very close.
For text bounbox, `BLF_boundbox()` is used on per line basis,
because some fonts do not use their full height and this information
is not available on VSE side.
[1] https://projects.blender.org/blender/blender/issues/126547
Pull Request: https://projects.blender.org/blender/blender/pulls/126660
2024-10-04 12:20:33 +02:00
|
|
|
col.prop(strip, "alignment_x", text="Alignment X")
|
|
|
|
|
col.prop(strip, "anchor_x", text="Anchor X")
|
|
|
|
|
col.prop(strip, "anchor_y", text="Y")
|
2019-08-09 14:08:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_effect_text_style(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Style"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_effect"
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-08-09 14:08:20 +02:00
|
|
|
return strip.type == 'TEXT'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-08-09 14:08:20 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
col = layout.column()
|
2021-03-20 00:29:22 +01:00
|
|
|
|
|
|
|
|
row = col.row(align=True)
|
|
|
|
|
row.use_property_decorate = False
|
|
|
|
|
row.template_ID(strip, "font", open="font.open", unlink="font.unlink")
|
2021-03-23 16:08:53 +11:00
|
|
|
row.prop(strip, "use_bold", text="", icon='BOLD')
|
|
|
|
|
row.prop(strip, "use_italic", text="", icon='ITALIC')
|
2021-03-20 00:29:22 +01:00
|
|
|
|
2019-08-09 14:08:20 +02:00
|
|
|
col.prop(strip, "font_size")
|
|
|
|
|
col.prop(strip, "color")
|
|
|
|
|
|
2024-11-21 09:45:04 +01:00
|
|
|
|
|
|
|
|
class SEQUENCER_PT_effect_text_outline(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Outline"
|
2025-01-21 23:50:17 +11:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2024-11-21 09:45:04 +01:00
|
|
|
bl_category = "Strip"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_effect_text_style"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2025-01-21 23:50:17 +11:00
|
|
|
return strip.type == 'TEXT'
|
2024-11-21 09:45:04 +01:00
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.prop(strip, "use_outline", text="")
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
2020-11-06 16:15:07 +01:00
|
|
|
|
2024-05-08 11:13:20 +02:00
|
|
|
col = layout.column()
|
2024-11-21 09:45:04 +01:00
|
|
|
col.prop(strip, "outline_color", text="Color")
|
|
|
|
|
col.prop(strip, "outline_width", text="Width")
|
|
|
|
|
col.active = strip.use_outline and (not strip.mute)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_effect_text_shadow(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Shadow"
|
2025-01-21 23:50:17 +11:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2024-11-21 09:45:04 +01:00
|
|
|
bl_category = "Strip"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_effect_text_style"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2025-01-21 23:50:17 +11:00
|
|
|
return strip.type == 'TEXT'
|
2024-11-21 09:45:04 +01:00
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.prop(strip, "use_shadow", text="")
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "shadow_color", text="Color")
|
|
|
|
|
col.prop(strip, "shadow_angle", text="Angle")
|
|
|
|
|
col.prop(strip, "shadow_offset", text="Offset")
|
|
|
|
|
col.prop(strip, "shadow_blur", text="Blur")
|
2024-05-08 11:13:20 +02:00
|
|
|
col.active = strip.use_shadow and (not strip.mute)
|
|
|
|
|
|
|
|
|
|
|
2024-11-21 09:45:04 +01:00
|
|
|
class SEQUENCER_PT_effect_text_box(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Box"
|
2025-01-05 00:38:29 +01:00
|
|
|
bl_translation_context = i18n_contexts.id_sequence
|
2025-01-21 23:50:17 +11:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2024-11-21 09:45:04 +01:00
|
|
|
bl_category = "Strip"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_effect_text_style"
|
2024-05-08 11:13:20 +02:00
|
|
|
|
2024-11-21 09:45:04 +01:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2025-01-21 23:50:17 +11:00
|
|
|
return strip.type == 'TEXT'
|
2020-11-06 16:15:07 +01:00
|
|
|
|
2024-11-21 09:45:04 +01:00
|
|
|
def draw_header(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.prop(strip, "use_box", text="")
|
2019-08-09 14:08:20 +02:00
|
|
|
|
2024-11-21 09:45:04 +01:00
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-11-21 09:45:04 +01:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "box_color", text="Color")
|
|
|
|
|
col.prop(strip, "box_margin", text="Margin")
|
|
|
|
|
col.prop(strip, "box_roundness", text="Roundness")
|
|
|
|
|
col.active = strip.use_box and (not strip.mute)
|
2024-11-17 12:07:16 +01:00
|
|
|
|
2019-08-09 14:08:20 +02:00
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
class SEQUENCER_PT_source(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Source"
|
2019-05-16 13:58:04 +02:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
2009-10-31 19:31:45 +00:00
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
return strip.type in {'MOVIE', 'IMAGE', 'SOUND'}
|
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
scene = context.sequencer_scene
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-06-22 11:02:33 +10:00
|
|
|
strip_type = strip.type
|
2010-08-02 04:10:16 +00:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
# Draw a filename if we have one.
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type == 'SOUND':
|
2019-05-16 13:58:04 +02:00
|
|
|
sound = strip.sound
|
|
|
|
|
layout.template_ID(strip, "sound", open="sound.open")
|
|
|
|
|
if sound is not None:
|
|
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(sound, "filepath", text="")
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
col.alignment = 'RIGHT'
|
|
|
|
|
sub = col.column(align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split = sub.split(factor=0.5, align=True)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
if sound.packed_file:
|
|
|
|
|
split.label(text="Unpack")
|
|
|
|
|
split.operator("sound.unpack", icon='PACKAGE', text="")
|
|
|
|
|
else:
|
|
|
|
|
split.label(text="Pack")
|
|
|
|
|
split.operator("sound.pack", icon='UGLYPACKAGE', text="")
|
2012-06-19 22:17:19 +00:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.prop(sound, "use_memory_cache")
|
2022-05-19 20:58:55 +02:00
|
|
|
|
|
|
|
|
col = layout.box()
|
|
|
|
|
col = col.column(align=True)
|
|
|
|
|
split = col.split(factor=0.5, align=False)
|
|
|
|
|
split.alignment = 'RIGHT'
|
2023-05-24 16:33:33 +02:00
|
|
|
split.label(text="Sample Rate")
|
2022-05-19 20:58:55 +02:00
|
|
|
split.alignment = 'LEFT'
|
|
|
|
|
if sound.samplerate <= 0:
|
|
|
|
|
split.label(text="Unknown")
|
|
|
|
|
else:
|
2024-04-27 16:02:36 +10:00
|
|
|
split.label(text="{:d} Hz".format(sound.samplerate), translate=False)
|
2022-05-19 20:58:55 +02:00
|
|
|
|
|
|
|
|
split = col.split(factor=0.5, align=False)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Channels")
|
|
|
|
|
split.alignment = 'LEFT'
|
2022-05-20 11:24:34 +10:00
|
|
|
|
|
|
|
|
# FIXME(@campbellbarton): this is ugly, we may want to support a way of showing a label from an enum.
|
|
|
|
|
channel_enum_items = sound.bl_rna.properties["channels"].enum_items
|
|
|
|
|
split.label(text=channel_enum_items[channel_enum_items.find(sound.channels)].name)
|
|
|
|
|
del channel_enum_items
|
2019-06-22 10:50:10 +10:00
|
|
|
else:
|
2019-06-22 11:02:33 +10:00
|
|
|
if strip_type == 'IMAGE':
|
2019-06-22 10:50:10 +10:00
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "directory", text="")
|
2010-03-06 01:40:29 +00:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
# Current element for the filename.
|
|
|
|
|
elem = strip.strip_elem_from_frame(scene.frame_current)
|
|
|
|
|
if elem:
|
|
|
|
|
col.prop(elem, "filename", text="") # strip.elements[0] could be a fallback
|
2015-04-06 10:40:12 -03:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
col.prop(strip.colorspace_settings, "name", text="Color Space")
|
2015-04-06 10:40:12 -03:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
col.prop(strip, "alpha_mode", text="Alpha")
|
|
|
|
|
sub = col.column(align=True)
|
|
|
|
|
sub.operator("sequencer.change_path", text="Change Data/Files", icon='FILEBROWSER').filter_image = True
|
2019-06-22 11:02:33 +10:00
|
|
|
else: # elif strip_type == 'MOVIE':
|
2019-06-22 10:50:10 +10:00
|
|
|
elem = strip.elements[0]
|
2015-04-06 10:40:12 -03:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "filepath", text="")
|
|
|
|
|
col.prop(strip.colorspace_settings, "name", text="Color Space")
|
|
|
|
|
col.prop(strip, "stream_index")
|
|
|
|
|
col.prop(strip, "use_deinterlace")
|
2015-04-06 10:40:12 -03:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
if scene.render.use_multiview:
|
|
|
|
|
layout.prop(strip, "use_multiview")
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.active = strip.use_multiview
|
|
|
|
|
|
|
|
|
|
col.row().prop(strip, "views_format", expand=True)
|
|
|
|
|
|
|
|
|
|
box = col.box()
|
|
|
|
|
box.active = strip.views_format == 'STEREO_3D'
|
|
|
|
|
box.template_image_stereo_3d(strip.stereo_3d_format)
|
2019-06-21 11:22:56 +02:00
|
|
|
|
2019-06-22 10:50:10 +10:00
|
|
|
# Resolution.
|
2021-05-31 18:12:44 +02:00
|
|
|
col = layout.box()
|
|
|
|
|
col = col.column(align=True)
|
2019-06-21 11:22:56 +02:00
|
|
|
split = col.split(factor=0.5, align=False)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Resolution")
|
2019-06-22 10:50:10 +10:00
|
|
|
size = (elem.orig_width, elem.orig_height) if elem else (0, 0)
|
|
|
|
|
if size[0] and size[1]:
|
2019-06-21 11:22:56 +02:00
|
|
|
split.alignment = 'LEFT'
|
2024-04-27 16:02:36 +10:00
|
|
|
split.label(text="{:d}x{:d}".format(*size), translate=False)
|
2019-06-21 11:22:56 +02:00
|
|
|
else:
|
|
|
|
|
split.label(text="None")
|
2021-07-06 12:05:27 +10:00
|
|
|
# FPS
|
2021-05-31 18:12:44 +02:00
|
|
|
if elem.orig_fps:
|
|
|
|
|
split = col.split(factor=0.5, align=False)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="FPS")
|
|
|
|
|
split.alignment = 'LEFT'
|
2024-04-27 16:02:36 +10:00
|
|
|
split.label(text="{:.2f}".format(elem.orig_fps), translate=False)
|
2021-05-31 18:12:44 +02:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
|
2024-06-14 17:46:12 +02:00
|
|
|
class SEQUENCER_PT_movie_clip(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Movie Clip"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-06-14 17:46:12 +02:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return strip.type == 'MOVIECLIP'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2024-06-14 17:46:12 +02:00
|
|
|
|
|
|
|
|
layout.active = not strip.mute
|
|
|
|
|
layout.template_ID(strip, "clip")
|
|
|
|
|
|
|
|
|
|
if strip.type == 'MOVIECLIP':
|
|
|
|
|
col = layout.column(heading="Use")
|
|
|
|
|
col.prop(strip, "stabilize2d", text="2D Stabilized Clip")
|
2024-06-25 12:37:43 +02:00
|
|
|
col.prop(strip, "undistort", text="Undistorted Clip")
|
2024-06-14 17:46:12 +02:00
|
|
|
|
|
|
|
|
clip = strip.clip
|
|
|
|
|
if clip:
|
|
|
|
|
sta = clip.frame_start
|
|
|
|
|
end = clip.frame_start + clip.frame_duration
|
|
|
|
|
layout.label(
|
|
|
|
|
text=rpt_("Original frame range: {:d}-{:d} ({:d})").format(sta, end, end - sta + 1),
|
|
|
|
|
translate=False,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_PT_scene(SequencerButtonsPanel, Panel):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Scene"
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2009-11-22 21:16:04 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
2009-11-22 21:16:04 +00:00
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-11-22 21:16:04 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2009-11-22 21:47:55 +00:00
|
|
|
return (strip.type == 'SCENE')
|
2009-11-22 21:16:04 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2021-03-20 01:29:08 +01:00
|
|
|
scene = strip.scene
|
|
|
|
|
|
2009-11-22 21:16:04 +00:00
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2019-06-21 20:01:08 +02:00
|
|
|
layout.use_property_decorate = False
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2022-03-03 12:37:38 +01:00
|
|
|
layout.template_ID(strip, "scene", text="Scene", new="scene.new_sequencer")
|
2021-03-20 01:29:08 +01:00
|
|
|
layout.prop(strip, "scene_input", text="Input")
|
2010-03-09 13:52:52 +00:00
|
|
|
|
2021-03-20 01:29:08 +01:00
|
|
|
if strip.scene_input == 'CAMERA':
|
|
|
|
|
layout.template_ID(strip, "scene_camera", text="Camera")
|
2019-05-17 00:28:22 +10:00
|
|
|
|
2021-03-20 01:29:08 +01:00
|
|
|
if strip.scene_input == 'CAMERA':
|
|
|
|
|
layout = layout.column(heading="Show")
|
2021-05-20 19:36:53 +02:00
|
|
|
layout.prop(strip, "use_annotations", text="Annotations")
|
2016-03-18 20:03:24 +11:00
|
|
|
if scene:
|
|
|
|
|
# Warning, this is not a good convention to follow.
|
2023-04-18 10:42:00 +10:00
|
|
|
# Expose here because setting the alpha from the "Render" menu is very inconvenient.
|
2019-05-20 18:08:18 +02:00
|
|
|
layout.prop(scene.render, "film_transparent")
|
2016-03-18 20:03:24 +11:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2023-11-21 08:09:18 +01:00
|
|
|
class SEQUENCER_PT_scene_sound(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Sound"
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2023-11-21 08:09:18 +01:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return (strip.type == 'SCENE')
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2023-11-21 08:09:18 +01:00
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
|
|
|
|
|
col.use_property_decorate = True
|
|
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Strip Volume", text_ctxt=i18n_contexts.id_sound)
|
|
|
|
|
split.prop(strip, "volume", text="")
|
|
|
|
|
col.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
|
2012-06-07 18:24:36 +00:00
|
|
|
class SEQUENCER_PT_mask(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Mask"
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2012-06-07 18:24:36 +00:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2012-06-07 18:24:36 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return (strip.type == 'MASK')
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2012-06-07 18:24:36 +00:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2012-06-07 18:24:36 +00:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2012-06-07 18:24:36 +00:00
|
|
|
layout.template_ID(strip, "mask")
|
|
|
|
|
|
|
|
|
|
mask = strip.mask
|
|
|
|
|
|
|
|
|
|
if mask:
|
|
|
|
|
sta = mask.frame_start
|
|
|
|
|
end = mask.frame_end
|
2024-04-27 16:02:36 +10:00
|
|
|
layout.label(
|
|
|
|
|
text=rpt_("Original frame range: {:d}-{:d} ({:d})").format(sta, end, end - sta + 1),
|
|
|
|
|
translate=False,
|
|
|
|
|
)
|
2012-06-07 18:24:36 +00:00
|
|
|
|
|
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Time"
|
2019-06-20 19:11:39 +02:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-05-16 13:58:04 +02:00
|
|
|
bl_category = "Strip"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return strip.type
|
|
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
def draw_header_preset(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.alignment = 'RIGHT'
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-06-21 11:22:56 +02:00
|
|
|
|
|
|
|
|
layout.prop(strip, "lock", text="", icon_only=True, emboss=False)
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
def draw(self, context):
|
2019-06-21 07:32:03 +10:00
|
|
|
from bpy.utils import smpte_from_frame
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = False
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
scene = context.sequencer_scene
|
2019-05-16 13:58:04 +02:00
|
|
|
frame_current = scene.frame_current
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2025-01-16 12:32:59 +01:00
|
|
|
is_effect = isinstance(strip, bpy.types.EffectStrip)
|
2019-07-10 13:59:01 +10:00
|
|
|
|
|
|
|
|
# Get once.
|
|
|
|
|
frame_start = strip.frame_start
|
|
|
|
|
frame_final_start = strip.frame_final_start
|
|
|
|
|
frame_final_end = strip.frame_final_end
|
|
|
|
|
frame_final_duration = strip.frame_final_duration
|
|
|
|
|
frame_offset_start = strip.frame_offset_start
|
|
|
|
|
frame_offset_end = strip.frame_offset_end
|
|
|
|
|
|
2019-05-17 00:28:22 +10:00
|
|
|
length_list = (
|
2023-01-28 00:25:56 +01:00
|
|
|
str(round(frame_start, 0)),
|
|
|
|
|
str(round(frame_final_end, 0)),
|
|
|
|
|
str(round(frame_final_duration, 0)),
|
|
|
|
|
str(round(frame_offset_start, 0)),
|
|
|
|
|
str(round(frame_offset_end, 0)),
|
2019-05-17 00:28:22 +10:00
|
|
|
)
|
2019-05-19 11:29:21 -07:00
|
|
|
|
2019-07-10 13:59:01 +10:00
|
|
|
if not is_effect:
|
2019-05-19 11:29:21 -07:00
|
|
|
length_list = length_list + (
|
2023-01-28 00:25:56 +01:00
|
|
|
str(round(strip.animation_offset_start, 0)),
|
|
|
|
|
str(round(strip.animation_offset_end, 0)),
|
2019-05-19 11:29:21 -07:00
|
|
|
)
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
max_length = max(len(x) for x in length_list)
|
2019-05-17 00:28:22 +10:00
|
|
|
max_factor = (1.9 - max_length) / 30
|
2023-10-04 19:27:28 +02:00
|
|
|
factor = 0.45
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.enabled = not strip.lock
|
|
|
|
|
layout.active = not strip.mute
|
2019-06-20 19:11:39 +02:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
sub = layout.row(align=True)
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="")
|
|
|
|
|
split.prop(strip, "show_retiming_keys")
|
|
|
|
|
|
|
|
|
|
sub = layout.row(align=True)
|
|
|
|
|
split = sub.split(factor=factor + max_factor)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:39:56 +10:00
|
|
|
split.label(text="Channel")
|
2019-05-16 13:58:04 +02:00
|
|
|
split.prop(strip, "channel", text="")
|
|
|
|
|
|
|
|
|
|
sub = layout.column(align=True)
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Start")
|
2019-07-10 13:59:01 +10:00
|
|
|
split.prop(strip, "frame_start", text=smpte_from_frame(frame_start))
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:48:03 +10:00
|
|
|
split.label(text="Duration")
|
2019-07-10 13:59:01 +10:00
|
|
|
split.prop(strip, "frame_final_duration", text=smpte_from_frame(frame_final_duration))
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2019-07-10 13:48:03 +10:00
|
|
|
# Use label, editing this value from the UI allows negative values,
|
|
|
|
|
# users can adjust duration.
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:48:03 +10:00
|
|
|
split.label(text="End")
|
2023-10-04 19:27:28 +02:00
|
|
|
split = split.split(factor=factor + 0.3 + max_factor, align=True)
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
split.label(text="{:>14s}".format(smpte_from_frame(frame_final_end)), translate=False)
|
2019-07-10 13:48:03 +10:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:59:01 +10:00
|
|
|
split.label(text=str(frame_final_end) + " ")
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-07-10 13:59:01 +10:00
|
|
|
if not is_effect:
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.alignment = 'RIGHT'
|
|
|
|
|
sub = layout.column(align=True)
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-06-13 15:54:45 +02:00
|
|
|
split.label(text="Strip Offset Start")
|
2019-07-10 13:59:01 +10:00
|
|
|
split.prop(strip, "frame_offset_start", text=smpte_from_frame(frame_offset_start))
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:39:56 +10:00
|
|
|
split.label(text="End")
|
2019-07-10 13:59:01 +10:00
|
|
|
split.prop(strip, "frame_offset_end", text=smpte_from_frame(frame_offset_end))
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
layout.alignment = 'RIGHT'
|
|
|
|
|
sub = layout.column(align=True)
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-06-13 15:54:45 +02:00
|
|
|
split.label(text="Hold Offset Start")
|
2019-06-21 07:32:03 +10:00
|
|
|
split.prop(strip, "animation_offset_start", text=smpte_from_frame(strip.animation_offset_start))
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = sub.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2019-07-10 13:39:56 +10:00
|
|
|
split.label(text="End")
|
2019-06-21 07:32:03 +10:00
|
|
|
split.prop(strip, "animation_offset_end", text=smpte_from_frame(strip.animation_offset_end))
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2025-03-25 21:50:05 +01:00
|
|
|
if strip.type == 'SOUND':
|
|
|
|
|
sub2 = layout.column(align=True)
|
|
|
|
|
split = sub2.split(factor=factor + max_factor, align=True)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Sound Offset", text_ctxt=i18n_contexts.id_sound)
|
|
|
|
|
split.prop(strip, "sound_offset", text="")
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col = col.box()
|
2019-05-22 00:27:01 +10:00
|
|
|
col.active = (
|
2019-07-10 13:59:01 +10:00
|
|
|
(frame_current >= frame_final_start) and
|
|
|
|
|
(frame_current <= frame_final_start + frame_final_duration)
|
2019-05-22 00:27:01 +10:00
|
|
|
)
|
2019-06-13 15:54:45 +02:00
|
|
|
|
2023-10-04 19:27:28 +02:00
|
|
|
split = col.split(factor=factor + max_factor, align=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2020-07-01 19:54:12 +10:00
|
|
|
split.label(text="Current Frame")
|
2023-10-04 19:27:28 +02:00
|
|
|
split = split.split(factor=factor + 0.3 + max_factor, align=True)
|
2020-06-01 14:41:12 +10:00
|
|
|
frame_display = frame_current - frame_final_start
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
split.label(text="{:>14s}".format(smpte_from_frame(frame_display)), translate=False)
|
2019-06-13 15:54:45 +02:00
|
|
|
split.alignment = 'RIGHT'
|
2020-06-01 14:41:12 +10:00
|
|
|
split.label(text=str(frame_display) + " ")
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-05-22 00:27:01 +10:00
|
|
|
if strip.type == 'SCENE':
|
2019-05-16 13:58:04 +02:00
|
|
|
scene = strip.scene
|
|
|
|
|
|
|
|
|
|
if scene:
|
|
|
|
|
sta = scene.frame_start
|
|
|
|
|
end = scene.frame_end
|
2023-10-04 19:27:28 +02:00
|
|
|
split = col.split(factor=factor + max_factor)
|
2019-05-16 13:58:04 +02:00
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Original Frame Range")
|
|
|
|
|
split.alignment = 'LEFT'
|
2024-04-27 16:02:36 +10:00
|
|
|
split.label(text="{:d}-{:d} ({:d})".format(sta, end, end - sta + 1), translate=False)
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_adjust_sound(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Sound"
|
2019-05-16 15:02:15 +02:00
|
|
|
bl_category = "Strip"
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2020-11-02 22:15:52 +01:00
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2020-11-02 22:15:52 +01:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
return strip.type == 'SOUND'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = st.timeline_overlay
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
sound = strip.sound
|
|
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
if sound is not None:
|
2021-10-04 21:59:20 +02:00
|
|
|
layout.use_property_split = True
|
2021-08-19 22:21:22 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
|
|
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.alignment = 'RIGHT'
|
2023-02-23 22:00:57 +01:00
|
|
|
split.label(text="Volume", text_ctxt=i18n_contexts.id_sound)
|
2021-08-19 22:21:22 +02:00
|
|
|
split.prop(strip, "volume", text="")
|
|
|
|
|
|
2024-06-19 18:08:30 +02:00
|
|
|
layout.use_property_split = False
|
|
|
|
|
col = layout.column()
|
|
|
|
|
|
|
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.label(text="")
|
|
|
|
|
split.prop(sound, "use_mono")
|
|
|
|
|
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
col = layout.column()
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
audio_channels = context.sequencer_scene.render.ffmpeg.audio_channels
|
2021-10-07 00:04:26 +02:00
|
|
|
pan_enabled = sound.use_mono and audio_channels != 'MONO'
|
2024-04-27 16:02:36 +10:00
|
|
|
pan_text = "{:.2f}°".format(strip.pan * 90.0)
|
2021-10-07 00:04:26 +02:00
|
|
|
|
2021-08-19 22:21:22 +02:00
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.alignment = 'RIGHT'
|
2023-02-09 16:25:39 +01:00
|
|
|
split.label(text="Pan", text_ctxt=i18n_contexts.id_sound)
|
2021-10-07 00:04:26 +02:00
|
|
|
split.prop(strip, "pan", text="")
|
|
|
|
|
split.enabled = pan_enabled
|
|
|
|
|
|
2023-04-13 13:14:05 +10:00
|
|
|
if audio_channels not in {'MONO', 'STEREO'}:
|
2021-10-07 00:04:26 +02:00
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Pan Angle")
|
|
|
|
|
split.enabled = pan_enabled
|
|
|
|
|
subsplit = split.row()
|
|
|
|
|
subsplit.alignment = 'CENTER'
|
|
|
|
|
subsplit.label(text=pan_text)
|
|
|
|
|
subsplit.label(text=" ") # Compensate for no decorate.
|
|
|
|
|
subsplit.enabled = pan_enabled
|
2021-08-19 22:21:22 +02:00
|
|
|
|
2021-10-04 21:59:20 +02:00
|
|
|
layout.use_property_split = False
|
|
|
|
|
col = layout.column()
|
|
|
|
|
|
|
|
|
|
if overlay_settings.waveform_display_type == 'DEFAULT_WAVEFORMS':
|
|
|
|
|
split = col.split(factor=0.4)
|
|
|
|
|
split.label(text="")
|
|
|
|
|
split.prop(strip, "show_waveform")
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
class SEQUENCER_PT_adjust_comp(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Compositing"
|
2019-05-16 15:02:15 +02:00
|
|
|
bl_category = "Strip"
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2020-11-02 22:15:52 +01:00
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2020-11-02 22:15:52 +01:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
return strip.type != 'SOUND'
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
2019-05-16 13:58:04 +02:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(strip, "blend_type", text="Blend")
|
|
|
|
|
col.prop(strip, "blend_alpha", text="Opacity", slider=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
class SEQUENCER_PT_adjust_transform(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Transform"
|
|
|
|
|
bl_category = "Strip"
|
2020-11-02 22:15:52 +01:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-06-20 19:11:39 +02:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-06-20 19:11:39 +02:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2020-11-02 22:15:52 +01:00
|
|
|
return strip.type != 'SOUND'
|
2019-06-20 19:11:39 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2020-11-02 22:15:52 +01:00
|
|
|
layout = self.layout
|
2020-11-02 20:59:21 +01:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.active = not strip.mute
|
2020-11-02 19:53:33 +01:00
|
|
|
|
2022-02-07 10:31:39 +01:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.transform, "filter", text="Filter")
|
|
|
|
|
|
2020-11-02 22:15:52 +01:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.transform, "offset_x", text="Position X")
|
|
|
|
|
col.prop(strip.transform, "offset_y", text="Y")
|
|
|
|
|
|
|
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.transform, "scale_x", text="Scale X")
|
|
|
|
|
col.prop(strip.transform, "scale_y", text="Y")
|
|
|
|
|
|
|
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.transform, "rotation", text="Rotation")
|
|
|
|
|
|
2021-09-21 09:38:30 +02:00
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.prop(strip.transform, "origin")
|
|
|
|
|
|
2025-06-28 16:34:42 +02:00
|
|
|
col = layout.column(heading="Mirror", align=True, heading_ctxt=i18n_contexts.id_image)
|
2022-06-13 22:31:44 +02:00
|
|
|
col.prop(strip, "use_flip_x", text="X", toggle=True)
|
|
|
|
|
col.prop(strip, "use_flip_y", text="Y", toggle=True)
|
2019-06-20 19:11:39 +02:00
|
|
|
|
|
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
class SEQUENCER_PT_adjust_video(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Video"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if not cls.has_sequencer(context):
|
2009-10-31 19:31:45 +00:00
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2017-10-09 13:47:05 +11:00
|
|
|
return strip.type in {
|
|
|
|
|
'MOVIE', 'IMAGE', 'SCENE', 'MOVIECLIP', 'MASK',
|
|
|
|
|
'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER',
|
|
|
|
|
'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
|
2025-02-10 16:10:01 +01:00
|
|
|
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
|
2022-12-15 17:24:23 +11:00
|
|
|
'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
|
2017-10-09 13:47:05 +11:00
|
|
|
}
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-06-20 19:11:39 +02:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
col.prop(strip, "strobe")
|
2019-09-05 21:40:21 +10:00
|
|
|
col.prop(strip, "use_reverse_frames")
|
2019-03-20 10:44:13 +11:00
|
|
|
|
2019-06-21 07:32:03 +10:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
class SEQUENCER_PT_adjust_color(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Color"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
|
bl_category = "Strip"
|
2019-04-28 14:13:41 -07:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
2019-05-16 13:58:04 +02:00
|
|
|
if not cls.has_sequencer(context):
|
|
|
|
|
return False
|
2019-04-28 14:13:41 -07:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-05-16 13:58:04 +02:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
2019-04-28 14:13:41 -07:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
return strip.type in {
|
|
|
|
|
'MOVIE', 'IMAGE', 'SCENE', 'MOVIECLIP', 'MASK',
|
|
|
|
|
'META', 'ADD', 'SUBTRACT', 'ALPHA_OVER',
|
|
|
|
|
'ALPHA_UNDER', 'CROSS', 'GAMMA_CROSS', 'MULTIPLY',
|
2025-02-10 16:10:01 +01:00
|
|
|
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
|
2022-12-15 17:24:23 +11:00
|
|
|
'MULTICAM', 'SPEED', 'ADJUSTMENT', 'COLORMIX',
|
2019-05-16 13:58:04 +02:00
|
|
|
}
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2019-02-28 15:10:19 -08:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2019-02-28 15:10:19 -08:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2019-02-28 15:10:19 -08:00
|
|
|
|
2019-06-21 11:22:56 +02:00
|
|
|
layout.active = not strip.mute
|
|
|
|
|
|
2019-02-28 15:10:19 -08:00
|
|
|
col = layout.column()
|
2019-05-16 13:58:04 +02:00
|
|
|
col.prop(strip, "color_saturation", text="Saturation")
|
|
|
|
|
col.prop(strip, "color_multiply", text="Multiply")
|
2023-10-23 02:37:41 +02:00
|
|
|
col.prop(strip, "multiply_alpha")
|
2019-05-16 13:58:04 +02:00
|
|
|
col.prop(strip, "use_float", text="Convert to Float")
|
2019-02-28 15:10:19 -08:00
|
|
|
|
|
|
|
|
|
2019-05-17 11:31:49 +02:00
|
|
|
class SEQUENCER_PT_cache_settings(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Cache Settings"
|
2021-01-08 07:24:55 +01:00
|
|
|
bl_category = "Cache"
|
2019-05-17 11:31:49 +02:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return cls.has_sequencer(context) and context.sequencer_scene and context.sequencer_scene.sequence_editor
|
2019-05-17 11:31:49 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-06-20 19:11:39 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2019-05-17 11:31:49 +02:00
|
|
|
|
2025-05-16 16:58:58 +02:00
|
|
|
col = layout.column()
|
|
|
|
|
if ed:
|
|
|
|
|
col.prop(ed, "use_prefetch")
|
|
|
|
|
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col = layout.column(heading="Cache", align=True)
|
2019-06-20 19:11:39 +02:00
|
|
|
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col.prop(ed, "use_cache_raw", text="Raw")
|
|
|
|
|
col.prop(ed, "use_cache_final", text="Final")
|
2019-05-17 11:31:49 +02:00
|
|
|
|
|
|
|
|
|
2024-05-02 16:36:11 +02:00
|
|
|
class SEQUENCER_PT_cache_view_settings(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Display"
|
|
|
|
|
bl_category = "Cache"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_cache_settings"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return cls.has_sequencer(context) and context.sequencer_scene and context.sequencer_scene.sequence_editor
|
2024-05-02 16:36:11 +02:00
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
|
|
|
|
cache_settings = context.space_data.cache_overlay
|
|
|
|
|
|
|
|
|
|
self.layout.prop(cache_settings, "show_cache", text="")
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
cache_settings = context.space_data.cache_overlay
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2024-05-02 16:36:11 +02:00
|
|
|
layout.active = cache_settings.show_cache
|
|
|
|
|
|
|
|
|
|
col = layout.column(heading="Cache", align=True)
|
|
|
|
|
|
|
|
|
|
show_developer_ui = context.preferences.view.show_developer_ui
|
|
|
|
|
if show_developer_ui:
|
|
|
|
|
col.prop(cache_settings, "show_cache_raw", text="Raw")
|
|
|
|
|
col.prop(cache_settings, "show_cache_final_out", text="Final")
|
|
|
|
|
|
2025-05-14 12:59:46 +02:00
|
|
|
show_cache_size = show_developer_ui and (ed.use_cache_raw or ed.use_cache_final)
|
|
|
|
|
if show_cache_size:
|
|
|
|
|
cache_raw_size = ed.cache_raw_size
|
|
|
|
|
cache_final_size = ed.cache_final_size
|
|
|
|
|
|
|
|
|
|
col = layout.box()
|
|
|
|
|
col = col.column(align=True)
|
|
|
|
|
|
|
|
|
|
split = col.split(factor=0.4, align=True)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Current Cache Size")
|
|
|
|
|
split.alignment = 'LEFT'
|
2025-06-30 20:31:55 +02:00
|
|
|
split.label(text=iface_("{:d} MB").format(cache_raw_size + cache_final_size), translate=False)
|
2025-05-14 12:59:46 +02:00
|
|
|
|
|
|
|
|
split = col.split(factor=0.4, align=True)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Raw")
|
|
|
|
|
split.alignment = 'LEFT'
|
2025-06-30 20:31:55 +02:00
|
|
|
split.label(text=iface_("{:d} MB").format(cache_raw_size), translate=False)
|
2025-05-14 12:59:46 +02:00
|
|
|
|
|
|
|
|
split = col.split(factor=0.4, align=True)
|
|
|
|
|
split.alignment = 'RIGHT'
|
|
|
|
|
split.label(text="Final")
|
|
|
|
|
split.alignment = 'LEFT'
|
2025-06-30 20:31:55 +02:00
|
|
|
split.label(text=iface_("{:d} MB").format(cache_final_size), translate=False)
|
2025-05-14 12:59:46 +02:00
|
|
|
|
2024-05-02 16:36:11 +02:00
|
|
|
|
2019-05-17 11:31:49 +02:00
|
|
|
class SEQUENCER_PT_proxy_settings(SequencerButtonsPanel, Panel):
|
2019-05-19 11:29:21 -07:00
|
|
|
bl_label = "Proxy Settings"
|
2021-01-08 07:24:55 +01:00
|
|
|
bl_category = "Proxy"
|
2019-05-19 11:29:21 -07:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return cls.has_sequencer(context) and context.sequencer_scene and context.sequencer_scene.sequence_editor
|
2019-05-19 11:29:21 -07:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
2019-06-20 19:11:39 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2019-05-19 11:29:21 -07:00
|
|
|
flow = layout.column_flow()
|
|
|
|
|
flow.prop(ed, "proxy_storage", text="Storage")
|
|
|
|
|
|
|
|
|
|
if ed.proxy_storage == 'PROJECT':
|
|
|
|
|
flow.prop(ed, "proxy_dir", text="Directory")
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.operator("sequencer.enable_proxies")
|
|
|
|
|
col.operator("sequencer.rebuild_proxy")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_strip_proxy(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Strip Proxy & Timecode"
|
2021-01-08 07:24:55 +01:00
|
|
|
bl_category = "Proxy"
|
2019-05-17 11:31:49 +02:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if not cls.has_sequencer(context) or not context.sequencer_scene or not context.sequencer_scene.sequence_editor:
|
2009-10-31 19:31:45 +00:00
|
|
|
return False
|
|
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
if not strip:
|
|
|
|
|
return False
|
|
|
|
|
|
2021-01-25 04:42:46 +01:00
|
|
|
return strip.type in {'MOVIE', 'IMAGE'}
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
self.layout.prop(strip, "use_proxy", text="")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2015-03-26 17:54:16 +01:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
2009-10-31 19:31:45 +00:00
|
|
|
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
if strip.proxy:
|
2015-03-24 12:24:30 +01:00
|
|
|
proxy = strip.proxy
|
|
|
|
|
|
2019-05-19 11:29:21 -07:00
|
|
|
if ed.proxy_storage == 'PER_STRIP':
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col = layout.column(heading="Custom Proxy")
|
|
|
|
|
col.prop(proxy, "use_proxy_custom_directory", text="Directory")
|
2015-03-26 17:54:16 +01:00
|
|
|
if proxy.use_proxy_custom_directory and not proxy.use_proxy_custom_file:
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col.prop(proxy, "directory")
|
|
|
|
|
col.prop(proxy, "use_proxy_custom_file", text="File")
|
2015-03-26 17:54:16 +01:00
|
|
|
if proxy.use_proxy_custom_file:
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
col.prop(proxy, "filepath")
|
2015-03-26 15:44:51 +01:00
|
|
|
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
row = layout.row(heading="Resolutions", align=True)
|
|
|
|
|
row.prop(strip.proxy, "build_25", toggle=True)
|
|
|
|
|
row.prop(strip.proxy, "build_50", toggle=True)
|
2020-05-14 02:53:10 +02:00
|
|
|
row.prop(strip.proxy, "build_75", toggle=True)
|
UI: Layout changes for new checkbox layout possibilities
Follow-up to previous commit.
Some examples:
{F8473507} {F8473508} {F8473509} {F8473510}
For more screenshots, please see D7430.
We use column or row headings here to bring more structure, and to give
the eye visual anchors which aid eye-scanning. The left-aligned
checkboxes likewise help with this. And we keep the adherence to the
center line, so the alignment matches up between the various buttons and
controls.
* Changes the property split percentage from 50/50% to 40/60%. This is
needed to give enough space for the checkboxes. But in most cases this
looks better anyway - see Transform panel. In some cases it simply
fills out the available space more efficently.
* Fix various hacks where we previously used manually defined splits.
When we did this, the alignment was never quite right, and the layout
code was a mess.
* Adds column headings to many places where a list of checkboxes all
share a common purpose or leading text.
* Add checkbox + value configurations various places where a checkbox
only serves to enable the value slider
* Removes most uses of grid flow layout. The grid flow layouts combine
poorly with column headings, and also they would mess alignment up
badly. The grid flow layouts also often made buttons and controls jump
around on the screen if you would just resize editors slightly,
causing visual confusion, making users lose their place. The logic for
at what time the list of items would re-flow was often flawed, jumping
to multiple columns too fast or too late - and frankly, the grid flow
layouts would often just look bad.
Maniphest Task: https://developer.blender.org/T65965
Differential Revision: https://developer.blender.org/D7430
Reviewed by: Brecht Van Lommel, Pablo Vazquez.
Most work here by William Reynish, few changes by Julian Eisel.
2020-04-17 16:54:03 +02:00
|
|
|
row.prop(strip.proxy, "build_100", toggle=True)
|
2019-05-16 13:58:04 +02:00
|
|
|
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2015-04-21 11:57:31 +02:00
|
|
|
|
|
|
|
|
layout.prop(proxy, "use_overwrite")
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
|
|
|
|
|
col = layout.column()
|
2021-06-03 19:39:28 +02:00
|
|
|
col.prop(proxy, "quality", text="Quality")
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
|
2012-07-04 21:41:05 +00:00
|
|
|
if strip.type == 'MOVIE':
|
== Sequencer ==
This patch adds:
* support for proxy building again (missing feature from Blender 2.49)
additionally to the way, Blender 2.49 worked, you can select several
strips at once and make Blender build proxies in the background (using
the job system)
Also a new thing: movie proxies are now build into AVI files, and
the proxy system is moved into ImBuf-library, so that other parts
of blender can also benefit from it.
* Timecode support: to fix seeking issues with files, that have
a) varying frame rates
b) very large GOP lengths
c) are broken inbetween
d) use different time code tracks
the proxy builder can now also build timecode indices, which are
used (optionally) for seeking.
For the first time, it is possible, to do frame exact seeking on
all file types.
* Support for different video-streams in one video file (can be
selected in sequencer, other parts of blender can also use it,
but UI has to be added accordingly)
* IMPORTANT: this patch *requires* ffmpeg 0.7 or newer, since
older versions don't support the pkt_pts field, that is essential
for building timecode indices.
Windows and Mac libs are already updated, Linux-users have to build
their own ffmpeg verions until distros keep up.
2011-08-28 14:46:03 +00:00
|
|
|
col = layout.column()
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
col.prop(proxy, "timecode", text="Timecode Index")
|
2019-04-28 14:13:41 -07:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, Panel):
|
2020-05-28 12:42:44 -04:00
|
|
|
bl_label = "Scene Strip Display"
|
2010-07-28 07:52:05 +00:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2019-05-17 13:38:34 +02:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-05-17 11:31:49 +02:00
|
|
|
bl_category = "View"
|
2010-07-28 07:52:05 +00:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
return SequencerButtonsPanel_Output.poll(context) and context.sequencer_scene
|
|
|
|
|
|
2010-07-28 07:52:05 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2019-06-21 07:32:03 +10:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
render = context.sequencer_scene.render
|
2010-07-28 07:52:05 +00:00
|
|
|
|
|
|
|
|
col = layout.column()
|
2020-05-28 12:42:44 -04:00
|
|
|
col.prop(render, "sequencer_gl_preview", text="Shading")
|
2010-07-28 07:52:05 +00:00
|
|
|
|
2019-08-27 19:17:28 +10:00
|
|
|
if render.sequencer_gl_preview in {'SOLID', 'WIREFRAME'}:
|
2019-04-25 16:24:06 +02:00
|
|
|
col.prop(render, "use_sequencer_override_scene_strip")
|
2017-11-24 12:19:26 +01:00
|
|
|
|
2010-07-28 07:52:05 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View Settings"
|
2019-05-16 15:02:15 +02:00
|
|
|
bl_category = "View"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
2009-06-09 16:19:34 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
st = context.space_data
|
2019-09-13 17:21:54 -07:00
|
|
|
ed = context.scene.sequence_editor
|
2009-06-09 16:19:34 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
col = layout.column()
|
2021-03-16 17:59:30 +01:00
|
|
|
col.prop(st, "proxy_render_size")
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
2021-03-23 16:08:53 +11:00
|
|
|
if st.proxy_render_size in {'NONE', 'SCENE'}:
|
2021-03-16 17:59:30 +01:00
|
|
|
col.enabled = False
|
2025-08-23 08:04:47 +02:00
|
|
|
col.prop(st, "use_proxies")
|
2021-03-16 17:59:30 +01:00
|
|
|
|
2025-08-23 08:04:47 +02:00
|
|
|
col = layout.column()
|
2019-05-17 13:38:34 +02:00
|
|
|
col.prop(st, "display_channel", text="Channel")
|
|
|
|
|
|
2010-04-11 18:37:49 +00:00
|
|
|
if st.display_mode == 'IMAGE':
|
2018-09-03 18:58:41 +02:00
|
|
|
col.prop(st, "show_overexposed")
|
2015-01-19 16:30:35 +11:00
|
|
|
|
2024-04-24 19:54:44 +02:00
|
|
|
if ed:
|
|
|
|
|
col.prop(ed, "show_missing_media")
|
|
|
|
|
|
2012-08-19 15:41:56 +00:00
|
|
|
|
2021-10-07 12:32:04 +11:00
|
|
|
class SEQUENCER_PT_view_cursor(SequencerButtonsPanel_Output, Panel):
|
|
|
|
|
bl_category = "View"
|
|
|
|
|
bl_label = "2D Cursor"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
|
|
|
|
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(st, "cursor_location", text="Location")
|
|
|
|
|
|
|
|
|
|
|
2019-05-17 13:38:34 +02:00
|
|
|
class SEQUENCER_PT_frame_overlay(SequencerButtonsPanel_Output, Panel):
|
|
|
|
|
bl_label = "Frame Overlay"
|
|
|
|
|
bl_category = "View"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
|
|
2020-05-06 18:10:42 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
if not context.sequencer_scene or not context.sequencer_scene.sequence_editor:
|
2020-05-06 18:10:42 +02:00
|
|
|
return False
|
|
|
|
|
return SequencerButtonsPanel_Output.poll(context)
|
|
|
|
|
|
2019-05-17 13:38:34 +02:00
|
|
|
def draw_header(self, context):
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
scene = context.sequencer_scene
|
2019-05-17 13:38:34 +02:00
|
|
|
ed = scene.sequence_editor
|
|
|
|
|
|
2021-10-18 15:47:28 +11:00
|
|
|
self.layout.prop(ed, "show_overlay_frame", text="")
|
2019-05-17 13:38:34 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-08-06 16:56:14 +10:00
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_PREVIEW'
|
|
|
|
|
layout.operator("sequencer.view_ghost_border", text="Set Overlay Region")
|
|
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
|
|
|
|
2019-05-17 13:38:34 +02:00
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
st = context.space_data
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
scene = context.sequencer_scene
|
2019-05-17 13:38:34 +02:00
|
|
|
ed = scene.sequence_editor
|
|
|
|
|
|
2021-10-18 15:47:28 +11:00
|
|
|
layout.active = ed.show_overlay_frame
|
2019-05-17 13:38:34 +02:00
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(ed, "overlay_frame", text="Frame Offset")
|
2021-10-18 15:47:28 +11:00
|
|
|
col.prop(st, "overlay_frame_type")
|
|
|
|
|
col.prop(ed, "use_overlay_frame_lock")
|
2019-05-17 13:38:34 +02:00
|
|
|
|
|
|
|
|
|
2015-01-19 16:30:35 +11:00
|
|
|
class SEQUENCER_PT_view_safe_areas(SequencerButtonsPanel_Output, Panel):
|
|
|
|
|
bl_label = "Safe Areas"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-05-17 11:31:49 +02:00
|
|
|
bl_category = "View"
|
2015-01-19 16:30:35 +11:00
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
is_preview = st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return is_preview and (st.display_mode == 'IMAGE') and context.sequencer_scene
|
2015-01-19 16:30:35 +11:00
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = context.space_data.preview_overlay
|
|
|
|
|
self.layout.prop(overlay_settings, "show_safe_areas", text="")
|
2015-01-19 16:30:35 +11:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 14:14:13 +02:00
|
|
|
layout.use_property_split = True
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = context.space_data.preview_overlay
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
safe_data = context.sequencer_scene.safe_areas
|
2019-05-16 14:14:13 +02:00
|
|
|
|
2021-09-20 16:21:40 +02:00
|
|
|
layout.active = overlay_settings.show_safe_areas
|
2019-05-16 14:14:13 +02:00
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
|
|
|
|
|
sub = col.column()
|
|
|
|
|
sub.prop(safe_data, "title", slider=True)
|
|
|
|
|
sub.prop(safe_data, "action", slider=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_view_safe_areas_center_cut(SequencerButtonsPanel_Output, Panel):
|
|
|
|
|
bl_label = "Center-Cut Safe Areas"
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_view_safe_areas"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2019-05-17 11:31:49 +02:00
|
|
|
bl_category = "View"
|
2019-05-16 13:58:04 +02:00
|
|
|
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
return SequencerButtonsPanel_Output.poll(context) and context.sequencer_scene
|
|
|
|
|
|
2019-05-16 14:14:13 +02:00
|
|
|
def draw_header(self, context):
|
|
|
|
|
layout = self.layout
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = context.space_data.preview_overlay
|
|
|
|
|
layout.active = overlay_settings.show_safe_areas
|
|
|
|
|
layout.prop(overlay_settings, "show_safe_center", text="")
|
2019-05-16 14:14:13 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
safe_data = context.sequencer_scene.safe_areas
|
2021-09-20 16:21:40 +02:00
|
|
|
overlay_settings = context.space_data.preview_overlay
|
2015-01-19 16:30:35 +11:00
|
|
|
|
2021-09-20 16:21:40 +02:00
|
|
|
layout.active = overlay_settings.show_safe_areas and overlay_settings.show_safe_center
|
2019-05-16 14:14:13 +02:00
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.prop(safe_data, "title_center", slider=True)
|
2023-07-12 08:28:30 +02:00
|
|
|
col.prop(safe_data, "action_center", slider=True)
|
2015-01-19 16:30:35 +11:00
|
|
|
|
|
|
|
|
|
2012-08-19 15:41:56 +00:00
|
|
|
class SEQUENCER_PT_modifiers(SequencerButtonsPanel, Panel):
|
|
|
|
|
bl_label = "Modifiers"
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Modifiers"
|
2012-08-19 15:41:56 +00:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2019-05-16 13:58:04 +02:00
|
|
|
layout.use_property_split = True
|
2012-08-19 15:41:56 +00:00
|
|
|
|
2025-01-21 11:30:20 +01:00
|
|
|
strip = context.active_strip
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
ed = context.sequencer_scene.sequence_editor
|
2023-08-30 22:36:36 +02:00
|
|
|
if strip.type == 'SOUND':
|
|
|
|
|
sound = strip.sound
|
|
|
|
|
else:
|
|
|
|
|
sound = None
|
2012-08-19 15:41:56 +00:00
|
|
|
|
2023-08-30 22:36:36 +02:00
|
|
|
if sound is None:
|
2024-07-31 14:07:22 +02:00
|
|
|
layout.prop(strip, "use_linear_modifiers", text="Linear Modifiers")
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
|
2012-08-19 15:41:56 +00:00
|
|
|
layout.operator_menu_enum("sequencer.strip_modifier_add", "type")
|
2015-06-15 21:23:09 +02:00
|
|
|
layout.operator("sequencer.strip_modifier_copy")
|
2012-08-19 15:41:56 +00:00
|
|
|
|
|
|
|
|
for mod in strip.modifiers:
|
|
|
|
|
box = layout.box()
|
|
|
|
|
|
|
|
|
|
row = box.row()
|
2020-04-27 00:12:35 +02:00
|
|
|
row.use_property_decorate = False
|
2012-08-19 15:41:56 +00:00
|
|
|
row.prop(mod, "show_expanded", text="", emboss=False)
|
2012-08-23 09:04:30 +00:00
|
|
|
row.prop(mod, "name", text="")
|
2012-08-19 15:41:56 +00:00
|
|
|
|
|
|
|
|
row.prop(mod, "mute", text="")
|
2020-04-27 00:12:35 +02:00
|
|
|
row.use_property_decorate = True
|
2012-08-23 09:04:30 +00:00
|
|
|
|
|
|
|
|
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'
|
|
|
|
|
|
2013-08-23 20:41:21 +00:00
|
|
|
row.operator("sequencer.strip_modifier_remove", text="", icon='X', emboss=False).name = mod.name
|
2012-08-19 15:41:56 +00:00
|
|
|
|
|
|
|
|
if mod.show_expanded:
|
2023-08-30 22:36:36 +02:00
|
|
|
if sound is None:
|
|
|
|
|
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', show_tone=True)
|
|
|
|
|
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")
|
2016-01-19 15:53:43 +01:00
|
|
|
col.prop(mod, "contrast")
|
2023-08-30 22:36:36 +02:00
|
|
|
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")
|
2024-08-01 11:28:58 +02:00
|
|
|
|
|
|
|
|
box.separator(type='LINE')
|
|
|
|
|
|
|
|
|
|
col = box.column()
|
|
|
|
|
row = col.row()
|
|
|
|
|
row.prop(mod, "input_mask_type", expand=True)
|
|
|
|
|
|
|
|
|
|
if mod.input_mask_type == 'STRIP':
|
|
|
|
|
sequences_object = ed
|
|
|
|
|
if ed.meta_stack:
|
|
|
|
|
sequences_object = ed.meta_stack[-1]
|
2025-01-21 11:30:20 +01:00
|
|
|
col.prop_search(mod, "input_mask_strip", sequences_object, "strips", text="Mask")
|
2024-08-01 11:28:58 +02:00
|
|
|
else:
|
|
|
|
|
col.prop(mod, "input_mask_id")
|
|
|
|
|
row = col.row()
|
|
|
|
|
row.prop(mod, "mask_time", expand=True)
|
2023-08-30 22:36:36 +02:00
|
|
|
else:
|
|
|
|
|
if mod.type == 'SOUND_EQUALIZER':
|
2024-03-07 13:26:58 +11:00
|
|
|
# eq_row = box.row()
|
2023-08-30 22:36:36 +02:00
|
|
|
# eq_graphs = eq_row.operator_menu_enum("sequencer.strip_modifier_equalizer_redefine", "graphs")
|
|
|
|
|
# eq_graphs.name = mod.name
|
2023-09-01 14:31:09 +10:00
|
|
|
flow = box.grid_flow(
|
|
|
|
|
row_major=True,
|
|
|
|
|
columns=0,
|
|
|
|
|
even_columns=True,
|
|
|
|
|
even_rows=False,
|
|
|
|
|
align=False,
|
|
|
|
|
)
|
|
|
|
|
for sound_eq in mod.graphics:
|
2023-08-30 22:36:36 +02:00
|
|
|
col = flow.column()
|
|
|
|
|
box = col.box()
|
|
|
|
|
split = box.split(factor=0.4)
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
split.label(text="{:.2f}".format(sound_eq.curve_mapping.clip_min_x), translate=False)
|
2023-08-31 13:00:03 +02:00
|
|
|
split.label(text="Hz")
|
2024-05-03 11:25:06 +10:00
|
|
|
split.alignment = 'RIGHT'
|
I18n: extract and disambiguate a few messages
Extract
- Add to Quick Favorites tooltip.
- "Mask", the name of a newly created mask (DATA_).
- "New" in the context of the new mask ID button.
- A few strings using BLI_STR_UTF8_ defines were not extracted.
Take the special characters out of the translation macros.
- "External" menu items from the filebrowser's Files context
menu (right-click on a file). These items were already extracted,
but not translated.
Improve
- Separate formatted error message "%s is not compatible with
["the specified", "any"] 'refresh' options" into two messages.
Disambiguate
- Use Action context for new F-modifiers' names. This is already used
for the "type" operator prop.
- Translate ImportHelper's default confirmation text using the
Operator context, as it uses the operator name which is extracted
with this context.
- "Scale" can be a noun, the scale of something, or a verb, to scale
something. The latter mostly uses the Operator context, so apply
this context to verbs, and the default contexts to nouns.
- "Scale Influence" can mean "Influence on Scale" (tracking
stabilization) and "to Scale the Influence" (dynamic paint canvas).
- "Object Line Art" as type of Line Art to add, as opposed to the
active object's Line Art settings.
- Float to Integer node: use NodeTree context for the node label, as
this is already extracted and used for the enum.
Do not translate
- Sequencer labels containing only a string formatting field.
Some issues reported by Gabriel Gazzán and Ye Gui.
Pull Request: https://projects.blender.org/blender/blender/pulls/122283
2024-05-27 19:33:35 +02:00
|
|
|
split.label(text="{:.2f}".format(sound_eq.curve_mapping.clip_max_x), translate=False)
|
2023-08-31 13:00:03 +02:00
|
|
|
box.template_curve_mapping(
|
2023-09-01 14:31:09 +10:00
|
|
|
sound_eq,
|
2023-08-31 13:00:03 +02:00
|
|
|
"curve_mapping",
|
|
|
|
|
type='NONE',
|
|
|
|
|
levels=False,
|
|
|
|
|
brush=True,
|
|
|
|
|
use_negative_slope=True,
|
2023-09-01 14:31:09 +10:00
|
|
|
show_tone=False,
|
|
|
|
|
)
|
2023-08-30 22:36:36 +02:00
|
|
|
second_row = col.row()
|
2023-08-31 13:00:03 +02:00
|
|
|
second_row.label(text="dB")
|
2023-09-01 14:31:09 +10:00
|
|
|
second_row.alignment = 'CENTER'
|
2012-08-19 15:41:56 +00:00
|
|
|
|
2016-02-01 00:47:10 +11:00
|
|
|
|
2019-07-29 12:39:19 +02:00
|
|
|
class SEQUENCER_PT_annotation(AnnotationDataPanel, SequencerButtonsPanel_Output, Panel):
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
2019-05-16 15:02:15 +02:00
|
|
|
bl_category = "View"
|
2018-11-28 19:19:01 +01:00
|
|
|
|
2019-07-29 22:43:09 +02:00
|
|
|
@staticmethod
|
|
|
|
|
def has_preview(context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
return st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
return cls.has_preview(context)
|
|
|
|
|
|
2018-11-28 19:19:01 +01:00
|
|
|
# NOTE: this is just a wrapper around the generic GP Panel
|
|
|
|
|
# But, it should only show up when there are images in the preview region
|
|
|
|
|
|
|
|
|
|
|
2020-04-18 10:47:25 +02:00
|
|
|
class SEQUENCER_PT_annotation_onion(AnnotationOnionSkin, SequencerButtonsPanel_Output, Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'UI'
|
|
|
|
|
bl_category = "View"
|
2024-02-05 12:41:16 +01:00
|
|
|
bl_parent_id = "SEQUENCER_PT_annotation"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2020-04-18 10:47:25 +02:00
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def has_preview(context):
|
|
|
|
|
st = context.space_data
|
|
|
|
|
return st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
if context.annotation_data_owner is None:
|
|
|
|
|
return False
|
|
|
|
|
elif type(context.annotation_data_owner) is bpy.types.Object:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
gpl = context.active_annotation_layer
|
|
|
|
|
if gpl is None:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return cls.has_preview(context)
|
|
|
|
|
|
|
|
|
|
# NOTE: this is just a wrapper around the generic GP Panel
|
|
|
|
|
# But, it should only show up when there are images in the preview region
|
|
|
|
|
|
|
|
|
|
|
2015-04-02 21:05:12 +11:00
|
|
|
class SEQUENCER_PT_custom_props(SequencerButtonsPanel, PropertyPanel, Panel):
|
2024-10-30 13:20:01 +11:00
|
|
|
COMPAT_ENGINES = {
|
|
|
|
|
'BLENDER_RENDER',
|
|
|
|
|
'BLENDER_WORKBENCH',
|
|
|
|
|
}
|
2025-01-21 11:30:20 +01:00
|
|
|
_context_path = "active_strip"
|
2025-01-06 14:19:24 +01:00
|
|
|
_property_type = (bpy.types.Strip,)
|
2017-01-12 01:03:23 -05:00
|
|
|
bl_category = "Strip"
|
2015-04-02 21:05:12 +11:00
|
|
|
|
|
|
|
|
|
2025-05-22 10:17:19 +02:00
|
|
|
class SEQUENCER_PT_playhead_snapping(PlayheadSnappingPanel, Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
|
|
|
|
|
|
2021-06-29 20:12:19 +02:00
|
|
|
class SEQUENCER_PT_snapping(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_label = ""
|
2025-03-12 03:36:32 +01:00
|
|
|
bl_ui_units_x = 11
|
2021-06-29 20:12:19 +02:00
|
|
|
|
2024-07-06 15:24:52 +02:00
|
|
|
def draw(self, _context):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_preview_snapping(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_snapping"
|
|
|
|
|
bl_label = "Preview Snapping"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'} and context.tool_settings
|
2024-07-06 15:24:52 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
|
sequencer_tool_settings = tool_settings.sequencer_tool_settings
|
|
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
col = layout.column(heading="Snap to", align=True)
|
|
|
|
|
col.prop(sequencer_tool_settings, "snap_to_borders")
|
|
|
|
|
col.prop(sequencer_tool_settings, "snap_to_center")
|
|
|
|
|
col.prop(sequencer_tool_settings, "snap_to_strips_preview")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SEQUENCER_PT_sequencer_snapping(Panel):
|
|
|
|
|
bl_space_type = 'SEQUENCE_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_parent_id = "SEQUENCER_PT_snapping"
|
|
|
|
|
bl_label = "Sequencer Snapping"
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
st = context.space_data
|
VSE: Scene Selector & Scene Time Synchronization
Implements the proposed design (with some modifications) in #135058.
## Sequencer Scene
This adds a new property called `sequencer_scene` to workspaces. This scene is used
by the video sequence editors in the current workspace for their context.
This is a first step towards "detaching" the VSE from the active scene in the window.
Each sequencer timeline editor shows the sequencer scene that is being used.
By default, when no sequencer scene is selected, the timeline and preview are empty.
Pressing the "new" button will add a new scene and assign it to the sequencer
scene for the current workspace.
## Contextual Playback
Pressing `Space` (by default) for starting the animation playback is now contextual:
depending on the context (where your mouse cursor is), the scene that is played back
might be different. E.g. with a 3D Viewport and a Sequencer open, pressing "play"
in the 3D Viewport will play the _active scene_ of the window, while pressing "play"
in the sequencer will play the _sequencer scene_.
## Time & Scene Synchronization
Additionally, this adds a toggle called "Sync Active Scene".
With the property turned on, the active scene & scene time in the window will be
synced with the time & scene of the current scene strip in the sequencer.
Note that this is _not_ bi-directional. The sequencer can change the active scene
and map time, but it's not possible the other way around since it one can have
multiple strips using the same scene (+camera, and even time!).
Currently this setting is exposed in the footer of the sequencer timeline as well
as in the workspace settings.
This allows for one of the core concepts that the story tools projects aims at: Working
in a scene (e.g. in the 3D viewport) while also working with the edit
(in the sequencer timeline).
## Some technical notes
* Undoing while playback is running will now cancel playback. This is to avoid the timer,
that points to the scene and viewlayer that are playing, to get de-synced after loading
the memfile undo step.
* When the sequencer scene is not the same as the active scene, we ensure it has
a depsgraph.
* Normally, when a `NC_SCENE` notifier points to a specific scene, the notifier is dropped
if that scene doesn't match the active one in the window. We now also check that it
doesn't match the sequencer scene in the active workspace.
* When loading older files, we need to make sure that the active workspace in a window
uses the active scene as the sequencer scene. This is to make sure that the file opens with
the same sequences open.
* Tool settings are stored per scene. To make sure the sequencer uses the tool settings for
the sequencer scene, the "context.tool_settings" and `CTX_data_tool_settings` members
are overridden in the sequence editors.
Pull Request: https://projects.blender.org/blender/blender/pulls/140271
2025-08-25 11:58:17 +02:00
|
|
|
return st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'} and context.tool_settings
|
2024-07-06 15:24:52 +02:00
|
|
|
|
2021-06-29 20:12:19 +02:00
|
|
|
def draw(self, context):
|
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
|
sequencer_tool_settings = tool_settings.sequencer_tool_settings
|
|
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
layout.use_property_split = True
|
|
|
|
|
layout.use_property_decorate = False
|
|
|
|
|
|
|
|
|
|
col = layout.column(heading="Snap to", align=True)
|
2025-03-12 03:36:32 +01:00
|
|
|
col.prop(sequencer_tool_settings, "snap_to_frame_range")
|
2021-07-06 12:05:27 +10:00
|
|
|
col.prop(sequencer_tool_settings, "snap_to_current_frame")
|
2021-07-01 22:08:11 +02:00
|
|
|
col.prop(sequencer_tool_settings, "snap_to_hold_offset")
|
2024-04-23 01:54:14 +02:00
|
|
|
col.prop(sequencer_tool_settings, "snap_to_markers")
|
2024-11-06 05:43:34 +01:00
|
|
|
col.prop(sequencer_tool_settings, "snap_to_retiming_keys")
|
2021-06-29 20:12:19 +02:00
|
|
|
|
|
|
|
|
col = layout.column(heading="Ignore", align=True)
|
|
|
|
|
col.prop(sequencer_tool_settings, "snap_ignore_muted", text="Muted Strips")
|
2021-07-06 12:05:27 +10:00
|
|
|
col.prop(sequencer_tool_settings, "snap_ignore_sound", text="Sound Strips")
|
2021-06-29 20:12:19 +02:00
|
|
|
|
|
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
classes = (
|
2019-01-15 18:33:37 +01:00
|
|
|
SEQUENCER_MT_change,
|
2020-01-22 14:54:44 +01:00
|
|
|
SEQUENCER_HT_tool_header,
|
2017-03-18 20:03:24 +11:00
|
|
|
SEQUENCER_HT_header,
|
2025-06-19 15:54:53 +02:00
|
|
|
SEQUENCER_HT_playback_controls,
|
2017-03-18 20:03:24 +11:00
|
|
|
SEQUENCER_MT_editor_menus,
|
2019-05-20 18:04:35 +02:00
|
|
|
SEQUENCER_MT_range,
|
2017-03-18 20:03:24 +11:00
|
|
|
SEQUENCER_MT_view,
|
2019-08-09 15:35:42 +02:00
|
|
|
SEQUENCER_MT_preview_zoom,
|
2020-06-01 05:32:36 +02:00
|
|
|
SEQUENCER_MT_proxy,
|
2019-05-20 18:04:35 +02:00
|
|
|
SEQUENCER_MT_select_handle,
|
|
|
|
|
SEQUENCER_MT_select_channel,
|
2017-03-20 02:34:32 +11:00
|
|
|
SEQUENCER_MT_select,
|
|
|
|
|
SEQUENCER_MT_marker,
|
2019-05-18 10:05:13 +02:00
|
|
|
SEQUENCER_MT_navigation,
|
2017-03-20 02:34:32 +11:00
|
|
|
SEQUENCER_MT_add,
|
2022-05-16 19:46:20 +02:00
|
|
|
SEQUENCER_MT_add_scene,
|
2017-03-20 02:34:32 +11:00
|
|
|
SEQUENCER_MT_add_effect,
|
2018-11-08 16:01:02 +01:00
|
|
|
SEQUENCER_MT_add_transitions,
|
|
|
|
|
SEQUENCER_MT_add_empty,
|
2019-05-22 14:59:04 +02:00
|
|
|
SEQUENCER_MT_strip_effect,
|
VSE: Improve "Change Effect Type" operator
- Previously, effects could be changed into types that take different
amount of inputs, e.g. from "add" to "glow", which led to undefined
and glitchy behavior (unreported bug). Fix by requiring same input count
for new effect.
- Previously, strip names were not updated when changing effect type,
which tended to be confusing. Now, if the default name was not changed,
update to the new effect type name.
- Remove "effect strip" menu from color and text strips. Although they
are effects internally, to a user, this is not clear, and providing the
option to modify effect inputs in these cases doesn't really make sense.
Pull Request: https://projects.blender.org/blender/blender/pulls/139514
2025-05-29 20:28:20 +02:00
|
|
|
SEQUENCER_MT_strip_effect_change,
|
2019-05-22 14:59:04 +02:00
|
|
|
SEQUENCER_MT_strip_movie,
|
2017-03-20 02:34:32 +11:00
|
|
|
SEQUENCER_MT_strip,
|
2017-10-09 13:47:05 +11:00
|
|
|
SEQUENCER_MT_strip_transform,
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
SEQUENCER_MT_strip_retiming,
|
2024-12-19 15:48:06 +01:00
|
|
|
SEQUENCER_MT_strip_text,
|
2025-04-22 08:18:21 +02:00
|
|
|
SEQUENCER_MT_strip_show_hide,
|
2025-06-25 02:56:55 +02:00
|
|
|
SEQUENCER_MT_strip_animation,
|
2025-08-17 14:01:40 +02:00
|
|
|
SEQUENCER_MT_strip_mirror,
|
2017-10-09 13:47:05 +11:00
|
|
|
SEQUENCER_MT_strip_input,
|
|
|
|
|
SEQUENCER_MT_strip_lock_mute,
|
2021-10-25 22:19:04 -04:00
|
|
|
SEQUENCER_MT_image,
|
|
|
|
|
SEQUENCER_MT_image_transform,
|
|
|
|
|
SEQUENCER_MT_image_clear,
|
|
|
|
|
SEQUENCER_MT_image_apply,
|
2021-09-29 14:29:32 +02:00
|
|
|
SEQUENCER_MT_color_tag_picker,
|
2019-05-07 21:07:52 +02:00
|
|
|
SEQUENCER_MT_context_menu,
|
2021-10-06 14:45:34 +11:00
|
|
|
SEQUENCER_MT_preview_context_menu,
|
2021-10-07 12:32:04 +11:00
|
|
|
SEQUENCER_MT_pivot_pie,
|
VSE: Improve retiming UI
Currently retiming is quite awkward, when you need to retime multiple
strips strips in sync. It is possible to use meta strips, but this is
still not great. This is resolved by implementing selection.
General changes:
Gizmos are removed, since they are designed to operate only on active
strip and don't support selection.
Transform operator code is implemented for retiming data, which allows
more sophisticated manipulation.
Instead of drawing marker-like symbols, keyframes are drawn to
represent retiming data. Retiming handles are now called keys. To have
consistent names, DNA structures have been renamed.
Retiming data is drawn on strip as overlay.
UI changes:
Retiming tool is removed. To edit retiming data, press Ctrl + R, select
a key and move it. When retiming is edited, retiming menu and
context menu shows more relevant features, like making transitions.
Strip and retiming key selection can not be combined. It is possible to
use box select operator to select keys, if any key is selected.
Otherwise strips are selected.
Adding retiming keys is possible with I shortcut or from menu.
Retiming keys are always drawn at strip left and right boundary. These
keys do not really exist until they are selected. This is to simplify
retiming of strips that are resized. These keys are called "fake keys"
in code.
API changes:
Functions, properties and types related to retiming handles are renamed
to retiming keys:
retiming_handle_add() -> retiming_key_add()
retiming_handle_move() -> retiming_key_move()
retiming_handle_remove() -> retiming_key_remove()
retiming_handles -> retiming_keys
RetimingHandle -> RetimingKey
Retiming editing "mode" is activated by setting `Sequence.show_retiming_keys`.
Pull Request: https://projects.blender.org/blender/blender/pulls/109044
2023-09-27 01:45:59 +02:00
|
|
|
SEQUENCER_MT_retiming,
|
UI: Introduce View pie in more editors
#### Motivation
The View pie menu is a convenient way to access operators such as `Frame Selected` and `Frame All` which are usually mapped to `PERIOD` or `HOME` keys on the right side of most keyboard, making it hard hard to reach with the left hand.
The motivation for this patch comes from working with a 75% keyboard (no numpad). Most laptops face a similar problem.
#### Implementation
The View pie menu has been added to the following editors and sub-modes where applicable:
* Node Editor
* Video Sequencer
* Dopesheet
* Graph
* NLA
* Image
* Clip
* Outliner
More options could definitely be added to this menu for convenience, as long as it maintains the common options in the same place (Frame Selected on the left, Frame All on the right).
For positioning I went with the following layout:
{F11791186, size=full}
I've added `Zoom 1:1`to the Image Editor and the VSE Preview since there is no way to reset the zoom on keyboards without numpad (unless Emulate Numpad is turned on).
The Outliner uses `Show Active` and `Show Hierarchy` which are the closest ones to the equivalent in other editors. Should `Show Active` be renamed to `Frame Selected`?
The shortcut assigned is the same as the 3D Viewport (`ACCENT_GRAVE`).
#### Screenshots
Node Editor
{F11778387, size=full}
Dopesheet
{F11778400, size=full}
Graph
{F11778403, size=full}
Image Editor (Paint and View)
{F11791113, size=full}
Image Editor (Mask)
{F11791114, size=full}
UV Editor
{F11791119, size=full}
Clip Editor (Tracking)
{F11791137, size=full}
Clip Editor (Mask)
{F11791140, size=full}
Clip Editor (Graph)
{F11791151, size=full}
View operators are not yet implemented in Clip Editor Dopesheet mode (left a note about this in the menu poll).
Reviewed By: #user_interface, campbellbarton
Differential Revision: https://developer.blender.org/D13169
2021-11-10 02:17:24 +01:00
|
|
|
SEQUENCER_MT_view_pie,
|
|
|
|
|
SEQUENCER_MT_preview_view_pie,
|
2020-05-28 12:53:06 -04:00
|
|
|
|
2021-09-29 14:29:32 +02:00
|
|
|
SEQUENCER_PT_color_tag_picker,
|
|
|
|
|
|
2020-01-22 14:54:44 +01:00
|
|
|
SEQUENCER_PT_active_tool,
|
2019-06-21 11:22:56 +02:00
|
|
|
SEQUENCER_PT_strip,
|
|
|
|
|
|
2021-10-08 17:07:56 +11:00
|
|
|
SEQUENCER_PT_gizmo_display,
|
2020-12-15 23:15:32 +01:00
|
|
|
SEQUENCER_PT_overlay,
|
|
|
|
|
SEQUENCER_PT_preview_overlay,
|
|
|
|
|
SEQUENCER_PT_sequencer_overlay,
|
2024-05-13 12:25:35 +02:00
|
|
|
SEQUENCER_PT_sequencer_overlay_strips,
|
|
|
|
|
SEQUENCER_PT_sequencer_overlay_waveforms,
|
2020-12-15 23:15:32 +01:00
|
|
|
|
2019-08-19 20:50:52 +10:00
|
|
|
SEQUENCER_PT_effect,
|
2020-05-28 12:53:06 -04:00
|
|
|
SEQUENCER_PT_scene,
|
2023-11-21 08:09:18 +01:00
|
|
|
SEQUENCER_PT_scene_sound,
|
2020-05-28 12:53:06 -04:00
|
|
|
SEQUENCER_PT_mask,
|
|
|
|
|
SEQUENCER_PT_effect_text_style,
|
2024-11-21 09:45:04 +01:00
|
|
|
SEQUENCER_PT_effect_text_outline,
|
|
|
|
|
SEQUENCER_PT_effect_text_shadow,
|
|
|
|
|
SEQUENCER_PT_effect_text_box,
|
2020-05-28 12:53:06 -04:00
|
|
|
SEQUENCER_PT_effect_text_layout,
|
2024-06-14 17:46:12 +02:00
|
|
|
SEQUENCER_PT_movie_clip,
|
2020-05-28 12:53:06 -04:00
|
|
|
|
2019-05-16 13:58:04 +02:00
|
|
|
SEQUENCER_PT_adjust_comp,
|
2019-06-20 19:11:39 +02:00
|
|
|
SEQUENCER_PT_adjust_transform,
|
2020-11-02 22:15:52 +01:00
|
|
|
SEQUENCER_PT_adjust_crop,
|
2019-05-16 13:58:04 +02:00
|
|
|
SEQUENCER_PT_adjust_video,
|
|
|
|
|
SEQUENCER_PT_adjust_color,
|
|
|
|
|
SEQUENCER_PT_adjust_sound,
|
|
|
|
|
|
2019-06-21 20:01:08 +02:00
|
|
|
SEQUENCER_PT_time,
|
|
|
|
|
SEQUENCER_PT_source,
|
|
|
|
|
|
2019-06-20 19:11:39 +02:00
|
|
|
SEQUENCER_PT_modifiers,
|
|
|
|
|
|
2019-05-17 11:31:49 +02:00
|
|
|
SEQUENCER_PT_cache_settings,
|
2024-05-02 16:36:11 +02:00
|
|
|
SEQUENCER_PT_cache_view_settings,
|
2019-05-19 11:29:21 -07:00
|
|
|
SEQUENCER_PT_proxy_settings,
|
|
|
|
|
SEQUENCER_PT_strip_proxy,
|
2019-05-17 11:31:49 +02:00
|
|
|
|
|
|
|
|
SEQUENCER_PT_custom_props,
|
|
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
SEQUENCER_PT_view,
|
2021-10-07 12:32:04 +11:00
|
|
|
SEQUENCER_PT_view_cursor,
|
2019-05-17 13:38:34 +02:00
|
|
|
SEQUENCER_PT_frame_overlay,
|
2017-03-18 20:03:24 +11:00
|
|
|
SEQUENCER_PT_view_safe_areas,
|
2019-05-16 14:14:13 +02:00
|
|
|
SEQUENCER_PT_view_safe_areas_center_cut,
|
2020-05-28 12:42:44 -04:00
|
|
|
SEQUENCER_PT_preview,
|
2019-05-17 00:28:22 +10:00
|
|
|
|
2019-07-29 12:39:19 +02:00
|
|
|
SEQUENCER_PT_annotation,
|
2020-04-18 10:47:25 +02:00
|
|
|
SEQUENCER_PT_annotation_onion,
|
2021-06-29 20:12:19 +02:00
|
|
|
|
|
|
|
|
SEQUENCER_PT_snapping,
|
2024-07-06 15:24:52 +02:00
|
|
|
SEQUENCER_PT_preview_snapping,
|
|
|
|
|
SEQUENCER_PT_sequencer_snapping,
|
2025-05-22 10:17:19 +02:00
|
|
|
SEQUENCER_PT_playhead_snapping,
|
2017-03-18 20:03:24 +11:00
|
|
|
)
|
|
|
|
|
|
2011-04-04 10:13:04 +00:00
|
|
|
if __name__ == "__main__": # only for live edit.
|
2017-03-18 20:03:24 +11:00
|
|
|
from bpy.utils import register_class
|
|
|
|
|
for cls in classes:
|
|
|
|
|
register_class(cls)
|