NLA Editor: Show the ID+AnimData block that the AnimData panel is showing the
authorJoshua Leung <aligorith@gmail.com>
Sat, 16 Mar 2013 02:42:19 +0000 (02:42 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sat, 16 Mar 2013 02:42:19 +0000 (02:42 +0000)
active action for

source/blender/editors/space_nla/nla_buttons.c

index 1e0d8437150bb9cfed07b5dc8359786ef98bf89b..e952bec0dd074b102b28deaf85ce4dc027d5a7b6 100644 (file)
@@ -147,16 +147,25 @@ static int nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA
                        case ANIMTYPE_DSSPK:
                        {
                                /* for these channels, we only do AnimData */
-                               if (ale->id && ale->adt) {
-                                       if (adt_ptr) {
-                                               /* AnimData pointer */
-                                               RNA_pointer_create(ale->id, &RNA_AnimData, ale->adt, adt_ptr);
-                                               
-                                               /* set found status to -1, since setting to 1 would break the loop 
-                                                * and potentially skip an active NLA-Track in some cases...
-                                                */
-                                               found = -1;
+                               if (ale->adt && adt_ptr) {
+                                       ID *id;
+                                       
+                                       if ((ale->data == NULL) || (ale->type == ANIMTYPE_OBJECT)) {
+                                               /* ale->data is not an ID block! */
+                                               id = ale->id;
                                        }
+                                       else {
+                                               /* ale->data is always the proper ID block we need, but ale->id may not be (i.e. for textures) */
+                                               id = (ID *)ale->data;
+                                       }
+                                       
+                                       /* AnimData pointer */
+                                       RNA_pointer_create(id, &RNA_AnimData, ale->adt, adt_ptr);
+                                       
+                                       /* set found status to -1, since setting to 1 would break the loop 
+                                        * and potentially skip an active NLA-Track in some cases...
+                                        */
+                                       found = -1;
                                }
                        }
                        break;
@@ -249,6 +258,28 @@ static void nla_panel_animdata(const bContext *C, Panel *pa)
        block = uiLayoutGetBlock(layout);
        uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
        
+       /* AnimData Source Properties ----------------------------------- */
+       
+       /* icon + id-block name of block where AnimData came from to prevent 
+        * accidentally changing the properties of the wrong action
+        */
+       if (adt_ptr.id.data) {
+               ID *id = adt_ptr.id.data;
+               PointerRNA id_ptr;
+               
+               RNA_id_pointer_create(id, &id_ptr);
+               
+               /* ID-block name > AnimData */
+               row = uiLayoutRow(layout, TRUE);
+               uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT);
+               
+               uiItemL(row, id->name + 2, RNA_struct_ui_icon(id_ptr.type));  /* id-block (src) */
+               uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC);                   /* expander */
+               uiItemL(row, IFACE_("Animation Data"), ICON_ANIM_DATA);       /* animdata */
+               
+               uiItemS(layout);
+       }
+       
        /* Active Action Properties ------------------------------------- */
        /* action */
        row = uiLayoutRow(layout, TRUE);