CTX_DATA_BEGIN for active object only (..._from_active_object)
authorDalai Felinto <dfelinto@gmail.com>
Fri, 19 Oct 2018 11:29:15 +0000 (08:29 -0300)
committerDalai Felinto <dfelinto@gmail.com>
Fri, 19 Oct 2018 11:31:58 +0000 (08:31 -0300)
For now only `selected_pose_bones_from_active_object`, more options can
be added on demand.

Discussed this with Campbell Barton. We may need this only for selected
pose bones, time will tell.

release/scripts/startup/keyingsets_builtins.py
source/blender/blenkernel/BKE_context.h
source/blender/blenkernel/intern/context.c
source/blender/editors/armature/pose_edit.c
source/blender/editors/object/object_constraint.c
source/blender/editors/screen/screen_context.c

index 829473aa682211fc97206374f3748492c58953b6..9ba32150bbead29a1c4856545b6ded774939b399 100644 (file)
@@ -538,7 +538,7 @@ class BUILTIN_KSI_WholeCharacterSelected(KeyingSetInfo):
     # iterator - all bones regardless of selection
     def iterator(ksi, context, ks):
         # Use either the selected bones, or all of them if none are selected.
-        bones = [b for b in context.active_object.pose.bones if b.bone.select] or context.active_object.pose.bones
+        bones = context.selected_pose_bones_from_active_object or context.active_object.pose.bones
 
         for bone in bones:
             if bone.name.startswith(BUILTIN_KSI_WholeCharacter.badBonePrefixes):
index f658c07268b9d42385f05358afda70c312f49eeb..89d2aef7152e1ae5aa988a310c3ecc0b3453b7da 100644 (file)
@@ -311,6 +311,7 @@ int CTX_data_editable_bones(const bContext *C, ListBase *list);
 
 struct bPoseChannel *CTX_data_active_pose_bone(const bContext *C);
 int CTX_data_selected_pose_bones(const bContext *C, ListBase *list);
+int CTX_data_selected_pose_bones_from_active_object(const bContext *C, ListBase *list);
 int CTX_data_visible_pose_bones(const bContext *C, ListBase *list);
 
 struct bGPdata *CTX_data_gpencil_data(const bContext *C);
index ff9465378a160fb144654323400664a3fa957b59..b3a26087dd035634b76ee72067f5d9a9266be580 100644 (file)
@@ -1198,6 +1198,11 @@ int CTX_data_selected_pose_bones(const bContext *C, ListBase *list)
        return ctx_data_collection_get(C, "selected_pose_bones", list);
 }
 
+int CTX_data_selected_pose_bones_from_active_object(const bContext *C, ListBase *list)
+{
+       return ctx_data_collection_get(C, "selected_pose_bones_from_active_object", list);
+}
+
 int CTX_data_visible_pose_bones(const bContext *C, ListBase *list)
 {
        return ctx_data_collection_get(C, "visible_pose_bones", list);
index 7a973e5dd2ac928eed6a0a86872526b78a3bdb42..e60fb37b8b0bc69247fe9243dafb12a43d2413f6 100644 (file)
@@ -316,7 +316,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op)
        }
 
        /* set up path data for bones being calculated */
-       CTX_DATA_BEGIN_FOR_ID (C, bPoseChannel *, pchan, selected_pose_bones, &ob->id)
+       CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones_from_active_object)
        {
                /* verify makes sure that the selected bone has a bone with the appropriate settings */
                animviz_verify_motionpaths(op->reports, scene, ob, pchan);
index 6d39ade8fd513698be1c08cb1eadb30da1e478fe..7b72b1eb80e4f4ff278841a44ae424ab56400d29 100644 (file)
@@ -1639,7 +1639,7 @@ static bool get_new_constraint_target(bContext *C, int con_type, Object **tar_ob
        /* if the active Object is Armature, and we can search for bones, do so... */
        if ((obact->type == OB_ARMATURE) && (only_ob == false)) {
                /* search in list of selected Pose-Channels for target */
-               CTX_DATA_BEGIN_FOR_ID (C, bPoseChannel *, pchan, selected_pose_bones, &obact->id)
+               CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones_from_active_object)
                {
                        /* just use the first one that we encounter, as long as it is not the active one */
                        if (pchan != pchanact) {
index 021f5b9abd1d934e083cc84ed0c55decc012bc8c..ff048edae9c82ac4d335d8716ba6ed91efbb6d98 100644 (file)
@@ -78,7 +78,8 @@ const char *screen_context_dir[] = {
        "editable_objects", "editable_bases",
        "selected_editable_objects", "selected_editable_bases",
        "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones",
-       "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
+       "visible_pose_bones", "selected_pose_bones", "selected_pose_bones_from_active_object",
+       "active_bone", "active_pose_bone",
        "active_base", "active_object", "object", "edit_object",
        "sculpt_object", "vertex_paint_object", "weight_paint_object",
        "image_paint_object", "particle_edit_object", "uv_sculpt_object",
@@ -347,6 +348,23 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
                        return 1;
                }
        }
+       else if (CTX_data_equals(member, "selected_pose_bones_from_active_object")) {
+               Object *obpose = BKE_object_pose_armature_get(obact);
+               if (obpose && obpose->pose && obpose->data) {
+                       if (obpose != obact) {
+                               FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (obpose, pchan) {
+                                       CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
+                               } FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
+                       }
+                       else if (obact->mode & OB_MODE_POSE) {
+                               FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (obact, pchan) {
+                                       CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+                               } FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
+                       }
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+                       return 1;
+               }
+       }
        else if (CTX_data_equals(member, "active_bone")) {
                if (obact && obact->type == OB_ARMATURE) {
                        bArmature *arm = obact->data;