2009-12-07 11:50:05 +00:00
|
|
|
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or
|
|
|
|
# modify it under the terms of the GNU General Public License
|
|
|
|
# as published by the Free Software Foundation; either version 2
|
|
|
|
# of the License, or (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-12-07 11:50:05 +00:00
|
|
|
#
|
|
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
|
2009-12-13 14:38:30 +00:00
|
|
|
# <pep8 compliant>
|
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
from bpy.types import Header, Menu, Panel
|
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)
|
|
|
|
|
2018-07-02 15:53:46 +02:00
|
|
|
layout.prop(st, "auto_snap", text="")
|
|
|
|
|
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
|
|
|
|
sub.prop(tool_settings, "proportional_edit_falloff", text="", icon_only=True)
|
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
|
|
|
|
|
|
|
|
DopesheetFilterPopoverBase.draw_generic_filters(context, layout)
|
|
|
|
layout.separator()
|
|
|
|
DopesheetFilterPopoverBase.draw_search_filters(context, layout)
|
|
|
|
layout.separator()
|
|
|
|
DopesheetFilterPopoverBase.draw_standard_filters(context, layout)
|
|
|
|
|
|
|
|
|
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")
|
2010-01-20 11:20:20 +00:00
|
|
|
layout.separator()
|
2010-01-31 14:46:28 +00:00
|
|
|
|
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_cursor")
|
|
|
|
layout.prop(st, "show_sliders")
|
2010-08-17 07:49:53 +00:00
|
|
|
layout.prop(st, "use_auto_merge_keyframes")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2019-11-30 17:03:22 +11:00
|
|
|
if st.mode != 'DRIVERS':
|
|
|
|
layout.separator()
|
|
|
|
layout.prop(st, "show_markers")
|
|
|
|
|
2011-02-09 02:09:25 +00:00
|
|
|
layout.separator()
|
Animation Editors - Small Visual Tweaks for Usability
== Datablock filters in the headers are now hidden by default ==
This has been done because users were generally not frequently
toggling these, so quick access vs screen-estate cost wasn't really
worth it to have these always showing and taking up space on the
header.
Usage notes:
- To show these again, click on the "Filter more..." toggle.
- The "Filter more..." button DOES NOT affect whether those filters
apply.
Design notes:
- I tried many other button/icon combinations, but those were either
too space-hogging, vague, or had wrong button order.
- I also tried putting a box around these, but there was too much
padding.
- The ordering of the filters has also been modified a bit so that the
group/fcurve-name filters occur earlier in the list, given that
they're used more frequently
== Graph Editor - Use Fancy Drawing ==
Renamed this option to "Use High Quality Drawing" as suggested by
Matt. "Fancy" isn't really descriptive enough.
== Icons for Mode Dropdowns ==
The mode dropdowns in the DopeSheet and Graph Editors now have icons.
- These were important enough (compared to the auto-snap mode) that
some visual decoration was perhaps warranted.
- It makes it easier to see at a glance what mode the view is in
Icon choices:
- In some cases, the icons seem like quite a natural fit IMO (i.e.
outliner<->dopesheet, key<->shapekey editor, grease pencil, fcurve
editor)
- Action Editor uses an "object" icon to indicate that this is object-
level only for now (though I hope to find a way to address this
soon/later). This will be kept like this until then.
- There isn't any icon for drivers, so after trying a few
alternatives, I settled on area-link icon, since it ties together two
entities using some link.
2011-06-29 13:00:19 +00:00
|
|
|
layout.prop(st, "use_beauty_drawing")
|
2011-02-09 02:09:25 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2012-01-14 16:26:08 +00:00
|
|
|
|
2021-03-09 15:09:09 -05:00
|
|
|
layout.prop(st, "show_extrapolation")
|
2021-03-22 14:22:37 +11:00
|
|
|
|
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_curves_handles")
|
|
|
|
layout.prop(st, "use_only_selected_keyframe_handles")
|
2012-01-14 14:17:12 +00:00
|
|
|
|
|
|
|
layout.prop(st, "show_seconds")
|
2014-05-01 14:49:47 +10:00
|
|
|
layout.prop(st, "show_locked_time")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
layout.operator("anim.previewrange_set")
|
|
|
|
layout.operator("anim.previewrange_clear")
|
|
|
|
layout.operator("graph.previewrange_set")
|
2009-12-07 11:50:05 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
layout.operator("graph.view_all")
|
2011-03-17 10:02:37 +00:00
|
|
|
layout.operator("graph.view_selected")
|
2015-04-13 14:30:17 +02:00
|
|
|
layout.operator("graph.view_frame")
|
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).
|
|
|
|
layout.separator()
|
|
|
|
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()
|
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
|
2009-12-07 12:11:28 +00:00
|
|
|
|
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
|
|
|
|
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
|
|
|
|
2010-02-07 11:50:03 +00:00
|
|
|
layout.separator()
|
|
|
|
layout.operator("graph.select_more")
|
|
|
|
layout.operator("graph.select_less")
|
2010-04-17 19:05:53 +00:00
|
|
|
|
2010-04-05 11:47:55 +00:00
|
|
|
layout.separator()
|
|
|
|
layout.operator("graph.select_linked")
|
2010-02-07 11:50:03 +00:00
|
|
|
|
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
|
2009-12-07 11:50:05 +00:00
|
|
|
|
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")
|
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")
|
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
|
|
|
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class GRAPH_MT_key(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Key"
|
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
|
|
|
|
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()
|
2014-05-14 14:01:36 +10:00
|
|
|
layout.operator_menu_enum("graph.keyframe_insert", "type")
|
|
|
|
layout.operator_menu_enum("graph.fmodifier_add", "type")
|
2011-03-20 12:19:21 +00:00
|
|
|
layout.operator("graph.sound_bake")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2012-10-15 03:52:27 +00:00
|
|
|
layout.separator()
|
|
|
|
layout.operator("graph.frame_jump")
|
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2018-10-08 19:10:10 +02:00
|
|
|
layout.operator("graph.copy")
|
|
|
|
layout.operator("graph.paste")
|
|
|
|
layout.operator("graph.paste", text="Paste Flipped").flipped = True
|
2011-07-13 12:02:39 +00:00
|
|
|
layout.operator("graph.duplicate_move")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.operator("graph.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
|
|
|
operator_context = layout.operator_context
|
|
|
|
|
|
|
|
layout.operator("graph.decimate", text="Decimate (Ratio)").mode = 'RATIO'
|
2019-12-16 14:29:03 +11:00
|
|
|
|
|
|
|
# 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.
|
2020-08-03 17:18:15 +02:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2019-12-04 16:00:03 +01:00
|
|
|
layout.operator("graph.decimate", text="Decimate (Allowed Change)").mode = 'ERROR'
|
|
|
|
layout.operator_context = operator_context
|
|
|
|
|
2021-12-25 13:40:53 +01:00
|
|
|
layout.menu("GRAPH_MT_slider", text="Slider Operators")
|
|
|
|
|
2015-10-13 12:58:04 +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
|
2011-02-01 11:54:05 +00:00
|
|
|
layout.operator("graph.smooth")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.operator("graph.sample")
|
|
|
|
layout.operator("graph.bake")
|
2020-10-28 11:45:24 +01:00
|
|
|
layout.operator("graph.unbake")
|
2009-12-07 12:11:28 +00:00
|
|
|
|
2010-11-07 12:09:15 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("graph.euler_filter", text="Discontinuity (Euler) Filter")
|
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'
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("graph.frame_jump", text="Cursor to Selection")
|
|
|
|
layout.operator("graph.snap_cursor_value", text="Cursor Value to Selection")
|
|
|
|
|
2021-12-25 13:40:53 +01:00
|
|
|
class GRAPH_MT_slider(Menu):
|
|
|
|
bl_label = "Slider Operators"
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
layout = self.layout
|
2022-01-07 14:39:01 +11:00
|
|
|
|
2021-12-25 20:58:47 +01:00
|
|
|
layout.operator("graph.breakdown", text="Breakdown")
|
2021-12-25 13:40:53 +01:00
|
|
|
layout.operator("graph.blend_to_neighbor", text="Blend To Neighbor")
|
|
|
|
|
2020-10-16 16:44:06 +02: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"
|
|
|
|
|
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("graph.view_all")
|
|
|
|
pie.operator("graph.view_selected", icon='ZOOM_SELECTED')
|
|
|
|
pie.operator("graph.view_frame")
|
|
|
|
|
|
|
|
|
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):
|
2018-06-05 09:12:19 +02:00
|
|
|
bl_label = "F-Curve Context Menu"
|
|
|
|
|
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
|
|
|
|
|
|
|
|
2019-03-12 10:59:57 +11:00
|
|
|
class GRAPH_MT_channel_context_menu(Menu):
|
2018-06-05 09:12:19 +02:00
|
|
|
bl_label = "F-Curve Channel Context Menu"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
st = context.space_data
|
|
|
|
|
|
|
|
layout.separator()
|
2018-06-05 16:35:20 +02:00
|
|
|
layout.operator("anim.channels_setting_enable", text="Mute Channels").type = 'MUTE'
|
|
|
|
layout.operator("anim.channels_setting_disable", text="Unmute Channels").type = 'MUTE'
|
2018-06-05 09:12:19 +02:00
|
|
|
layout.separator()
|
2018-06-05 16:35:20 +02:00
|
|
|
layout.operator("anim.channels_setting_enable", text="Protect Channels").type = 'PROTECT'
|
|
|
|
layout.operator("anim.channels_setting_disable", text="Unprotect Channels").type = 'PROTECT'
|
2018-06-05 09:12:19 +02:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("anim.channels_group")
|
|
|
|
layout.operator("anim.channels_ungroup")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("anim.channels_editable_toggle")
|
|
|
|
layout.operator_menu_enum("graph.extrapolation_type", "type", text="Extrapolation Mode")
|
|
|
|
|
|
|
|
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")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("anim.channels_expand")
|
|
|
|
layout.operator("anim.channels_collapse")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
layout.operator_menu_enum("anim.channels_move", "direction", text="Move...")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("anim.channels_delete")
|
|
|
|
if st.mode == 'DRIVERS':
|
|
|
|
layout.operator("graph.driver_delete_invalid")
|
|
|
|
|
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
classes = (
|
|
|
|
GRAPH_HT_header,
|
|
|
|
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,
|
|
|
|
GRAPH_MT_key_transform,
|
2020-10-16 16:44:06 +02:00
|
|
|
GRAPH_MT_key_snap,
|
2021-12-25 13:40:53 +01:00
|
|
|
GRAPH_MT_slider,
|
2017-03-20 02:34:32 +11:00
|
|
|
GRAPH_MT_delete,
|
2019-03-12 10:59:57 +11:00
|
|
|
GRAPH_MT_context_menu,
|
|
|
|
GRAPH_MT_channel_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,
|
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)
|