Revision: 23827
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23827
Author:   aligorith
Date:     2009-10-14 11:54:29 +0200 (Wed, 14 Oct 2009)

Log Message:
-----------
DopeSheet/Action Editors - Summary Channel Tweaks:

* Summary channel now works in DopeSheet AND Action Editors
* By clicking on the expand/collapse widget on the summary channel, you can now 
show/hide all the other channels in the editor. 

Modified Paths:
--------------
    trunk/blender/source/blender/editors/animation/anim_channels_defines.c
    trunk/blender/source/blender/editors/animation/anim_filter.c
    trunk/blender/source/blender/editors/space_action/action_header.c
    trunk/blender/source/blender/makesdna/DNA_action_types.h

Modified: trunk/blender/source/blender/editors/animation/anim_channels_defines.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_defines.c      
2009-10-14 09:46:41 UTC (rev 23826)
+++ trunk/blender/source/blender/editors/animation/anim_channels_defines.c      
2009-10-14 09:54:29 UTC (rev 23827)
@@ -280,11 +280,13 @@
 
 /* Settings ------------------------------------------- */
 
+#if 0
 /* channel type has no settings */
 static short acf_generic_none_setting_valid(bAnimContext *ac, bAnimListElem 
*ale, int setting)
 {
        return 0;
 }
+#endif
 
 /* check if some setting exists for this object-based data-expander (category 
only) */
 static short acf_generic_dsexpand_setting_valid(bAnimContext *ac, 
bAnimListElem *ale, int setting)
@@ -372,6 +374,50 @@
        return ICON_BORDERMOVE;
 }
 
+/* check if some setting exists for this channel */
+static short acf_summary_setting_valid(bAnimContext *ac, bAnimListElem *ale, 
int setting)
+{
+       /* only expanded is supported, as it is used for hiding all stuff which 
the summary covers */
+       return (setting == ACHANNEL_SETTING_EXPAND);
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_summary_setting_flag(int setting, short *neg)
+{
+       if (setting == ACHANNEL_SETTING_EXPAND) {
+               /* expanded */
+               *neg= 1;
+               return ADS_FLAG_SUMMARY_COLLAPSED;
+       }
+       else {
+               /* unsupported */
+               *neg= 0;
+               return 0;
+       }
+}
+
+/* get pointer to the setting */
+static void *acf_summary_setting_ptr(bAnimListElem *ale, int setting, short 
*type)
+{
+       bAnimContext *ac= (bAnimContext *)ale->data;
+       
+       /* if data is valid, return pointer to active dopesheet's relevant flag 
+        *      - this is restricted to DopeSheet/Action Editor only
+        */
+       if ((ac->sa) && (ac->spacetype == SPACE_ACTION) && (setting == 
ACHANNEL_SETTING_EXPAND)) {
+               SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
+               bDopeSheet *ads= &saction->ads;
+               
+               /* return pointer to DopeSheet's flag */
+               GET_ACF_FLAG_PTR(ads->flag);
+       }
+       else {
+               /* can't return anything useful - unsupported */
+               *type= 0;
+               return 0;
+       }
+}
+
 /* all animation summary (DopeSheet only) type define */
 static bAnimChannelType ACF_SUMMARY = 
 {
@@ -382,9 +428,9 @@
        acf_summary_name,                                       /* name */
        acf_summary_icon,                                       /* icon */
        
-       acf_generic_none_setting_valid,         /* has setting */
-       NULL,                                                           /* flag 
for setting */
-       NULL                                                            /* 
pointer for setting */
+       acf_summary_setting_valid,                      /* has setting */
+       acf_summary_setting_flag,                       /* flag for setting */
+       acf_summary_setting_ptr                         /* pointer for setting 
*/
 };
 
 /* Scene ------------------------------------------- */

Modified: trunk/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_filter.c        
2009-10-14 09:46:41 UTC (rev 23826)
+++ trunk/blender/source/blender/editors/animation/anim_filter.c        
2009-10-14 09:54:29 UTC (rev 23827)
@@ -1520,21 +1520,6 @@
                return 0;
        }
        
-       /* dopesheet summary 
-        *      - only for drawing and/or selecting keyframes in channels, but 
not for real editing 
-        *      - only useful for DopeSheet Editor, where the summary is useful
-        */
-       // TODO: we should really check if some other prohibited filters are 
also active, but that can be for later
-       if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & 
ADS_FILTER_SUMMARY)) {
-               ale= make_new_animlistelem(ac, ANIMTYPE_SUMMARY, NULL, 
ANIMTYPE_NONE, NULL);
-               if (ale) {
-                       BLI_addtail(anim_data, ale);
-                       items++;
-               }
-               
-               // TODO: if the summary gets a collapse widget, then we could 
make the other stuff not get shown... 
-       }
-       
        /* scene-linked animation */
        // TODO: sequencer, composite nodes - are we to include those here too?
        {
@@ -1887,6 +1872,50 @@
        return items;
 }
 
+/* Summary track for DopeSheet/Action Editor 
+ *     - return code is whether the summary lets the other channels get drawn
+ */
+static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase 
*anim_data, int filter_mode, int *items)
+{
+       bDopeSheet *ads = NULL;
+       
+       /* get the DopeSheet information to use 
+        *      - we should only need to deal with the DopeSheet/Action Editor, 
+        *        since all the other Animation Editors won't have this concept
+        *        being applicable.
+        */
+       if ((ac && ac->sa) && (ac->sa->spacetype == SPACE_ACTION)) {
+               SpaceAction *saction= (SpaceAction *)ac->sa->spacedata.first;
+               ads= &saction->ads;
+       }
+       else {
+               /* invalid space type - skip this summary channels */
+               return 1;
+       }
+       
+       /* dopesheet summary 
+        *      - only for drawing and/or selecting keyframes in channels, but 
not for real editing 
+        *      - only useful for DopeSheet Editor, where the summary is useful
+        */
+       // TODO: we should really check if some other prohibited filters are 
also active, but that can be for later
+       if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & 
ADS_FILTER_SUMMARY)) {
+               bAnimListElem *ale= make_new_animlistelem(ac, ANIMTYPE_SUMMARY, 
NULL, ANIMTYPE_NONE, NULL);
+               if (ale) {
+                       BLI_addtail(anim_data, ale);
+                       (*items)++;
+               }
+               
+               /* if summary is collapsed, don't show other channels beneath 
this 
+                *      - this check is put inside the summary check so that it 
doesn't interfere with normal operation
+                */ 
+               if (ads->flag & ADS_FLAG_SUMMARY_COLLAPSED)
+                       return 0;
+       }
+       
+       /* the other channels beneath this can be shown */
+       return 1;
+}  
+
 /* ----------- Public API --------------- */
 
 /* This function filters the active data source to leave only animation 
channels suitable for
@@ -1907,24 +1936,42 @@
                
                /* firstly filter the data */
                switch (datatype) {
-                       case ANIMCONT_ACTION:
-                               items= animdata_filter_action(anim_data, NULL, 
data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+                       case ANIMCONT_ACTION:   /* 'Action Editor' */
+                       {
+                               /* the check for the DopeSheet summary is 
included here since the summary works here too */
+                               if (animdata_filter_dopesheet_summary(ac, 
anim_data, filter_mode, &items))
+                                       items += 
animdata_filter_action(anim_data, NULL, data, filter_mode, NULL, ANIMTYPE_NONE, 
(ID *)obact);
+                       }
                                break;
                                
                        case ANIMCONT_SHAPEKEY:
+                       {
                                //items= animdata_filter_shapekey(anim_data, 
data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+                       }
                                break;
                                
                        case ANIMCONT_GPENCIL:
+                       {
                                //items= animdata_filter_gpencil(anim_data, 
data, filter_mode);
+                       }
                                break;
                                
-                       case ANIMCONT_DOPESHEET:
-                       case ANIMCONT_FCURVES:
-                       case ANIMCONT_DRIVERS:
-                       case ANIMCONT_NLA:
-                               items= animdata_filter_dopesheet(anim_data, ac, 
data, filter_mode);
+                       case ANIMCONT_DOPESHEET: /* 'DopeSheet Editor' */
+                       {
+                               /* the DopeSheet editor is the primary place 
where the DopeSheet summaries are useful */
+                               if (animdata_filter_dopesheet_summary(ac, 
anim_data, filter_mode, &items))
+                                       items += 
animdata_filter_dopesheet(anim_data, ac, data, filter_mode);
+                       }
                                break;
+                               
+                       case ANIMCONT_FCURVES: /* Graph Editor -> 
FCurves/Animation Editing */
+                       case ANIMCONT_DRIVERS: /* Graph Editor -> Drivers 
Editing */
+                       case ANIMCONT_NLA: /* NLA Editor */
+                       {
+                               /* all of these editors use the basic DopeSheet 
data for filtering options, but don't have all the same features */
+                               items = animdata_filter_dopesheet(anim_data, 
ac, data, filter_mode);
+                       }
+                               break;
                }
                        
                /* remove any weedy entries */

Modified: trunk/blender/source/blender/editors/space_action/action_header.c
===================================================================
--- trunk/blender/source/blender/editors/space_action/action_header.c   
2009-10-14 09:46:41 UTC (rev 23826)
+++ trunk/blender/source/blender/editors/space_action/action_header.c   
2009-10-14 09:54:29 UTC (rev 23827)
@@ -326,23 +326,23 @@
        
        xco += (90 + 8);
        
+       /* SUMMARY CHANNEL */
+       uiDefIconTextButBitI(block, TOG, ADS_FILTER_SUMMARY, B_REDR, 
ICON_BORDERMOVE, "Summary", xco,yco,XIC*4,YIC, &(saction->ads.filterflag), 0, 
0, 0, 0, "Include DopeSheet summary row"); // TODO: needs a better icon
+       xco += (XIC*4.5);
+       
        /*if (ac.data)*/ 
        {
                /* MODE-DEPENDENT DRAWING */
                if (saction->mode == SACTCONT_DOPESHEET) {
                        /* FILTERING OPTIONS */
-                               /* DopeSheet summary...  */
-                       uiDefIconTextButBitI(block, TOG, ADS_FILTER_SUMMARY, 
B_REDR, ICON_BORDERMOVE, "Summary", xco,yco,XIC*4,YIC, 
&(saction->ads.filterflag), 0, 0, 0, 0, "Include DopeSheet summary row"); // 
TODO: needs a better icon
-                       xco += (XIC*3.5);
-                       
-                               /* Standard filtering... */
+                       xco -= XIC; // XXX first button incurs this offset...
                        xco= ANIM_headerUI_standard_buttons(C, &saction->ads, 
block, xco, yco);
                }
                else if (saction->mode == SACTCONT_ACTION) {
                        uiLayout *layout;
                        bScreen *sc= CTX_wm_screen(C);
                        PointerRNA ptr;
-
+                       
                        RNA_pointer_create(&sc->id, &RNA_SpaceDopeSheetEditor, 
saction, &ptr);
                        
                        layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, 
UI_LAYOUT_HEADER, xco, 20+3, 20, 1, U.uistyles.first);
@@ -379,7 +379,7 @@
                xco += (XIC + 8);
        }
 
-       /* always as last  */
+       /* always as last */
        UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, 
(int)(ar->v2d.tot.ymax-ar->v2d.tot.ymin));
        
        uiEndBlock(C, block);

Modified: trunk/blender/source/blender/makesdna/DNA_action_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_action_types.h    2009-10-14 
09:46:41 UTC (rev 23826)
+++ trunk/blender/source/blender/makesdna/DNA_action_types.h    2009-10-14 
09:54:29 UTC (rev 23827)
@@ -444,9 +444,9 @@
 } DOPESHEET_FILTERFLAG;        
 
 /* DopeSheet general flags */
-//typedef enum DOPESHEET_FLAG {
-       
-//} DOPESHEET_FLAG;
+typedef enum DOPESHEET_FLAG {
+       ADS_FLAG_SUMMARY_COLLAPSED      = (1<<0),       /* when summary is 
shown, it is collapsed, so all other channels get hidden */
+} DOPESHEET_FLAG;
 
 
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to