From 63a5f723d6bd820c8c4d6e1d74d983595e00829e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 31 Aug 2021 11:46:48 +1000 Subject: Fix T90723: User menus & shortcuts fails for sequences, bones & NLA Use context members instead of not working well or failing due to: - Missing "path" functions (in the case of edit-bones). - Paths containing names (in the case of sequence-strips or pose-bones). While technically correct it's not useful for shortcuts or menu items to lookup data by name. --- source/blender/windowmanager/intern/wm_operators.c | 51 ++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index dab3d7525db..1e214a3b52b 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -40,6 +40,7 @@ #include "CLG_log.h" #include "DNA_ID.h" +#include "DNA_armature_types.h" #include "DNA_brush_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" @@ -58,6 +59,7 @@ #include "BLI_string_utils.h" #include "BLI_utildefines.h" +#include "BKE_anim_data.h" #include "BKE_brush.h" #include "BKE_colortools.h" #include "BKE_context.h" @@ -426,8 +428,6 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr const char *member_id = NULL; bool is_id = false; - if (ptr->owner_id) { - # define CTX_TEST_PTR_ID(C, member, idptr) \ { \ const char *ctx_member = member; \ @@ -463,17 +463,62 @@ static const char *wm_context_member_from_ptr(bContext *C, const PointerRNA *ptr } \ (void)0 - switch (GS(ptr->owner_id->name)) { + /* A version of #TEST_PTR_DATA_TYPE that calls `CTX_data_pointer_get_type(C, member)`. */ +# define TEST_PTR_DATA_TYPE_FROM_CONTEXT(member, rna_type, rna_ptr) \ + { \ + const char *ctx_member = member; \ + if (RNA_struct_is_a((rna_ptr)->type, &(rna_type)) && \ + (rna_ptr)->data == (CTX_data_pointer_get_type(C, ctx_member, &(rna_type)).data)) { \ + member_id = ctx_member; \ + break; \ + } \ + } \ + (void)0 + + /* General checks (multiple ID types). */ + if (ptr->owner_id) { + const ID_Type ptr_id_type = GS(ptr->owner_id->name); + + /* Support break in the macros for an early exit. */ + do { + /* Animation Data. */ + if (id_type_can_have_animdata(ptr_id_type)) { + TEST_PTR_DATA_TYPE_FROM_CONTEXT("active_nla_track", RNA_NlaTrack, ptr); + TEST_PTR_DATA_TYPE_FROM_CONTEXT("active_nla_strip", RNA_NlaStrip, ptr); + } + } while (0); + } + + /* Specific ID type checks. */ + if (ptr->owner_id && (member_id == NULL)) { + + const ID_Type ptr_id_type = GS(ptr->owner_id->name); + switch (ptr_id_type) { case ID_SCE: { + TEST_PTR_DATA_TYPE_FROM_CONTEXT("active_sequence_strip", RNA_Sequence, ptr); + CTX_TEST_PTR_ID(C, "scene", ptr->owner_id); break; } case ID_OB: { + TEST_PTR_DATA_TYPE_FROM_CONTEXT("active_pose_bone", RNA_PoseBone, ptr); + CTX_TEST_PTR_ID(C, "object", ptr->owner_id); break; } /* from rna_Main_objects_new */ case OB_DATA_SUPPORT_ID_CASE: { + + if (ptr_id_type == ID_AR) { + const bArmature *arm = (bArmature *)ptr->owner_id; + if (arm->edbo != NULL) { + TEST_PTR_DATA_TYPE("active_bone", RNA_EditBone, ptr, arm->act_edbone); + } + else { + TEST_PTR_DATA_TYPE("active_bone", RNA_Bone, ptr, arm->act_bone); + } + } + # define ID_CAST_OBDATA(id_pt) (((Object *)(id_pt))->data) CTX_TEST_PTR_ID_CAST(C, "object", "object.data", ID_CAST_OBDATA, ptr->owner_id); break; -- cgit v1.2.3