Revision: 19070
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19070
Author:   aligorith
Date:     2009-02-21 12:22:06 +0100 (Sat, 21 Feb 2009)

Log Message:
-----------
Graph Editor: NKEY panel - added code to retrieve 'active F-Curve'

Currently, this is just used to print the 'name' of the active F-Curve in a 
panel for verification purposes. This is the recommended way of getting this 
info. 

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
    branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
    
branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c

Modified: 
branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c  
2009-02-21 10:38:58 UTC (rev 19069)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_filter.c  
2009-02-21 11:22:06 UTC (rev 19070)
@@ -511,12 +511,15 @@
                        if (!(filter_mode & ANIMFILTER_FOREDIT) || 
EDITABLE_FCU(fcu)) {
                                /* only include this curve if selected */
                                if (!(filter_mode & ANIMFILTER_SEL) || 
(SEL_FCU(fcu))) {
-                                       /* owner/ownertype will be either 
object or action-channel, depending if it was dopesheet or part of an action */
-                                       ale= make_new_animlistelem(fcu, 
ANIMTYPE_FCURVE, owner, ownertype, owner_id);
-                                       
-                                       if (ale) {
-                                               BLI_addtail(anim_data, ale);
-                                               items++;
+                                       /* only include if this curve is active 
*/
+                                       if (!(filter_mode & ANIMFILTER_ACTIVE) 
|| (fcu->flag & FCURVE_ACTIVE)) {
+                                               /* owner/ownertype will be 
either object or action-channel, depending if it was dopesheet or part of an 
action */
+                                               ale= make_new_animlistelem(fcu, 
ANIMTYPE_FCURVE, owner, ownertype, owner_id);
+                                               
+                                               if (ale) {
+                                                       BLI_addtail(anim_data, 
ale);
+                                                       items++;
+                                               }
                                        }
                                }
                        }

Modified: 
branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h    
2009-02-21 10:38:58 UTC (rev 19069)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_anim_api.h    
2009-02-21 11:22:06 UTC (rev 19070)
@@ -154,6 +154,7 @@
        ANIMFILTER_CHANNELS             = (1<<4),       /* make list for 
interface drawing */
        ANIMFILTER_ACTGROUPED   = (1<<5),       /* belongs to the active 
actiongroup */
        ANIMFILTER_CURVEVISIBLE = (1<<6),       /* F-Curve is visible for 
editing/viewing in Graph Editor */
+       ANIMFILTER_ACTIVE               = (1<<7),       /* channel should be 
'active' */  // FIXME: this is only relevant for F-Curves for now
 } eAnimFilter_Flags;
 
 

Modified: 
branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
===================================================================
--- 
branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c  
    2009-02-21 10:38:58 UTC (rev 19069)
+++ 
branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c  
    2009-02-21 11:22:06 UTC (rev 19070)
@@ -96,20 +96,24 @@
 }
 
 
-static void graph_panel_properties(const bContext *C, ARegion *ar, short 
cntrl)        // GRAPH_HANDLER_SETTINGS
+static void graph_panel_properties(const bContext *C, ARegion *ar, short 
cntrl, bAnimListElem *ale)    // GRAPH_HANDLER_SETTINGS
 {
-       //ScrArea *sa= CTX_wm_area(C);
-       //Scene *scene= CTX_data_scene(C);
        uiBlock *block;
+       char name[128];
 
        block= uiBeginBlock(C, ar, "graph_panel_properties", UI_EMBOSS, 
UI_HELV);
        if(uiNewPanel(C, ar, block, "Properties", "Graph", 340, 30, 318, 
254)==0) return;
        uiBlockSetHandleFunc(block, do_graph_region_buttons, NULL);
 
        /* to force height */
-       uiNewPanelHeight(block, 264);
+       uiNewPanelHeight(block, 204);
 
-       uiDefBut(block, LABEL, 1, "Testing",                                    
10, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
+       // XXX testing buttons
+       uiDefBut(block, LABEL, 1, "Active F-Curve:",                            
        10, 200, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
+       
+       getname_anim_fcurve(name, ale->id, (FCurve *)ale->data);
+       uiDefBut(block, LABEL, 1, name,                                 30, 
180, 300, 19, NULL, 0.0, 0.0, 0, 0, "Name of Active F-Curve");
+       
 #if 0
        uiBlockBeginAlign(block);
        uiDefButF(block, NUM, B_REDR, "Spacing:",               10, 200, 140, 
19, &v3d->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines");
@@ -119,24 +123,65 @@
 #endif
 }
 
+/* Find 'active' F-Curve. It must be editable, since that's the purpose of 
these buttons (subject to change).  
+ * We return the 'wrapper' since it contains valuable context info (about 
hierarchy), which will need to be freed 
+ * when the caller is done with it.
+ */
+// TODO: move this to anim api with another name?
+static bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
+{
+       ListBase anim_data = {NULL, NULL};
+       int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | 
ANIMFILTER_ACTIVE | ANIMFILTER_CURVESONLY);
+       int items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, 
ac->datatype);
+       
+       /* We take the first F-Curve only, since some other ones may have had 
'active' flag set
+        * if they were from linked data.
+        */
+       if (items) {
+               bAnimListElem *ale= (bAnimListElem *)anim_data.first;
+               
+               /* remove first item from list, then free the rest of the list 
and return the stored one */
+               BLI_remlink(&anim_data, ale);
+               BLI_freelistN(&anim_data);
+               
+               return ale;
+       }
+       
+       /* no active F-Curve */
+       return NULL;
+}
 
-
 void graph_region_buttons(const bContext *C, ARegion *ar)
 {
        SpaceIpo *sipo= (SpaceIpo *)CTX_wm_space_data(C);
+       bAnimContext ac;
+       bAnimListElem *ale= NULL;
        
+       /* for now, only draw if we could init the anim-context info (necessary 
for all animation-related tools) 
+        * to work correctly is able to be correctly retrieved. There's no 
point showing empty panels?
+        */
+       if (ANIM_animdata_get_context(C, &ac) == 0) 
+               return;
+       
+       
+       /* try to find 'active' F-Curve */
+       ale= get_active_fcurve_channel(&ac);
+       if (ale == NULL) 
+               return; 
+               
                // XXX temp panel for testing
-       graph_panel_properties(C, ar, 0);
+       graph_panel_properties(C, ar, 0, ale);
        
        /* driver settings for active F-Curve (only for 'Drivers' mode) */
        if (sipo->mode == SIPO_MODE_DRIVERS) {
                //graph_panel_drivers(C, ar, 0);
        }
-       
-       
+
        uiDrawPanels(C, 1);             /* 1 = align */
        uiMatchPanelsView2d(ar); /* sets v2d->totrct */
        
+       /* free temp data */
+       MEM_freeN(ale);
 }
 
 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to