Proxy Protection Fixes
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 12 Jan 2010 17:08:28 +0000 (17:08 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 12 Jan 2010 17:08:28 +0000 (17:08 +0000)
* Mostly revert #24880: Transform Locks affecting animation system. This
  was implemented as a feature request from Nathan but was not the
  intended functionality, and actually gives problems instead. The transform
  locks should really only affect what the user can do, not if the property
  can be animated internally.
* Revert #25868: fix for lib linked scenes not animating. This was needed
  due to the above feature, but meant that all lib linked properties were
  editable in the UI.
* Make bone properties of on proxy-protected layers not editable. They will
  be overriden on reload/redo like lib linked data, so should not be edited.

source/blender/blenkernel/intern/anim_sys.c
source/blender/editors/transform/transform_conversions.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_pose.c

index 2a5a12cc513c1b6bac2d12dc57cd1f2a5e3f91a1..c617ca33e8a27fde0c6a9b77efa2eded61382d6c 100644 (file)
@@ -733,26 +733,20 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i
                        switch (RNA_property_type(prop)) 
                        {
                                case PROP_BOOLEAN:
-                                       if (RNA_property_array_length(&new_ptr, prop)) {
-                                               if (RNA_property_editable_index(&new_ptr, prop, array_index))
-                                                       RNA_property_boolean_set_index(&new_ptr, prop, array_index, (int)value);
-                                       }
+                                       if (RNA_property_array_length(&new_ptr, prop))
+                                               RNA_property_boolean_set_index(&new_ptr, prop, array_index, (int)value);
                                        else
                                                RNA_property_boolean_set(&new_ptr, prop, (int)value);
                                        break;
                                case PROP_INT:
-                                       if (RNA_property_array_length(&new_ptr, prop)){
-                                               if (RNA_property_editable_index(&new_ptr, prop, array_index))
-                                                       RNA_property_int_set_index(&new_ptr, prop, array_index, (int)value);
-                                       }
+                                       if (RNA_property_array_length(&new_ptr, prop))
+                                               RNA_property_int_set_index(&new_ptr, prop, array_index, (int)value);
                                        else
                                                RNA_property_int_set(&new_ptr, prop, (int)value);
                                        break;
                                case PROP_FLOAT:
-                                       if (RNA_property_array_length(&new_ptr, prop)) {
-                                               if (RNA_property_editable_index(&new_ptr, prop, array_index))
-                                                       RNA_property_float_set_index(&new_ptr, prop, array_index, value);
-                                       }
+                                       if (RNA_property_array_length(&new_ptr, prop))
+                                               RNA_property_float_set_index(&new_ptr, prop, array_index, value);
                                        else
                                                RNA_property_float_set(&new_ptr, prop, value);
                                        break;
@@ -1476,26 +1470,20 @@ void nladata_flush_channels (ListBase *channels)
                switch (RNA_property_type(prop)) 
                {
                        case PROP_BOOLEAN:
-                               if (RNA_property_array_length(ptr, prop)) {
-                                       if (RNA_property_editable_index(ptr, prop, array_index))
-                                               RNA_property_boolean_set_index(ptr, prop, array_index, (int)value);
-                               }
+                               if (RNA_property_array_length(ptr, prop))
+                                       RNA_property_boolean_set_index(ptr, prop, array_index, (int)value);
                                else
                                        RNA_property_boolean_set(ptr, prop, (int)value);
                                break;
                        case PROP_INT:
-                               if (RNA_property_array_length(ptr, prop)) {
-                                       if (RNA_property_editable_index(ptr, prop, array_index))
-                                               RNA_property_int_set_index(ptr, prop, array_index, (int)value);
-                               }
+                               if (RNA_property_array_length(ptr, prop))
+                                       RNA_property_int_set_index(ptr, prop, array_index, (int)value);
                                else
                                        RNA_property_int_set(ptr, prop, (int)value);
                                break;
                        case PROP_FLOAT:
-                               if (RNA_property_array_length(ptr, prop)) {
-                                       if (RNA_property_editable_index(ptr, prop, array_index))
-                                               RNA_property_float_set_index(ptr, prop, array_index, value);
-                               }
+                               if (RNA_property_array_length(ptr, prop))
+                                       RNA_property_float_set_index(ptr, prop, array_index, value);
                                else
                                        RNA_property_float_set(ptr, prop, value);
                                break;
index 7a89765fef2e837f619de2e0c43d39cd9079c846..5484e3cd8bf0fad5768c7d662c44f8491be9e95c 100644 (file)
@@ -714,7 +714,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
        for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
                bone = pchan->bone;
                if(bone->layer & arm->layer) {
-                       if(bone->flag & BONE_SELECTED)
+                       if((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected))
                                bone->flag |= BONE_TRANSFORM;
                        else
                                bone->flag &= ~BONE_TRANSFORM;
index 6932d775da7b8663e8d04d14e0e5114e8ed91227..29d97b273c4cb0504b0dee42381aaff557bcc831 100644 (file)
@@ -1060,9 +1060,7 @@ int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
        
        id= ptr->id.data;
 
-       /* with this, libdata is not animated by its own library fcurves, FIXME */
-//     return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION));
-       return (flag & PROP_EDITABLE) ? 1:0;
+       return (flag & PROP_EDITABLE) && (!id || !id->lib || (prop->flag & PROP_LIB_EXCEPTION));
 }
 
 /* same as RNA_property_editable(), except this checks individual items in an array */
@@ -1072,18 +1070,18 @@ int RNA_property_editable_index(PointerRNA *ptr, PropertyRNA *prop, int index)
        int flag;
 
        prop= rna_ensure_property(prop);
+
+       flag= prop->flag;
        
-       /* if there is no function to do this for a given index, 
-        * just resort to doing this on the whole array
-        */
-       if (prop->itemeditable == NULL)
-               return RNA_property_editable(ptr, prop);
-               
-       flag= prop->itemeditable(ptr, index);
+       if(prop->editable)
+               flag &= prop->editable(ptr);
+
+       if (prop->itemeditable)
+               flag &= prop->itemeditable(ptr, index);
+
        id= ptr->id.data;
-       /* with this, libdata is not animated by its own library fcurves, FIXME */
-//     return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION));
-       return (flag & PROP_EDITABLE) ? 1:0;
+
+       return (flag & PROP_EDITABLE) && (!id || !id->lib || (prop->flag & PROP_LIB_EXCEPTION));
 }
 
 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
@@ -1095,12 +1093,7 @@ int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
        if(!(prop->flag & PROP_ANIMATEABLE))
                return 0;
 
-       if(prop->editable)
-               flag= prop->editable(ptr);
-       else
-               flag= prop->flag;
-
-       return (flag & PROP_EDITABLE);
+       return (prop->flag & PROP_EDITABLE);
 }
 
 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
index b37442fab6a2a04b7a9c877848af3b1874d2d81e..0616894e9029651539cf5488b27c88dbf3b69546 100644 (file)
@@ -446,10 +446,19 @@ static int rna_PoseChannel_constraints_remove(bPoseChannel *pchan, bContext *C,
        return remove_constraint_index(&pchan->constraints, index);
 }
 
-static int rna_PoseChannel_location_editable(PointerRNA *ptr, int index)
+static int rna_PoseChannel_proxy_editable(PointerRNA *ptr)
 {
+       Object *ob= (Object*)ptr->id.data;
+       bArmature *arm= ob->data;
        bPoseChannel *pchan= (bPoseChannel*)ptr->data;
        
+       return (ob->proxy && pchan->bone && (pchan->bone->layer & arm->layer_protected))? 0: PROP_EDITABLE;
+}
+
+static int rna_PoseChannel_location_editable(PointerRNA *ptr, int index)
+{
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+
        /* only if the axis in question is locked, not editable... */
        if ((index == 0) && (pchan->protectflag & OB_LOCK_LOCX))
                return 0;
@@ -674,6 +683,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_PoseChannel_name_set");
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_struct_name_property(srna, prop);
 
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
@@ -685,12 +695,14 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_int_sdna(prop, NULL, "pathsf");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Bone Paths Calculation Start Frame", "Starting frame of range of frames to use for Bone Path calculations.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "path_end_frame", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "pathef");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Bone Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        rna_def_motionpath_common(srna);
@@ -717,12 +729,14 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_location_editable");
        RNA_def_property_ui_text(prop, "Location", "");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_scale_editable");
        RNA_def_property_ui_text(prop, "Scale", "");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "rotation_quaternion", PROP_FLOAT, PROP_QUATERNION);
@@ -730,6 +744,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_4d_editable");
        RNA_def_property_float_array_default(prop, default_quat);
        RNA_def_property_ui_text(prop, "Quaternion Rotation", "Rotation in Quaternions.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
                /* XXX: for axis-angle, it would have been nice to have 2 separate fields for UI purposes, but
@@ -741,11 +756,13 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_4d_editable");
        RNA_def_property_float_array_default(prop, default_axisAngle);
        RNA_def_property_ui_text(prop, "Axis-Angle Rotation", "Angle of Rotation for Axis-Angle rotation representation.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float_sdna(prop, NULL, "eul");
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_euler_editable");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_ui_text(prop, "Euler Rotation", "Rotation in Eulers.");
        RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
@@ -753,6 +770,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_enum_sdna(prop, NULL, "rotmode");
        RNA_def_property_enum_items(prop, prop_rotmode_items); // XXX move to using a single define of this someday
        RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_ui_text(prop, "Rotation Mode", "");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
@@ -797,113 +815,133 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
        RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
        RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
        RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
        RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
        RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
        RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
        prop= RNA_def_property(srna, "ik_rot_control", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ROTCTL);
        RNA_def_property_ui_text(prop, "IK rot control", "Apply channel rotation as IK constraint");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
        prop= RNA_def_property(srna, "ik_lin_control", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_LINCTL);
        RNA_def_property_ui_text(prop, "IK rot control", "Apply channel size as IK constraint if stretching is enabled");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
        prop= RNA_def_property(srna, "ik_min_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[0]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK X Minimum", "Minimum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_max_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[0]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK X Maximum", "Maximum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_min_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[1]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Y Minimum", "Minimum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_max_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[1]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Y Maximum", "Maximum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_min_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[2]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Z Minimum", "Minimum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_max_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[2]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Z Maximum", "Maximum angles for IK Limit");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[0]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK X Stiffness", "IK stiffness around the X axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[1]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Y Stiffness", "IK stiffness around the Y axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_z", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[2]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Z Stiffness", "IK stiffness around the Z axis.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
        prop= RNA_def_property(srna, "ik_stretch", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ikstretch");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Stretch", "Allow scaling of the bone for IK.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
        prop= RNA_def_property(srna, "ik_rot_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ikrotweight");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Rot Weight", "Weight of rotation constraint for IK.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "ik_lin_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "iklinweight");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Lin Weight", "Weight of scale constraint for IK.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        /* custom bone shapes */
@@ -912,6 +950,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "Object");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "custom_shape_transform", PROP_POINTER, PROP_NONE);
@@ -919,6 +958,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "PoseBone");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Custom Shape Transform", "Bone that defines the display transform of this custom shape.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        /* bone groups */
@@ -927,6 +967,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set", "rna_PoseChannel_bone_group_index_range");
        RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group).");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
@@ -934,6 +975,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL);
        RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
        /* transform locks */
@@ -941,29 +983,35 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
                // XXX this is sub-optimal - it really should be included above, but due to technical reasons we can't do this!
        prop= RNA_def_property(srna, "lock_rotation_w", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTW);
        RNA_def_property_ui_text(prop, "Lock Rotation (4D Angle)", "Lock editing of 'angle' component of four-component rotations in the interface.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
                // XXX this needs a better name
        prop= RNA_def_property(srna, "lock_rotations_4d", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROT4D);
        RNA_def_property_ui_text(prop, "Lock Rotations (4D)", "Lock editing of four component rotations by components (instead of as Eulers).");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface.");
+       RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        RNA_api_pose_channel(srna);