Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-08-31 04:46:48 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-08-31 05:07:33 +0300
commit63a5f723d6bd820c8c4d6e1d74d983595e00829e (patch)
tree0e167bcb8af316747edbfd8113b6f251067b1b3c /source/blender/windowmanager/intern/wm_operators.c
parent3e4d720ae4836783db978b0a378e97b47dcaca87 (diff)
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.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_operators.c')
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c51
1 files 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;