From a1abdf1c1c59f908684001d1d9b0b4bbc392cca7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 27 Jun 2011 07:51:52 +0000 Subject: fix [#27778] Set Bone Flags - No Scale - Toggle seems not to work. Toggling options on the selection is better done as a generic operator. Replace ARMATURE_OT_flags_set and POSE_OT_flags_set with WM_OT_context_collection_boolean_set and use menus to access it with specific settings. This way its easy make a key shortcut which toggles any boolean on any collection - sequences, metaballs, objects, bones etc. --- release/scripts/startup/bl_operators/wm.py | 69 +++++++++++++++++++++++++-- release/scripts/startup/bl_ui/space_view3d.py | 48 ++++++++++++++++++- 2 files changed, 112 insertions(+), 5 deletions(-) (limited to 'release/scripts') diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 629a48d5750..af33e45668c 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -19,7 +19,9 @@ # import bpy -from bpy.props import StringProperty, BoolProperty, IntProperty, FloatProperty +from bpy.props import StringProperty, BoolProperty, IntProperty, \ + FloatProperty, EnumProperty + from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear @@ -457,6 +459,66 @@ doc_id = StringProperty(name="Doc ID", doc_new = StringProperty(name="Edit Description", description="", maxlen=1024, default="") +data_path_iter = StringProperty( + description="The data path relative to the context, must point to an iterable.") + +data_path_item = StringProperty( + description="The data path from each iterable to the value (int or float)") + + +class WM_OT_context_collection_boolean_set(bpy.types.Operator): + '''Set boolean values for a collection of items''' + bl_idname = "wm.context_collection_boolean_set" + bl_label = "Context Collection Boolean Set" + bl_options = {'UNDO', 'REGISTER', 'INTERNAL'} + + data_path_iter = data_path_iter + data_path_item = data_path_item + + type = EnumProperty(items=( + ('TOGGLE', "Toggle", ""), + ('ENABLE', "Enable", ""), + ('DISABLE', "Disable", ""), + ), + name="Type") + + def execute(self, context): + data_path_iter = self.data_path_iter + data_path_item = self.data_path_item + + items = list(getattr(context, data_path_iter)) + items_ok = [] + is_set = False + for item in items: + try: + value_orig = eval("item." + data_path_item) + except: + continue + + if value_orig == True: + is_set = True + elif value_orig == False: + pass + else: + self.report({'WARNING'}, "Non boolean value found: %s[ ].%s" % + (data_path_iter, data_path_item)) + return {'CANCELLED'} + + items_ok.append(item) + + if self.type == 'ENABLE': + is_set = True + elif self.type == 'DISABLE': + is_set = False + else: + is_set = not is_set + + exec_str = "item.%s = %s" % (data_path_item, is_set) + for item in items_ok: + exec(exec_str) + + return {'FINISHED'} + class WM_OT_context_modal_mouse(bpy.types.Operator): '''Adjust arbitrary values with mouse input''' @@ -464,8 +526,9 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): bl_label = "Context Modal Mouse" bl_options = {'GRAB_POINTER', 'BLOCKING', 'INTERNAL'} - data_path_iter = StringProperty(description="The data path relative to the context, must point to an iterable.") - data_path_item = StringProperty(description="The data path from each iterable to the value (int or float)") + data_path_iter = data_path_iter + data_path_item = data_path_item + input_scale = FloatProperty(default=0.01, description="Scale the mouse movement by this value before applying the delta") invert = BoolProperty(default=False, description="Invert the mouse input") initial_x = IntProperty(options={'HIDDEN'}) diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index b989085939f..188b011c1ab 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -1252,7 +1252,7 @@ class VIEW3D_MT_pose(bpy.types.Menu): layout.separator() layout.menu("VIEW3D_MT_pose_showhide") - layout.operator_menu_enum("pose.flags_set", 'mode', text="Bone Settings") + layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings") class VIEW3D_MT_pose_transform(bpy.types.Menu): @@ -1373,6 +1373,50 @@ class VIEW3D_MT_pose_apply(bpy.types.Menu): layout.operator("pose.visual_transform_apply") +class BoneOptions: + def draw(self, context): + layout = self.layout + bone_props = bpy.types.Bone.bl_rna.properties + + options = [ + "show_wire", + "use_deform", + "use_envelope_multiply", + "use_inherit_rotation", + "use_inherit_scale", + ] + + if context.mode == 'POSE': + data_path_iter = "selected_pose_bones" + opt_suffix = "bone." + else: + data_path_iter = "selected_bones" + opt_suffix = "" + + if context.mode == 'EDIT_ARMATURE': + options.append("lock") + + for opt in options: + props = layout.operator("wm.context_collection_boolean_set", text=bone_props[opt].name) + props.data_path_iter = data_path_iter + props.data_path_item = opt_suffix + opt + props.type = self.type + + +class VIEW3D_MT_bone_options_toggle(bpy.types.Menu, BoneOptions): + bl_label = "Toggle Options" + type = 'TOGGLE' + + +class VIEW3D_MT_bone_options_enable(bpy.types.Menu, BoneOptions): + bl_label = "Enable Options" + type = 'ENABLE' + + +class VIEW3D_MT_bone_options_disable(bpy.types.Menu, BoneOptions): + bl_label = "Disable Options" + type = 'DISABLE' + # ********** Edit Menus, suffix from ob.type ********** @@ -1966,7 +2010,7 @@ class VIEW3D_MT_edit_armature(bpy.types.Menu): layout.separator() - layout.operator_menu_enum("armature.flags_set", "mode", text="Bone Settings") + layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings") class VIEW3D_MT_armature_specials(bpy.types.Menu): -- cgit v1.2.3