2025-12-01
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
# SPDX-FileCopyrightText: 2025 Blender Studio Tools Authors
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
import bpy
|
||||
from bpy.types import Operator, Menu
|
||||
|
||||
from bpy.props import EnumProperty, StringProperty, BoolProperty
|
||||
from ..fcurve_utils import get_fcurves
|
||||
|
||||
|
||||
class POSE_OT_curves_set_boolean(Operator):
|
||||
"""Set lock state of all selected curves"""
|
||||
bl_idname = "pose.curves_set_boolean"
|
||||
bl_label = "Set a boolean on curves"
|
||||
bl_options = {'REGISTER', 'UNDO', 'INTERNAL'}
|
||||
|
||||
curve_set: EnumProperty(
|
||||
name="Affected Curves",
|
||||
items=[
|
||||
('ACTIVE', 'Active Curve', 'Active Curve'),
|
||||
('SELECTED', 'Selected Curves', 'Selected Curves'),
|
||||
('UNSELECTED', 'Unselected Curves', 'Unselected Curves'),
|
||||
('ALL', 'All Curves', 'All Curves'),
|
||||
],
|
||||
default='SELECTED'
|
||||
)
|
||||
prop_name: StringProperty(
|
||||
name="Property Name",
|
||||
description="Name of the boolean property to set",
|
||||
default='lock'
|
||||
)
|
||||
prop_value: BoolProperty(
|
||||
name="Value",
|
||||
description="Value to set",
|
||||
default=False
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
# Only works in Graph Editor, when there is an active curve.
|
||||
return context.pose_object and context.pose_object.animation_data and context.pose_object.animation_data.action
|
||||
|
||||
def execute(self, context):
|
||||
action = context.object.animation_data.action
|
||||
affected_fcurves = get_fcurves(context, action, self.curve_set)
|
||||
|
||||
for fc in affected_fcurves:
|
||||
setattr(fc, self.prop_name, self.prop_value)
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
class GRAPH_MT_channel_lock(Menu):
|
||||
bl_label = "Lock"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
op = layout.operator(POSE_OT_curves_set_boolean.bl_idname,
|
||||
text="Lock Selected", icon='LOCKED')
|
||||
op.prop_name = "lock"
|
||||
op.prop_value = True
|
||||
op.curve_set = 'SELECTED'
|
||||
|
||||
op = layout.operator(POSE_OT_curves_set_boolean.bl_idname,
|
||||
text="Lock Unselected", icon='LOCKED')
|
||||
op.prop_name = "lock"
|
||||
op.prop_value = True
|
||||
op.curve_set = 'UNSELECTED'
|
||||
|
||||
layout.separator()
|
||||
|
||||
op = layout.operator(POSE_OT_curves_set_boolean.bl_idname,
|
||||
text="Unlock Selected", icon='UNLOCKED')
|
||||
op.prop_name = "lock"
|
||||
op.prop_value = False
|
||||
op.curve_set = 'SELECTED'
|
||||
|
||||
op = layout.operator(POSE_OT_curves_set_boolean.bl_idname,
|
||||
text="Unlock All", icon='UNLOCKED')
|
||||
op.prop_name = "lock"
|
||||
op.prop_value = False
|
||||
op.curve_set = 'ALL'
|
||||
|
||||
|
||||
def draw_curves_lock_menu(self, context):
|
||||
layout = self.layout
|
||||
layout.menu("GRAPH_MT_channel_lock", icon='LOCKED')
|
||||
|
||||
|
||||
registry = [
|
||||
POSE_OT_curves_set_boolean,
|
||||
GRAPH_MT_channel_lock
|
||||
]
|
||||
|
||||
|
||||
def register():
|
||||
bpy.types.GRAPH_MT_channel.append(draw_curves_lock_menu)
|
||||
|
||||
|
||||
def unregister():
|
||||
bpy.types.GRAPH_MT_channel.remove(draw_curves_lock_menu)
|
||||
Reference in New Issue
Block a user