Make the "Clear Motion Paths" operators more intuitive. Previously, the only way to clear the motion path of the selected object/bone would be to shift-click the "Clear ALL Motion Paths" button. Now there are two "X" buttons, one for "selected" and one for "all". The "Clear Selected" and "Clear All" buttons align with the corresponding "Update Selected" and "Update All" buttons.
120 lines
4.1 KiB
Python
120 lines
4.1 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# Generic Panels (Independent of DataType)
|
|
|
|
# NOTE:
|
|
# The specialized panel types are derived in their respective UI modules
|
|
# don't register these classes since they are only helpers.
|
|
|
|
|
|
class MotionPathButtonsPanel:
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_label = "Motion Paths"
|
|
# bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
def draw_settings(self, _context, avs, mpath, bones=False):
|
|
layout = self.layout
|
|
|
|
mps = avs.motion_path
|
|
|
|
layout.use_property_split = True
|
|
layout.use_property_decorate = False
|
|
|
|
col = layout.column(align=True)
|
|
col.prop(mps, "type")
|
|
range_group = col.column(align=True)
|
|
range_group.active = mps.type == 'RANGE'
|
|
range_group.prop(mps, "range", text="Calculation Range")
|
|
|
|
if mps.type == 'CURRENT_FRAME':
|
|
col = layout.column(align=True)
|
|
col.prop(mps, "frame_before", text="Frame Range Before")
|
|
col.prop(mps, "frame_after", text="After")
|
|
col.prop(mps, "frame_step", text="Step")
|
|
elif mps.type == 'RANGE':
|
|
col = layout.column(align=True)
|
|
start_end_group = col.column(align=True)
|
|
start_end_group.active = mps.range == 'MANUAL'
|
|
start_end_group.prop(mps, "frame_start", text="Frame Range Start")
|
|
start_end_group.prop(mps, "frame_end", text="End")
|
|
col.prop(mps, "frame_step", text="Step")
|
|
|
|
if bones:
|
|
op_category = "pose"
|
|
icon = 'BONE_DATA'
|
|
else:
|
|
op_category = "object"
|
|
icon = 'OBJECT_DATA'
|
|
|
|
if mpath:
|
|
col = layout.column(align=True)
|
|
row = col.row(align=True)
|
|
row.enabled = False
|
|
row.prop(mpath, "frame_start", text="Cached Range")
|
|
row.prop(mpath, "frame_end", text="")
|
|
|
|
# Update Selected.
|
|
col = layout.column(align=True)
|
|
row = col.row(align=True)
|
|
row.operator(f"{op_category}.paths_update", text="Update Path", icon=icon)
|
|
row.operator(f"{op_category}.paths_clear", text="", icon='X').only_selected = True
|
|
else:
|
|
# Calculate.
|
|
col = layout.column(align=True)
|
|
col.label(text="Nothing to show yet...", icon='ERROR')
|
|
col.operator(f"{op_category}.paths_calculate", text="Calculate...", icon=icon)
|
|
|
|
# Update All & Clear All.
|
|
# Note that 'col' is from inside the preceeding `if` or `else` block.
|
|
row = col.row(align=True)
|
|
row.operator("object.paths_update_visible", text="Update All Paths", icon='WORLD')
|
|
row.operator(f"{op_category}.paths_clear", text="", icon='X').only_selected = False
|
|
|
|
|
|
class MotionPathButtonsPanel_display:
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_label = "Display"
|
|
|
|
def draw_settings(self, _context, avs, mpath, bones=False):
|
|
layout = self.layout
|
|
|
|
mps = avs.motion_path
|
|
|
|
layout.use_property_split = True
|
|
layout.use_property_decorate = False
|
|
|
|
flow = layout.grid_flow(row_major=False, columns=0, even_columns=False, even_rows=False, align=True)
|
|
|
|
flow.prop(mps, "show_frame_numbers", text="Frame Numbers")
|
|
flow.prop(mps, "show_keyframe_highlight", text="Keyframes")
|
|
sub = flow.column()
|
|
sub.enabled = mps.show_keyframe_highlight
|
|
if bones:
|
|
sub.prop(mps, "show_keyframe_action_all", text="+ Non-Grouped Keyframes")
|
|
sub.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers")
|
|
|
|
# Customize path
|
|
if mpath is not None:
|
|
flow.prop(mpath, "lines", text="Lines")
|
|
|
|
col = layout.column()
|
|
col.prop(mpath, "line_thickness", text="Thickness")
|
|
|
|
split = col.split(factor=0.6)
|
|
|
|
split.prop(mpath, "use_custom_color", text="Custom Color")
|
|
sub = split.column()
|
|
sub.enabled = mpath.use_custom_color
|
|
sub.prop(mpath, "color", text="")
|
|
|
|
|
|
classes = (
|
|
)
|
|
|
|
if __name__ == "__main__": # only for live edit.
|
|
from bpy.utils import register_class
|
|
for cls in classes:
|
|
register_class(cls)
|