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 21:51:44 +00:00
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
from bpy.types import Header, Menu, Panel
|
2019-05-13 17:27:40 +02: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,
|
2021-05-03 00:03:00 +03:00
|
|
|
DopesheetActionPanelBase,
|
2018-06-26 21:12:25 +12:00
|
|
|
dopesheet_filter,
|
2018-06-26 22:56:39 +02:00
|
|
|
)
|
2009-12-07 21:51:44 +00:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class NLA_HT_header(Header):
|
2009-12-08 07:11:43 +00:00
|
|
|
bl_space_type = 'NLA_EDITOR'
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
st = context.space_data
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2019-04-21 04:49:19 +10:00
|
|
|
layout.template_header()
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2018-07-02 14:45:55 +02:00
|
|
|
NLA_MT_editor_menus.draw_collapsible(context, layout)
|
|
|
|
|
|
|
|
|
|
layout.separator_spacer()
|
|
|
|
|
|
|
|
|
|
dopesheet_filter(layout, context)
|
|
|
|
|
|
2018-06-26 22:56:39 +02:00
|
|
|
layout.popover(
|
2018-07-13 19:13:44 +02:00
|
|
|
panel="NLA_PT_filters",
|
2018-06-26 22:56:39 +02:00
|
|
|
text="",
|
|
|
|
|
icon='FILTER',
|
|
|
|
|
)
|
2018-06-26 21:12:25 +12:00
|
|
|
|
2023-09-05 10:06:55 +02:00
|
|
|
row = layout.row(align=True)
|
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
|
row.prop(tool_settings, "use_snap_anim", text="")
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
|
sub.popover(
|
|
|
|
|
panel="NLA_PT_snapping",
|
2023-09-26 20:28:57 +02:00
|
|
|
text="",
|
2023-09-05 10:06:55 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NLA_PT_snapping(Panel):
|
|
|
|
|
bl_space_type = 'NLA_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-07-02 15:53:46 +02:00
|
|
|
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2018-06-26 21:12:25 +12:00
|
|
|
class NLA_PT_filters(DopesheetFilterPopoverBase, Panel):
|
|
|
|
|
bl_space_type = 'NLA_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)
|
|
|
|
|
|
|
|
|
|
|
2021-05-03 00:03:00 +03:00
|
|
|
class NLA_PT_action(DopesheetActionPanelBase, Panel):
|
|
|
|
|
bl_space_type = 'NLA_EDITOR'
|
|
|
|
|
bl_category = "Strip"
|
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def poll(cls, context):
|
|
|
|
|
strip = context.active_nla_strip
|
|
|
|
|
return strip and strip.type == 'CLIP' and strip.action
|
|
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
action = context.active_nla_strip.action
|
|
|
|
|
self.draw_generic_panel(context, self.layout, action)
|
|
|
|
|
|
|
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
class NLA_MT_editor_menus(Menu):
|
|
|
|
|
bl_idname = "NLA_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("NLA_MT_view")
|
|
|
|
|
layout.menu("NLA_MT_select")
|
2019-11-30 17:03:22 +11:00
|
|
|
if st.show_markers:
|
|
|
|
|
layout.menu("NLA_MT_marker")
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("NLA_MT_add")
|
2023-12-01 20:11:02 +01:00
|
|
|
layout.menu("NLA_MT_tracks")
|
|
|
|
|
layout.menu("NLA_MT_strips")
|
2014-01-27 18:38:53 +11:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class NLA_MT_view(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
st = context.space_data
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2019-04-18 12:16:03 +02:00
|
|
|
layout.prop(st, "show_region_ui")
|
2022-09-20 14:36:20 +02:00
|
|
|
layout.prop(st, "show_region_hud")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2010-01-20 11:20:20 +00:00
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.operator("nla.view_selected")
|
|
|
|
|
layout.operator("nla.view_all")
|
|
|
|
|
layout.operator("nla.view_frame")
|
|
|
|
|
layout.separator()
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.prop(st, "use_realtime_update")
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.prop(st, "show_strip_curves")
|
2019-11-30 17:03:22 +11:00
|
|
|
layout.separator()
|
2024-01-23 12:11:22 +01:00
|
|
|
|
2019-11-30 17:03:22 +11:00
|
|
|
layout.prop(st, "show_markers")
|
2016-06-29 03:16:07 +12:00
|
|
|
layout.prop(st, "show_local_markers")
|
2024-01-23 12:11:22 +01:00
|
|
|
layout.prop(st, "show_seconds")
|
|
|
|
|
layout.prop(st, "show_locked_time")
|
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")
|
2014-04-28 19:37:29 +12:00
|
|
|
layout.operator("nla.previewrange_set")
|
2011-07-20 00:36:28 +00:00
|
|
|
layout.separator()
|
2011-08-30 10:49:58 +00:00
|
|
|
|
2018-05-24 18:35:19 +02:00
|
|
|
layout.menu("INFO_MT_area")
|
2009-12-07 21:51:44 +00:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class NLA_MT_select(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-12-07 21:51:44 +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 21:51:44 +00:00
|
|
|
|
2018-07-03 15:44:56 +02:00
|
|
|
layout.operator("nla.select_all", text="All").action = 'SELECT'
|
|
|
|
|
layout.operator("nla.select_all", text="None").action = 'DESELECT'
|
|
|
|
|
layout.operator("nla.select_all", text="Invert").action = 'INVERT'
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2018-10-05 10:27:04 +10:00
|
|
|
layout.operator("nla.select_box").axis_range = False
|
2019-08-06 16:10:48 +10:00
|
|
|
layout.operator("nla.select_box", text="Box Select (Axis Range)").axis_range = True
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2011-02-14 03:04:59 +00:00
|
|
|
layout.separator()
|
2015-01-29 17:34:05 +01:00
|
|
|
props = layout.operator("nla.select_leftright", text="Before Current Frame")
|
|
|
|
|
props.extend = False
|
|
|
|
|
props.mode = 'LEFT'
|
|
|
|
|
props = layout.operator("nla.select_leftright", text="After Current Frame")
|
|
|
|
|
props.extend = False
|
|
|
|
|
props.mode = 'RIGHT'
|
2011-02-14 03:04:59 +00:00
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class NLA_MT_marker(Menu):
|
2011-09-21 15:18:38 +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)
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2011-01-13 23:00:51 +00:00
|
|
|
|
2022-04-14 11:30:12 +02:00
|
|
|
class NLA_MT_marker_select(Menu):
|
2023-04-18 10:42:00 +10:00
|
|
|
bl_label = "Select"
|
2022-04-14 11:30:12 +02:00
|
|
|
|
2022-06-14 14:30:09 +10:00
|
|
|
def draw(self, _context):
|
2022-04-14 11:30:12 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("marker.select_all", text="All").action = 'SELECT'
|
|
|
|
|
layout.operator("marker.select_all", text="None").action = 'DESELECT'
|
|
|
|
|
layout.operator("marker.select_all", text="Invert").action = 'INVERT'
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("marker.select_leftright", text="Before Current Frame").mode = 'LEFT'
|
|
|
|
|
layout.operator("marker.select_leftright", text="After Current Frame").mode = 'RIGHT'
|
|
|
|
|
|
|
|
|
|
|
2023-12-01 20:11:02 +01:00
|
|
|
class NLA_MT_add(Menu):
|
|
|
|
|
bl_label = "Add"
|
|
|
|
|
bl_translation_context = i18n_contexts.operator_default
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("nla.actionclip_add", text="Action")
|
|
|
|
|
layout.operator("nla.transition_add", text="Transition")
|
|
|
|
|
layout.operator("nla.soundclip_add", text="Sound")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.selected_objects_add", text="Selected Objects")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NLA_MT_tracks(Menu):
|
|
|
|
|
bl_label = "Track"
|
|
|
|
|
|
|
|
|
|
def draw(self, _context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator("nla.tracks_add", text="Add").above_selected = False
|
|
|
|
|
layout.operator("nla.tracks_add", text="Add Above Selected").above_selected = True
|
|
|
|
|
layout.operator("nla.tracks_delete", text="Delete")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator_menu_enum("anim.channels_move", "direction", text="Move")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("anim.channels_clean_empty")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NLA_MT_strips(Menu):
|
|
|
|
|
bl_label = "Strip"
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
scene = context.scene
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2023-12-01 20:11:02 +01:00
|
|
|
layout.menu("NLA_MT_strips_transform", text="Transform")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("nla.snap", "type", text="Snap")
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2023-12-01 20:11:02 +01:00
|
|
|
layout.operator("nla.split", text="Split")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.duplicate", text="Duplicate").linked = False
|
|
|
|
|
layout.operator("nla.duplicate", text="Linked Duplicate").linked = True
|
|
|
|
|
layout.operator("nla.delete", text="Delete")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("nla.meta_add", text="Make Meta")
|
|
|
|
|
layout.operator("nla.meta_remove", text="Remove Meta")
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.mute_toggle")
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2023-12-01 20:11:02 +01:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.bake", text="Bake Action")
|
|
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.apply_scale")
|
|
|
|
|
layout.operator("nla.clear_scale")
|
2011-01-19 10:45:35 +00:00
|
|
|
layout.operator("nla.action_sync_length").active = False
|
2009-12-07 21:51:44 +00:00
|
|
|
|
2014-04-29 01:59:15 +12:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.make_single_user")
|
|
|
|
|
|
2009-12-08 07:11:43 +00:00
|
|
|
layout.separator()
|
2010-08-18 08:26:18 +00:00
|
|
|
if scene.is_nla_tweakmode:
|
2015-04-12 20:42:34 +12:00
|
|
|
layout.operator("nla.tweakmode_exit", text="Stop Editing Stashed Action").isolate_action = True
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("nla.tweakmode_exit", text="Stop Tweaking Strip Actions")
|
2009-12-08 07:11:43 +00:00
|
|
|
else:
|
2015-04-12 20:42:34 +12:00
|
|
|
layout.operator("nla.tweakmode_enter", text="Start Editing Stashed Action").isolate_action = True
|
2022-04-19 15:05:55 +10:00
|
|
|
layout.operator("nla.tweakmode_enter",
|
|
|
|
|
text="Start Tweaking Strip Actions (Full Stack)").use_upper_stack_evaluation = True
|
|
|
|
|
layout.operator("nla.tweakmode_enter",
|
|
|
|
|
text="Start Tweaking Strip Actions (Lower Stack)").use_upper_stack_evaluation = False
|
2009-12-07 21:51:44 +00:00
|
|
|
|
|
|
|
|
|
2023-12-01 20:11:02 +01:00
|
|
|
class NLA_MT_strips_transform(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Transform"
|
2009-12-07 21:51:44 +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 21:51:44 +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.transform", text="Scale").mode = 'TIME_SCALE'
|
2011-04-04 10:13:04 +00:00
|
|
|
|
2023-12-01 20:11:02 +01:00
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.swap", text="Swap")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.move_up", text="Move Up")
|
|
|
|
|
layout.operator("nla.move_down", text="Move Down")
|
|
|
|
|
|
2018-09-27 09:41:18 +10:00
|
|
|
|
2018-09-26 17:32:11 +02:00
|
|
|
class NLA_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-28 14:06:26 -04:00
|
|
|
pie.operator("nla.snap", text="Selection to Current Frame").type = 'CFRA'
|
|
|
|
|
pie.operator("nla.snap", text="Selection to Nearest Frame").type = 'NEAREST_FRAME'
|
|
|
|
|
pie.operator("nla.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND'
|
|
|
|
|
pie.operator("nla.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER'
|
2018-09-26 17:32:11 +02:00
|
|
|
|
2019-05-22 00:27:01 +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 NLA_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("nla.view_all")
|
|
|
|
|
pie.operator("nla.view_selected", icon='ZOOM_SELECTED')
|
|
|
|
|
pie.operator("nla.view_frame")
|
|
|
|
|
|
|
|
|
|
|
2019-05-07 20:49:53 +02:00
|
|
|
class NLA_MT_context_menu(Menu):
|
2023-09-25 16:25:55 +02:00
|
|
|
bl_label = "NLA"
|
2019-05-07 20:49:53 +02:00
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
|
layout = self.layout
|
|
|
|
|
scene = context.scene
|
|
|
|
|
|
|
|
|
|
if scene.is_nla_tweakmode:
|
|
|
|
|
layout.operator("nla.tweakmode_exit", text="Stop Editing Stashed Action").isolate_action = True
|
|
|
|
|
layout.operator("nla.tweakmode_exit", text="Stop Tweaking Strip Actions")
|
|
|
|
|
else:
|
|
|
|
|
layout.operator("nla.tweakmode_enter", text="Start Editing Stashed Action").isolate_action = True
|
2022-04-19 15:05:55 +10:00
|
|
|
layout.operator("nla.tweakmode_enter",
|
|
|
|
|
text="Start Tweaking Strip Actions (Full Stack)").use_upper_stack_evaluation = True
|
|
|
|
|
layout.operator("nla.tweakmode_enter",
|
|
|
|
|
text="Start Tweaking Strip Actions (Lower Stack)").use_upper_stack_evaluation = False
|
2019-05-07 20:49:53 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2022-02-04 16:37:41 +01:00
|
|
|
props = layout.operator("wm.call_panel", text="Rename...")
|
|
|
|
|
props.name = "TOPBAR_PT_name"
|
|
|
|
|
props.keep_open = False
|
2023-07-27 18:14:05 +02:00
|
|
|
layout.operator("nla.duplicate_move")
|
|
|
|
|
layout.operator("nla.duplicate_linked_move")
|
2019-05-07 20:49:53 +02:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("nla.split")
|
|
|
|
|
layout.operator("nla.delete")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2022-11-10 12:04:31 +01:00
|
|
|
layout.operator("nla.meta_add")
|
|
|
|
|
layout.operator("nla.meta_remove")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
2019-05-07 20:49:53 +02:00
|
|
|
layout.operator("nla.swap")
|
|
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator_menu_enum("nla.snap", "type", text="Snap")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NLA_MT_channel_context_menu(Menu):
|
2023-11-16 17:59:18 +01:00
|
|
|
bl_label = "NLA Tracks"
|
2019-05-07 20:49:53 +02:00
|
|
|
|
2019-05-28 16:22:21 +10:00
|
|
|
def draw(self, _context):
|
2019-05-07 20:49:53 +02:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
|
|
layout.operator_menu_enum("anim.channels_move", "direction", text="Track Ordering...")
|
2023-11-30 17:15:06 +01:00
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
|
|
layout.operator("nla.tracks_add", text="Add Track").above_selected = False
|
|
|
|
|
layout.operator("nla.tracks_add", text="Add Track Above Selected").above_selected = True
|
|
|
|
|
layout.separator()
|
|
|
|
|
layout.operator("nla.tracks_delete")
|
2019-05-07 20:49:53 +02:00
|
|
|
layout.operator("anim.channels_clean_empty")
|
|
|
|
|
|
|
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
classes = (
|
|
|
|
|
NLA_HT_header,
|
|
|
|
|
NLA_MT_editor_menus,
|
|
|
|
|
NLA_MT_view,
|
2017-03-20 02:34:32 +11:00
|
|
|
NLA_MT_select,
|
|
|
|
|
NLA_MT_marker,
|
2022-04-14 11:30:12 +02:00
|
|
|
NLA_MT_marker_select,
|
2017-03-20 02:34:32 +11:00
|
|
|
NLA_MT_add,
|
2023-12-01 20:11:02 +01:00
|
|
|
NLA_MT_tracks,
|
|
|
|
|
NLA_MT_strips,
|
|
|
|
|
NLA_MT_strips_transform,
|
2018-09-26 17:32:11 +02:00
|
|
|
NLA_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
|
|
|
NLA_MT_view_pie,
|
2019-05-07 20:49:53 +02:00
|
|
|
NLA_MT_context_menu,
|
|
|
|
|
NLA_MT_channel_context_menu,
|
2018-06-26 21:12:25 +12:00
|
|
|
NLA_PT_filters,
|
2021-05-03 00:03:00 +03:00
|
|
|
NLA_PT_action,
|
2023-09-05 10:06:55 +02:00
|
|
|
NLA_PT_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)
|