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
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
from bpy.types import Header, Menu, Panel
|
2025-01-05 13:10:17 +01:00
|
|
|
from bpy.app.translations import contexts as i18n_contexts
|
2019-06-11 16:08:32 +10:00
|
|
|
from bl_ui.space_dopesheet import (
|
2018-06-26 21:12:25 +12:00
|
|
|
DopesheetFilterPopoverBase,
|
|
|
|
|
dopesheet_filter,
|
2018-06-26 22:56:39 +02:00
|
|
|
)
|
2009-12-07 11:50:05 +00:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_HT_header(Header):
|
2009-12-08 07:11:43 +00:00
|
|
|
bl_space_type = 'GRAPH_EDITOR'
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2018-12-17 17:20:24 +11:00
|
|
|
tool_settings = context.tool_settings
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
st = context.space_data
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2019-04-21 04:49:19 +10:00
|
|
|
layout.template_header()
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2018-06-20 18:45:56 +02:00
|
|
|
# Now a exposed as a sub-space type
|
|
|
|
|
# layout.prop(st, "mode", text="")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2018-04-23 12:01:59 +02:00
|
|
|
GRAPH_MT_editor_menus.draw_collapsible(context, layout)
|
|
|
|
|
|
2017-02-09 17:04:21 +13:00
|
|
|
row = layout.row(align=True)
|
2017-02-09 18:59:51 +13:00
|
|
|
row.prop(st, "use_normalization", icon='NORMALIZE_FCURVES', text="Normalize", toggle=True)
|
2017-02-09 17:04:21 +13:00
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.active = st.use_normalization
|
2017-02-09 18:59:51 +13:00
|
|
|
sub.prop(st, "use_auto_normalization", icon='FILE_REFRESH', text="", toggle=True)
|
2013-10-29 18:10:52 +00:00
|
|
|
|
2018-06-11 16:57:35 +02:00
|
|
|
layout.separator_spacer()
|
2015-04-09 18:29:58 +02:00
|
|
|
|
2018-07-02 14:45:55 +02:00
|
|
|
dopesheet_filter(layout, context)
|
|
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
|
if st.has_ghost_curves:
|
2019-05-19 20:23:58 +02:00
|
|
|
row.operator("graph.ghost_curves_clear", text="", icon='X')
|
2018-07-02 14:45:55 +02:00
|
|
|
else:
|
2019-05-19 20:23:58 +02:00
|
|
|
row.operator("graph.ghost_curves_create", text="", icon='FCURVE_SNAPSHOT')
|
2018-07-02 14:45:55 +02:00
|
|
|
|
|
|
|
|
layout.popover(
|
2018-07-13 19:13:44 +02:00
|
|
|
panel="GRAPH_PT_filters",
|
2018-07-02 14:45:55 +02:00
|
|
|
text="",
|
|
|
|
|
icon='FILTER',
|
|
|
|
|
)
|
|
|
|
|
|
2019-02-26 20:24:40 +01:00
|
|
|
layout.prop(st, "pivot_point", icon_only=True)
|
|
|
|
|
|
2023-09-05 10:06:55 +02:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
row.prop(tool_settings, "use_snap_anim", text="")
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.popover(
|
|
|
|
|
panel="GRAPH_PT_snapping",
|
2023-09-26 20:28:57 +02:00
|
|
|
text="",
|
2023-09-05 10:06:55 +02:00
|
|
|
)
|
2018-07-02 15:53:46 +02:00
|
|
|
|
2018-06-11 16:57:35 +02:00
|
|
|
row = layout.row(align=True)
|
2018-12-17 17:26:47 +11:00
|
|
|
row.prop(tool_settings, "use_proportional_fcurve", text="", icon_only=True)
|
2018-06-11 16:57:35 +02:00
|
|
|
sub = row.row(align=True)
|
2018-12-17 17:26:47 +11:00
|
|
|
sub.active = tool_settings.use_proportional_fcurve
|
2023-05-04 16:39:22 +02:00
|
|
|
sub.prop_with_popover(
|
|
|
|
|
tool_settings,
|
|
|
|
|
"proportional_edit_falloff",
|
|
|
|
|
text="",
|
|
|
|
|
icon_only=True,
|
|
|
|
|
panel="GRAPH_PT_proportional_edit",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GRAPH_PT_proportional_edit(Panel):
|
|
|
|
|
bl_space_type = 'GRAPH_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_label = "Proportional Editing"
|
|
|
|
|
bl_ui_units_x = 8
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.active = tool_settings.use_proportional_fcurve
|
|
|
|
|
|
|
|
|
|
col.prop(tool_settings, "proportional_edit_falloff", expand=True)
|
|
|
|
|
col.prop(tool_settings, "proportional_size")
|
2015-03-27 15:23:39 +01:00
|
|
|
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
class GRAPH_PT_filters(DopesheetFilterPopoverBase, Panel):
|
|
|
|
|
bl_space_type = 'GRAPH_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_label = "Filters"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2023-11-14 18:14:01 +02:00
|
|
|
st = context.space_data
|
2018-06-26 21:12:25 +12:00
|
|
|
|
|
|
|
|
DopesheetFilterPopoverBase.draw_generic_filters(context, layout)
|
|
|
|
|
layout.separator()
|
|
|
|
|
DopesheetFilterPopoverBase.draw_search_filters(context, layout)
|
|
|
|
|
layout.separator()
|
|
|
|
|
DopesheetFilterPopoverBase.draw_standard_filters(context, layout)
|
|
|
|
|
|
2023-11-14 18:14:01 +02:00
|
|
|
if st.mode == 'DRIVERS':
|
|
|
|
|
layout.separator()
|
|
|
|
|
col = layout.column(align=True)
|
|
|
|
|
col.label(text="Drivers:")
|
|
|
|
|
col.prop(st.dopesheet, "show_driver_fallback_as_error")
|
|
|
|
|
|
2023-09-05 14:23:54 +02:00
|
|
|
|
2023-09-05 10:06:55 +02:00
|
|
|
class GRAPH_PT_snapping(Panel):
|
|
|
|
|
bl_space_type = 'GRAPH_EDITOR'
|
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
|
bl_label = "Snapping"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
col = layout.column()
|
|
|
|
|
col.label(text="Snap To")
|
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
|
col.prop(tool_settings, "snap_anim_element", expand=True)
|
2023-10-05 13:53:20 +11:00
|
|
|
if tool_settings.snap_anim_element != 'MARKER':
|
2023-09-05 10:06:55 +02:00
|
|
|
col.prop(tool_settings, "use_snap_time_absolute")
|
|
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
class GRAPH_MT_editor_menus(Menu):
|
|
|
|
|
bl_idname = "GRAPH_MT_editor_menus"
|
|
|
|
|
bl_label = ""
|
|
|
|
|
|
2019-12-12 13:43:37 +11:00
|
|
|
def draw(self, context):
|
|
|
|
|
st = context.space_data
|
2018-12-20 12:02:21 +11:00
|
|
|
layout = self.layout
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("GRAPH_MT_view")
|
|
|
|
|
layout.menu("GRAPH_MT_select")
|
2019-11-30 17:03:22 +11:00
|
|
|
if st.mode != 'DRIVERS' and st.show_markers:
|
|
|
|
|
layout.menu("GRAPH_MT_marker")
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("GRAPH_MT_channel")
|
|
|
|
|
layout.menu("GRAPH_MT_key")
|
|
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_view(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
st = context.space_data
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2019-04-18 12:16:03 +02:00
|
|
|
layout.prop(st, "show_region_ui")
|
2019-12-04 16:00:03 +01:00
|
|
|
layout.prop(st, "show_region_hud")
|
2024-02-05 12:13:31 +01:00
|
|
|
layout.prop(st, "show_region_channels")
|
2010-01-20 11:20:20 +00:00
|
|
|
layout.separator()
|
2010-01-31 14:46:28 +00:00
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.operator("graph.view_selected")
|
|
|
|
|
layout.operator("graph.view_all")
|
2024-05-30 17:19:10 +02:00
|
|
|
if context.scene.use_preview_range:
|
|
|
|
|
layout.operator("anim.scene_range_frame", text="Frame Preview Range")
|
|
|
|
|
else:
|
|
|
|
|
layout.operator("anim.scene_range_frame", text="Frame Scene Range")
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.operator("graph.view_frame")
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2010-08-17 07:49:53 +00:00
|
|
|
layout.prop(st, "use_realtime_update")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.prop(st, "show_sliders")
|
2010-08-17 07:49:53 +00:00
|
|
|
layout.prop(st, "use_auto_merge_keyframes")
|
2024-02-16 14:26:47 +11:00
|
|
|
layout.prop(st, "use_auto_lock_translation_axis")
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.separator()
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2019-11-30 17:03:22 +11:00
|
|
|
if st.mode != 'DRIVERS':
|
|
|
|
|
layout.prop(st, "show_markers")
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.prop(st, "show_cursor")
|
|
|
|
|
layout.prop(st, "show_seconds")
|
|
|
|
|
layout.prop(st, "show_locked_time")
|
|
|
|
|
layout.separator()
|
2019-11-30 17:03:22 +11:00
|
|
|
|
2021-03-09 15:09:09 -05:00
|
|
|
layout.prop(st, "show_extrapolation")
|
2012-01-14 16:26:08 +00:00
|
|
|
layout.prop(st, "show_handles")
|
2010-08-17 07:49:53 +00:00
|
|
|
layout.prop(st, "use_only_selected_keyframe_handles")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2024-01-23 12:11:22 +01:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.operator("anim.previewrange_set")
|
|
|
|
|
layout.operator("anim.previewrange_clear")
|
|
|
|
|
layout.operator("graph.previewrange_set")
|
|
|
|
|
layout.separator()
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2018-11-29 19:07:00 +11:00
|
|
|
# Add this to show key-binding (reverse action in dope-sheet).
|
|
|
|
|
props = layout.operator("wm.context_set_enum", text="Toggle Dope Sheet")
|
|
|
|
|
props.data_path = "area.type"
|
|
|
|
|
props.value = 'DOPESHEET_EDITOR'
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2024-01-23 12:11:22 +01:00
|
|
|
|
2018-05-24 18:35:19 +02:00
|
|
|
layout.menu("INFO_MT_area")
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_select(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2009-12-08 07:11:43 +00:00
|
|
|
layout = self.layout
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2018-07-03 15:44:56 +02:00
|
|
|
layout.operator("graph.select_all", text="All").action = 'SELECT'
|
|
|
|
|
layout.operator("graph.select_all", text="None").action = 'DESELECT'
|
|
|
|
|
layout.operator("graph.select_all", text="Invert").action = 'INVERT'
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2018-07-03 15:44:56 +02:00
|
|
|
|
2020-02-17 20:55:23 +11:00
|
|
|
layout.operator("graph.select_box")
|
2019-08-06 16:10:48 +10:00
|
|
|
props = layout.operator("graph.select_box", text="Box Select (Axis Range)")
|
2015-01-29 17:34:05 +01:00
|
|
|
props.axis_range = True
|
2019-08-06 16:10:48 +10:00
|
|
|
props = layout.operator("graph.select_box", text="Box Select (Include Handles)")
|
2015-01-29 17:34:05 +01:00
|
|
|
props.include_handles = True
|
2016-06-23 19:36:24 +12:00
|
|
|
layout.operator("graph.select_circle")
|
2021-09-17 12:09:30 +10:00
|
|
|
layout.operator_menu_enum("graph.select_lasso", "mode")
|
2016-06-23 19:36:24 +12:00
|
|
|
|
2024-05-13 16:27:23 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.select_more", text="More")
|
|
|
|
|
layout.operator("graph.select_less", text="Less")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.select_linked")
|
|
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("graph.select_column", text="Columns on Selected Keys").mode = 'KEYS'
|
|
|
|
|
layout.operator("graph.select_column", text="Column on Current Frame").mode = 'CFRA'
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("graph.select_column", text="Columns on Selected Markers").mode = 'MARKERS_COLUMN'
|
|
|
|
|
layout.operator("graph.select_column", text="Between Selected Markers").mode = 'MARKERS_BETWEEN'
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2011-02-14 02:50:52 +00:00
|
|
|
layout.separator()
|
2015-01-29 17:34:05 +01:00
|
|
|
props = layout.operator("graph.select_leftright", text="Before Current Frame")
|
|
|
|
|
props.extend = False
|
|
|
|
|
props.mode = 'LEFT'
|
|
|
|
|
props = layout.operator("graph.select_leftright", text="After Current Frame")
|
|
|
|
|
props.extend = False
|
|
|
|
|
props.mode = 'RIGHT'
|
2011-02-14 02:50:52 +00:00
|
|
|
|
2023-09-21 15:05:30 +02:00
|
|
|
layout.separator()
|
|
|
|
|
props = layout.operator("graph.select_key_handles", text="Select Handles")
|
|
|
|
|
props.left_handle_action = 'SELECT'
|
|
|
|
|
props.right_handle_action = 'SELECT'
|
|
|
|
|
props.key_action = 'KEEP'
|
|
|
|
|
props = layout.operator("graph.select_key_handles", text="Select Key")
|
|
|
|
|
props.left_handle_action = 'DESELECT'
|
|
|
|
|
props.right_handle_action = 'DESELECT'
|
|
|
|
|
props.key_action = 'SELECT'
|
|
|
|
|
|
2011-01-13 23:00:51 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_marker(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Marker"
|
2011-01-13 23:00:51 +00:00
|
|
|
|
2011-01-06 04:47:57 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2011-01-13 23:00:51 +00:00
|
|
|
|
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)
|
2011-01-13 23:00:51 +00:00
|
|
|
|
2011-01-06 04:47:57 +00:00
|
|
|
# TODO: pose markers for action edit mode only?
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2011-01-13 23:00:51 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_channel(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Channel"
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2023-05-04 14:10:27 +02:00
|
|
|
operator_context = layout.operator_context
|
2010-02-07 23:39:44 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_CHANNELS'
|
|
|
|
|
|
2010-09-13 00:53:47 +00:00
|
|
|
layout.operator("anim.channels_delete")
|
2023-05-04 14:10:27 +02:00
|
|
|
|
2018-01-17 12:12:37 +01:00
|
|
|
if context.space_data.mode == 'DRIVERS':
|
|
|
|
|
layout.operator("graph.driver_delete_invalid")
|
2010-09-13 00:53:47 +00:00
|
|
|
|
2013-02-22 01:49:51 +00:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("anim.channels_group")
|
|
|
|
|
layout.operator("anim.channels_ungroup")
|
|
|
|
|
|
2010-09-13 00:53:47 +00:00
|
|
|
layout.separator()
|
2012-11-20 02:03:20 +00:00
|
|
|
layout.operator_menu_enum("anim.channels_setting_toggle", "type")
|
|
|
|
|
layout.operator_menu_enum("anim.channels_setting_enable", "type")
|
|
|
|
|
layout.operator_menu_enum("anim.channels_setting_disable", "type")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("anim.channels_editable_toggle")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("graph.extrapolation_type", "type", text="Extrapolation Mode")
|
2023-05-04 14:10:27 +02:00
|
|
|
# To get it to display the hotkey.
|
|
|
|
|
layout.operator_context = operator_context
|
|
|
|
|
layout.operator_menu_enum("graph.fmodifier_add", "type").only_active = False
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_CHANNELS'
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2014-11-20 03:07:09 +13:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.hide", text="Hide Selected Curves").unselected = False
|
|
|
|
|
layout.operator("graph.hide", text="Hide Unselected Curves").unselected = True
|
|
|
|
|
layout.operator("graph.reveal")
|
|
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("anim.channels_expand")
|
|
|
|
|
layout.operator("anim.channels_collapse")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2010-02-14 03:18:43 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("anim.channels_move", "direction", text="Move...")
|
2010-02-14 03:18:43 +00:00
|
|
|
|
2010-11-11 11:56:50 +00:00
|
|
|
layout.separator()
|
2010-11-11 21:49:40 +00:00
|
|
|
layout.operator("anim.channels_fcurves_enable")
|
2010-11-11 11:56:50 +00:00
|
|
|
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.separator()
|
2023-09-08 14:01:47 +02:00
|
|
|
layout.operator("graph.keys_to_samples")
|
|
|
|
|
layout.operator("graph.samples_to_keys")
|
2023-09-12 10:51:25 +02:00
|
|
|
layout.operator("graph.sound_to_samples")
|
2023-12-14 11:35:25 +01:00
|
|
|
layout.operator("anim.channels_bake")
|
2023-05-04 14:10:27 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.euler_filter", text="Discontinuity (Euler) Filter")
|
|
|
|
|
|
2023-02-20 11:51:16 +01:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("anim.channels_view_selected")
|
|
|
|
|
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2023-05-04 14:10:27 +02:00
|
|
|
class GRAPH_MT_key_density(Menu):
|
|
|
|
|
bl_label = "Density"
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2023-04-13 13:13:59 +10:00
|
|
|
from bl_ui_utils.layout import operator_context
|
2023-05-04 14:10:27 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
layout.operator("graph.decimate", text="Decimate (Ratio)").mode = 'RATIO'
|
|
|
|
|
# Using the modal operation doesn't make sense for this variant
|
|
|
|
|
# as we do not have a modal mode for it, so just execute it.
|
|
|
|
|
with operator_context(layout, 'EXEC_REGION_WIN'):
|
|
|
|
|
layout.operator("graph.decimate", text="Decimate (Allowed Change)").mode = 'ERROR'
|
2023-09-12 09:32:18 +02:00
|
|
|
layout.operator("graph.bake_keys")
|
2023-05-04 14:10:27 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.clean").channels = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GRAPH_MT_key_blending(Menu):
|
|
|
|
|
bl_label = "Blend"
|
2025-01-05 13:10:17 +01:00
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
2023-05-04 14:10:27 +02:00
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
2023-05-15 20:53:17 +10:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.operator("graph.breakdown", text="Breakdown")
|
|
|
|
|
layout.operator("graph.blend_to_neighbor", text="Blend to Neighbor")
|
|
|
|
|
layout.operator("graph.blend_to_default", text="Blend to Default Value")
|
|
|
|
|
layout.operator("graph.ease", text="Ease")
|
2023-08-10 16:09:39 +02:00
|
|
|
layout.operator("graph.blend_offset", text="Blend Offset")
|
2023-08-10 17:51:14 +02:00
|
|
|
layout.operator("graph.blend_to_ease", text="Blend to Ease")
|
2023-08-17 10:28:46 +02:00
|
|
|
layout.operator("graph.match_slope", text="Match Slope")
|
2023-09-21 12:46:27 +02:00
|
|
|
layout.operator("graph.push_pull", text="Push Pull")
|
2023-08-31 17:09:01 +02:00
|
|
|
layout.operator("graph.shear", text="Shear Keys")
|
2023-09-08 13:07:30 +02:00
|
|
|
layout.operator("graph.scale_average", text="Scale Average")
|
2023-12-21 10:46:43 +01:00
|
|
|
layout.operator("graph.scale_from_neighbor", text="Scale from Neighbor")
|
2023-09-21 15:11:16 +02:00
|
|
|
layout.operator("graph.time_offset", text="Time Offset")
|
2023-05-04 14:10:27 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class GRAPH_MT_key_smoothing(Menu):
|
|
|
|
|
bl_label = "Smooth"
|
2025-01-05 13:10:17 +01:00
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
2023-04-13 13:13:59 +10:00
|
|
|
|
2023-05-04 14:10:27 +02:00
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
2023-05-15 20:53:17 +10:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.operator("graph.gaussian_smooth", text="Smooth (Gaussian)")
|
|
|
|
|
layout.operator("graph.smooth", text="Smooth (Legacy)")
|
2023-07-13 09:10:42 +02:00
|
|
|
layout.operator("graph.butterworth_smooth")
|
2023-05-04 14:10:27 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class GRAPH_MT_key(Menu):
|
|
|
|
|
bl_label = "Key"
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
2009-12-08 07:11:43 +00:00
|
|
|
layout = self.layout
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.menu("GRAPH_MT_key_transform", text="Transform")
|
2020-10-16 16:44:06 +02:00
|
|
|
layout.menu("GRAPH_MT_key_snap", text="Snap")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("graph.mirror", "type", text="Mirror")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.operator("graph.frame_jump", text="Jump to Selected")
|
2012-10-15 03:52:27 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.operator_menu_enum("graph.keyframe_insert", "type", text="Insert")
|
|
|
|
|
layout.operator("graph.copy", text="Copy")
|
|
|
|
|
layout.operator("graph.paste", text="Paste")
|
2018-10-08 19:10:10 +02:00
|
|
|
layout.operator("graph.paste", text="Paste Flipped").flipped = True
|
2011-07-13 12:02:39 +00:00
|
|
|
layout.operator("graph.duplicate_move")
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.operator("graph.delete", text="Delete")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("graph.handle_type", "type", text="Handle Type")
|
|
|
|
|
layout.operator_menu_enum("graph.interpolation_type", "type", text="Interpolation Mode")
|
2014-03-22 02:50:24 +13:00
|
|
|
layout.operator_menu_enum("graph.easing_type", "type", text="Easing Type")
|
2011-01-01 07:20:34 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2019-12-04 16:00:03 +01:00
|
|
|
|
2023-05-04 14:10:27 +02:00
|
|
|
layout.menu("GRAPH_MT_key_density")
|
|
|
|
|
layout.menu("GRAPH_MT_key_blending")
|
|
|
|
|
layout.menu("GRAPH_MT_key_smoothing")
|
2010-11-07 12:09:15 +00:00
|
|
|
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_key_transform(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Transform"
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2009-12-08 07:11:43 +00:00
|
|
|
layout = self.layout
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2018-09-06 12:13:01 +02:00
|
|
|
layout.operator("transform.translate", text="Move")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
|
|
|
|
|
layout.operator("transform.rotate", text="Rotate")
|
|
|
|
|
layout.operator("transform.resize", text="Scale")
|
2011-04-04 10:13:04 +00:00
|
|
|
|
2015-04-22 16:26:00 +10:00
|
|
|
|
2020-10-16 16:44:06 +02:00
|
|
|
class GRAPH_MT_key_snap(Menu):
|
|
|
|
|
bl_label = "Snap"
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
2020-10-19 14:01:51 +02:00
|
|
|
layout.operator("graph.snap", text="Selection to Current Frame").type = 'CFRA'
|
|
|
|
|
layout.operator("graph.snap", text="Selection to Cursor Value").type = 'VALUE'
|
|
|
|
|
layout.operator("graph.snap", text="Selection to Nearest Frame").type = 'NEAREST_FRAME'
|
|
|
|
|
layout.operator("graph.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND'
|
|
|
|
|
layout.operator("graph.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER'
|
2020-10-16 16:44:06 +02:00
|
|
|
layout.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL'
|
2022-01-25 11:40:46 +01:00
|
|
|
layout.operator("graph.equalize_handles", text="Equalize Handles").side = 'BOTH'
|
2020-10-16 16:44:06 +02:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("graph.frame_jump", text="Cursor to Selection")
|
|
|
|
|
layout.operator("graph.snap_cursor_value", text="Cursor Value to Selection")
|
|
|
|
|
|
2022-04-19 15:05:55 +10: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 GRAPH_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("graph.view_all")
|
|
|
|
|
pie.operator("graph.view_selected", icon='ZOOM_SELECTED')
|
|
|
|
|
pie.operator("graph.view_frame")
|
2024-05-30 17:19:10 +02:00
|
|
|
if context.scene.use_preview_range:
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
2015-04-10 11:52:54 +02:00
|
|
|
class GRAPH_MT_delete(Menu):
|
|
|
|
|
bl_label = "Delete"
|
|
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2015-04-10 11:52:54 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("graph.delete")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2015-10-13 13:58:43 +02:00
|
|
|
layout.operator("graph.clean").channels = False
|
2015-05-20 15:30:33 +02:00
|
|
|
layout.operator("graph.clean", text="Clean Channels").channels = True
|
2015-04-10 11:52:54 +02:00
|
|
|
|
2018-06-05 09:12:19 +02:00
|
|
|
|
2019-03-12 10:59:57 +11:00
|
|
|
class GRAPH_MT_context_menu(Menu):
|
2023-09-25 16:25:55 +02:00
|
|
|
bl_label = "F-Curve"
|
2018-06-05 09:12:19 +02:00
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2018-06-05 09:12:19 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
2019-05-24 12:01:15 +02:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
|
|
|
|
|
2019-05-07 20:52:41 +02:00
|
|
|
layout.operator("graph.copy", text="Copy", icon='COPYDOWN')
|
|
|
|
|
layout.operator("graph.paste", text="Paste", icon='PASTEDOWN')
|
|
|
|
|
layout.operator("graph.paste", text="Paste Flipped", icon='PASTEFLIPDOWN').flipped = True
|
2018-06-05 09:12:19 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator_menu_enum("graph.handle_type", "type", text="Handle Type")
|
|
|
|
|
layout.operator_menu_enum("graph.interpolation_type", "type", text="Interpolation Mode")
|
|
|
|
|
layout.operator_menu_enum("graph.easing_type", "type", text="Easing Type")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("graph.keyframe_insert").type = 'SEL'
|
|
|
|
|
layout.operator("graph.duplicate_move")
|
2019-05-24 12:01:15 +02:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2018-06-05 09:12:19 +02:00
|
|
|
layout.operator("graph.delete")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator_menu_enum("graph.mirror", "type", text="Mirror")
|
|
|
|
|
layout.operator_menu_enum("graph.snap", "type", text="Snap")
|
|
|
|
|
|
|
|
|
|
|
2018-09-26 17:32:11 +02:00
|
|
|
class GRAPH_MT_pivot_pie(Menu):
|
|
|
|
|
bl_label = "Pivot Point"
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
pie = layout.menu_pie()
|
|
|
|
|
|
|
|
|
|
pie.prop_enum(context.space_data, "pivot_point", value='BOUNDING_BOX_CENTER')
|
|
|
|
|
pie.prop_enum(context.space_data, "pivot_point", value='CURSOR')
|
|
|
|
|
pie.prop_enum(context.space_data, "pivot_point", value='INDIVIDUAL_ORIGINS')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GRAPH_MT_snap_pie(Menu):
|
|
|
|
|
bl_label = "Snap"
|
|
|
|
|
|
2019-04-19 07:32:24 +02:00
|
|
|
def draw(self, _context):
|
2018-09-26 17:32:11 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
pie = layout.menu_pie()
|
|
|
|
|
|
2020-10-19 14:01:51 +02:00
|
|
|
pie.operator("graph.snap", text="Selection to Current Frame").type = 'CFRA'
|
|
|
|
|
pie.operator("graph.snap", text="Selection to Cursor Value").type = 'VALUE'
|
|
|
|
|
pie.operator("graph.snap", text="Selection to Nearest Frame").type = 'NEAREST_FRAME'
|
|
|
|
|
pie.operator("graph.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND'
|
|
|
|
|
pie.operator("graph.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER'
|
2018-09-26 17:32:11 +02:00
|
|
|
pie.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL'
|
2020-10-16 16:44:06 +02:00
|
|
|
pie.operator("graph.frame_jump", text="Cursor to Selection")
|
|
|
|
|
pie.operator("graph.snap_cursor_value", text="Cursor Value to Selection")
|
2018-09-26 17:32:11 +02:00
|
|
|
|
|
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
classes = (
|
|
|
|
|
GRAPH_HT_header,
|
2023-05-04 16:39:22 +02:00
|
|
|
GRAPH_PT_proportional_edit,
|
2017-03-18 20:03:24 +11:00
|
|
|
GRAPH_MT_editor_menus,
|
2017-03-20 02:34:32 +11:00
|
|
|
GRAPH_MT_view,
|
|
|
|
|
GRAPH_MT_select,
|
|
|
|
|
GRAPH_MT_marker,
|
|
|
|
|
GRAPH_MT_channel,
|
2017-03-18 20:03:24 +11:00
|
|
|
GRAPH_MT_key,
|
2023-05-04 14:10:27 +02:00
|
|
|
GRAPH_MT_key_density,
|
2017-03-18 20:03:24 +11:00
|
|
|
GRAPH_MT_key_transform,
|
2020-10-16 16:44:06 +02:00
|
|
|
GRAPH_MT_key_snap,
|
2023-05-04 14:10:27 +02:00
|
|
|
GRAPH_MT_key_smoothing,
|
|
|
|
|
GRAPH_MT_key_blending,
|
2017-03-20 02:34:32 +11:00
|
|
|
GRAPH_MT_delete,
|
2019-03-12 10:59:57 +11:00
|
|
|
GRAPH_MT_context_menu,
|
2018-09-26 17:32:11 +02:00
|
|
|
GRAPH_MT_pivot_pie,
|
|
|
|
|
GRAPH_MT_snap_pie,
|
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
|
|
|
GRAPH_MT_view_pie,
|
2018-06-26 21:12:25 +12:00
|
|
|
GRAPH_PT_filters,
|
2023-09-05 10:06:55 +02:00
|
|
|
GRAPH_PT_snapping,
|
2017-03-18 20:03:24 +11:00
|
|
|
)
|
2015-04-10 11:52:54 +02: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)
|