NLA Tweaks:
authorJoshua Leung <aligorith@gmail.com>
Sun, 2 Aug 2009 13:15:20 +0000 (13:15 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sun, 2 Aug 2009 13:15:20 +0000 (13:15 +0000)
* "Pushing down" the action to make a new strip will now make the new strip the 'active' one.

* 'Active Action' field in Animation Data panel is now editable as long as we aren't in "tweakmode"

source/blender/blenkernel/BKE_nla.h
source/blender/blenkernel/intern/nla.c
source/blender/editors/space_nla/nla_buttons.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_pose.c

index 241a8fd7b59e58facacbfbfe1609e8b3abeb1455..989043c1d67eaab7d809d5a40f3c8f0a6f9032eb 100644 (file)
@@ -80,6 +80,7 @@ short BKE_nlatrack_add_strip(struct NlaTrack *nlt, struct NlaStrip *strip);
 /* ............ */
 
 struct NlaStrip *BKE_nlastrip_find_active(struct NlaTrack *nlt);
+void BKE_nlastrip_set_active(struct AnimData *adt, struct NlaStrip *strip);
 
 short BKE_nlastrip_within_bounds(struct NlaStrip *strip, float min, float max);
 
index 1871ec006f4e3e3864ac7e8de88d1960c5e99b51..c41c4ae78e43c57708b4c991980d6c099820e658 100644 (file)
@@ -993,6 +993,28 @@ NlaStrip *BKE_nlastrip_find_active (NlaTrack *nlt)
        return NULL;
 }
 
+/* Make the given NLA-Strip the active one within the given block */
+void BKE_nlastrip_set_active (AnimData *adt, NlaStrip *strip)
+{
+       NlaTrack *nlt;
+       NlaStrip *nls;
+       
+       /* sanity checks */
+       if (adt == NULL)
+               return;
+       
+       /* loop over tracks, deactivating*/
+       for (nlt= adt->nla_tracks.first; nlt; nlt= nlt->next) {
+               for (nls= nlt->strips.first; nls; nls= nls->next)  {
+                       if (nls != strip)
+                               nls->flag &= ~NLASTRIP_FLAG_ACTIVE;
+                       else
+                               nls->flag |= NLASTRIP_FLAG_ACTIVE;
+               }
+       }
+}
+
+
 /* Does the given NLA-strip fall within the given bounds (times)? */
 short BKE_nlastrip_within_bounds (NlaStrip *strip, float min, float max)
 {
@@ -1403,6 +1425,9 @@ void BKE_nla_action_pushdown (AnimData *adt)
                        // FIXME: this needs to be more automated, since user can rearrange strips
                        strip->extendmode= NLASTRIP_EXTEND_HOLD_FORWARD;
                }
+               
+               /* make strip the active one... */
+               BKE_nlastrip_set_active(adt, strip);
        }
 }
 
index a87ab36714cdce5a0e1ad7b6d020da335f9e4b6a..7184737e0ba31dc598f5ad6771832072562188fe 100644 (file)
@@ -210,7 +210,6 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
        /* Active Action Properties ------------------------------------- */
        /* action */
        row= uiLayoutRow(layout, 1);
-               uiLayoutSetEnabled(row, (adt->flag & ADT_NLA_EDIT_ON)==0); 
                uiItemR(row, NULL, 0, &adt_ptr, "action", 0, 0, 0);
        
        /* extrapolation */
index 76ed62f64381285e00b0afa7b1453e022108e622..e334e2b5e909d03877ea5b3ee791ed8226d3ae5e 100644 (file)
 
 #ifdef RNA_RUNTIME
 
+static int rna_AnimData_action_editable(PointerRNA *ptr)
+{
+       AnimData *adt= (AnimData *)ptr->data;
+       
+       /* active action is only editable when it is not a tweaking strip */
+       if ((adt->flag & ADT_NLA_EDIT_ON) || (adt->actstrip) || (adt->tmpact))
+               return 0;
+       else
+               return 1;
+}
+
 static void rna_ksPath_RnaPath_get(PointerRNA *ptr, char *value)
 {
        KS_Path *ksp= (KS_Path *)ptr->data;
@@ -191,6 +202,7 @@ void rna_def_animdata(BlenderRNA *brna)
        /* Active Action */
        prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
        RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock.");
+       RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
        
        /* Active Action Settings */
        prop= RNA_def_property(srna, "action_extrapolation", PROP_ENUM, PROP_NONE);
index 095471dd053865e732ffece779a780305c53923a..0148ce819d4ffb7852343bca50efc539f06e16b1 100644 (file)
@@ -60,7 +60,6 @@ static void rna_Pose_update(bContext *C, PointerRNA *ptr)
 
 static char *rna_PoseChannel_path(PointerRNA *ptr)
 {
-       // XXX do we really need the 'pose.' bit?
        return BLI_sprintfN("pose.pose_channels[\"%s\"]", ((bPoseChannel*)ptr->data)->name);
 }