svn merge -r 22628:22753 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / blender / editors / space_action / action_draw.c
index 4fb22064c1765ddb7a36752fb4da61c0b8dd5406..1403b6c8ff69654471d2af7dcc32b10b40be0226 100644 (file)
 #include "ED_screen.h"
 #include "ED_space_api.h"
 
-#if 0 // XXX old includes for reference only
-       #include "BIF_editaction.h"
-       #include "BIF_editkey.h"
-       #include "BIF_editnla.h"
-       #include "BIF_drawgpencil.h"
-       #include "BIF_keyframing.h"
-       #include "BIF_language.h"
-       #include "BIF_space.h"
        
-       #include "BDR_editcurve.h"
-       #include "BDR_gpencil.h"
-
-       #include "BSE_drawnla.h"
-       #include "BSE_drawipo.h"
-       #include "BSE_drawview.h"
-       #include "BSE_editaction_types.h"
-       #include "BSE_editipo.h"
-       #include "BSE_headerbuttons.h"
-       #include "BSE_time.h"
-       #include "BSE_view.h"
-#endif // XXX old defines for reference only
-
-/* XXX */
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-
-/********************************** Slider Stuff **************************** */
-
-#if 0 // XXX all of this slider stuff will need a rethink!
-/* sliders for shapekeys */
-static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
-{
-       int           i;
-       char          str[64];
-       float         x, y;
-       uiBlock       *block;
-       uiBut             *but;
-       
-       /* lets make the shapekey sliders */
-       
-       /* reset the damn myortho2 or the sliders won't draw/redraw
-        * correctly *grumble*
-        */
-       mywinset(curarea->win);
-       myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
-       
-    sprintf(str, "actionbuttonswin %d", curarea->win);
-    block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS);
-
-       x = ACHANNEL_NAMEWIDTH + 1;
-    y = 0.0f;
-       
-       uiBlockSetEmboss(block, UI_EMBOSSN);
-
-       if (!(G.saction->flag & SACTION_SLIDERS)) {
-               ACTWIDTH = ACHANNEL_NAMEWIDTH;
-               but=uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR, 
-                                         ICON_DISCLOSURE_TRI_RIGHT,
-                                         ACHANNEL_NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
-                                         XIC,YIC-2,
-                                         &(G.saction->flag), 0, 0, 0, 0, 
-                                         "Show action window sliders");
-               /* no hilite, the winmatrix is not correct later on... */
-               uiButSetFlag(but, UI_NO_HILITE);
-       }
-       else {
-               but= uiDefIconButBitS(block, TOG, SACTION_SLIDERS, B_REDR, 
-                                         ICON_DISCLOSURE_TRI_DOWN,
-                                         ACHANNEL_NAMEWIDTH - XIC - 5, (short)y + CHANNELHEIGHT,
-                                         XIC,YIC-2,
-                                         &(G.saction->flag), 0, 0, 0, 0, 
-                                         "Hide action window sliders");
-               /* no hilite, the winmatrix is not correct later on... */
-               uiButSetFlag(but, UI_NO_HILITE);
-               
-               ACTWIDTH = ACHANNEL_NAMEWIDTH + SLIDERWIDTH;
-               
-               /* sliders are open so draw them */
-               BIF_ThemeColor(TH_FACE); 
-               
-               glRects(ACHANNEL_NAMEWIDTH,  0,  ACHANNEL_NAMEWIDTH+SLIDERWIDTH,  curarea->winy);
-               uiBlockSetEmboss(block, UI_EMBOSS);
-               for (i=1; i < key->totkey; i++) {
-                       make_rvk_slider(block, ob, i, 
-                                                       (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
-                       
-                       y-=CHANNELHEIGHT+CHANNELSKIP;
-                       
-                       /* see sliderval array in editkey.c */
-                       if (i >= 255) break;
-               }
-       }
-       uiDrawBlock(C, block);
-}
-
-static void icu_slider_func(void *voidicu, void *voidignore) 
-{
-       /* the callback for the icu sliders ... copies the
-        * value from the icu->curval into a bezier at the
-        * right frame on the right ipo curve (creating both the
-        * ipo curve and the bezier if needed).
-        */
-       IpoCurve  *icu= voidicu;
-       BezTriple *bezt=NULL;
-       float cfra, icuval;
-
-       cfra = frame_to_float(CFRA);
-       if (G.saction->pin==0 && OBACT)
-               cfra= get_action_frame(OBACT, cfra);
-       
-       /* if the ipocurve exists, try to get a bezier
-        * for this frame
-        */
-       bezt = get_bezt_icu_time(icu, &cfra, &icuval);
-
-       /* create the bezier triple if one doesn't exist,
-        * otherwise modify it's value
-        */
-       if (bezt == NULL) {
-               insert_vert_icu(icu, cfra, icu->curval, 0);
-       }
-       else {
-               bezt->vec[1][1] = icu->curval;
-       }
-
-       /* make sure the Ipo's are properly processed and
-        * redraw as necessary
-        */
-       sort_time_ipocurve(icu);
-       testhandles_ipocurve(icu);
-       
-       /* nla-update (in case this affects anything) */
-       synchronize_action_strips();
-       
-       /* do redraw pushes, and also the depsgraph flushes */
-       if (OBACT->pose || ob_get_key(OBACT))
-               DAG_object_flush_update(G.scene, OBACT, OB_RECALC);
-       else
-               DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB);
-       
-       allqueue(REDRAWVIEW3D, 0);
-       allqueue(REDRAWACTION, 0);
-       allqueue(REDRAWNLA, 0);
-       allqueue(REDRAWIPO, 0);
-       allspace(REMAKEIPO, 0);
-       allqueue(REDRAWBUTSALL, 0);
-}
-
-static void make_icu_slider(uiBlock *block, IpoCurve *icu,
-                                        int x, int y, int w, int h, char *tip)
-{
-       /* create a slider for the ipo-curve*/
-       uiBut *but;
-       
-       if(icu == NULL) return;
-       
-       if (IS_EQ(icu->slide_max, icu->slide_min)) {
-               if (IS_EQ(icu->ymax, icu->ymin)) {
-                       if (ELEM(icu->blocktype, ID_CO, ID_KE)) {
-                               /* hack for constraints and shapekeys (and maybe a few others) */
-                               icu->slide_min= 0.0;
-                               icu->slide_max= 1.0;
-                       }
-                       else {
-                               icu->slide_min= -100;
-                               icu->slide_max= 100;
-                       }
-               }
-               else {
-                       icu->slide_min= icu->ymin;
-                       icu->slide_max= icu->ymax;
-               }
-       }
-       if (icu->slide_min >= icu->slide_max) {
-               SWAP(float, icu->slide_min, icu->slide_max);
-       }
-
-       but=uiDefButF(block, NUMSLI, REDRAWVIEW3D, "",
-                                 x, y , w, h,
-                                 &(icu->curval), icu->slide_min, icu->slide_max, 
-                                 10, 2, tip);
-       
-       uiButSetFunc(but, icu_slider_func, icu, NULL);
-       
-       // no hilite, the winmatrix is not correct later on...
-       uiButSetFlag(but, UI_NO_HILITE);
-}
-
-/* sliders for ipo-curves of active action-channel */
-static void action_icu_buts(SpaceAction *saction)
-{
-       ListBase act_data = {NULL, NULL};
-       bActListElem *ale;
-       int filter;
-       void *data;
-       short datatype;
-       
-       char          str[64];
-       float           x, y;
-       uiBlock       *block;
-
-       /* lets make the action sliders */
-
-       /* reset the damn myortho2 or the sliders won't draw/redraw
-        * correctly *grumble*
-        */
-       mywinset(curarea->win);
-       myortho2(-0.375f, curarea->winx-0.375f, G.v2d->cur.ymin, G.v2d->cur.ymax);
-       
-    sprintf(str, "actionbuttonswin %d", curarea->win);
-    block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS);
-
-       x = (float)ACHANNEL_NAMEWIDTH + 1;
-    y = 0.0f;
-       
-       uiBlockSetEmboss(block, UI_EMBOSSN);
-
-       if (G.saction->flag & SACTION_SLIDERS) {
-               /* sliders are open so draw them */
-               
-               /* get editor data */
-               data= get_action_context(&datatype);
-               if (data == NULL) return;
-               
-               /* build list of channels to draw */
-               filter= (ACTFILTER_FORDRAWING|ACTFILTER_VISIBLE|ACTFILTER_CHANNELS);
-               actdata_filter(&act_data, filter, data, datatype);
-               
-               /* draw backdrop first */
-               BIF_ThemeColor(TH_FACE); // change this color... it's ugly
-               glRects(ACHANNEL_NAMEWIDTH,  (short)G.v2d->cur.ymin,  ACHANNEL_NAMEWIDTH+SLIDERWIDTH,  (short)G.v2d->cur.ymax);
-               
-               uiBlockSetEmboss(block, UI_EMBOSS);
-               for (ale= act_data.first; ale; ale= ale->next) {
-                       const float yminc= y-CHANNELHEIGHT/2;
-                       const float ymaxc= y+CHANNELHEIGHT/2;
-                       
-                       /* check if visible */
-                       if ( IN_RANGE(yminc, G.v2d->cur.ymin, G.v2d->cur.ymax) ||
-                                IN_RANGE(ymaxc, G.v2d->cur.ymin, G.v2d->cur.ymax) ) 
-                       {
-                               /* determine what needs to be drawn */
-                               switch (ale->type) {
-                                       case ACTTYPE_CONCHAN: /* constraint channel */
-                                       {
-                                               bActionChannel *achan = (bActionChannel *)ale->owner;
-                                               IpoCurve *icu = (IpoCurve *)ale->key_data;
-                                               
-                                               /* only show if owner is selected */
-                                               if ((ale->ownertype == ACTTYPE_OBJECT) || SEL_ACHAN(achan)) {
-                                                       make_icu_slider(block, icu,
-                                                                                       (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2, 
-                                                                                       "Slider to control current value of Constraint Influence");
-                                               }
-                                       }
-                                               break;
-                                       case ACTTYPE_ICU: /* ipo-curve channel */
-                                       {
-                                               bActionChannel *achan = (bActionChannel *)ale->owner;
-                                               IpoCurve *icu = (IpoCurve *)ale->key_data;
-                                               
-                                               /* only show if owner is selected */
-                                               if ((ale->ownertype == ACTTYPE_OBJECT) || SEL_ACHAN(achan)) {
-                                                       make_icu_slider(block, icu,
-                                                                                       (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2, 
-                                                                                       "Slider to control current value of IPO-Curve");
-                                               }
-                                       }
-                                               break;
-                                       case ACTTYPE_SHAPEKEY: /* shapekey channel */
-                                       {
-                                               Object *ob= (Object *)ale->id;
-                                               IpoCurve *icu= (IpoCurve *)ale->key_data;
-                                               
-                                               // TODO: only show if object is active 
-                                               if (icu) {
-                                                       make_icu_slider(block, icu,
-                                                                               (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-2, 
-                                                                               "Slider to control ShapeKey");
-                                               }
-                                               else if (ob && ale->index) {
-                                                       make_rvk_slider(block, ob, ale->index, 
-                                                                       (int)x, (int)y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
-                                               }
-                                       }
-                                               break;
-                               }
-                       }
-                       
-                       /* adjust y-position for next one */
-                       y-=CHANNELHEIGHT+CHANNELSKIP;
-               }
-               
-               /* free tempolary channels */
-               BLI_freelistN(&act_data);
-       }
-       uiDrawBlock(C, block);
-}
-
-#endif // XXX all of this slider stuff will need a rethink 
-
-
 /* ************************************************************************* */
 /* Channel List */
 
@@ -518,7 +218,6 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
                adt= ANIM_nla_mapping_get(ac, NULL);
                
                /* start and end of action itself */
-               // TODO: this has not had scaling applied
                calc_action_range(ac->data, &act_start, &act_end, 0);
        }
        
@@ -550,43 +249,14 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
                if ( IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
                         IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) ) 
                {
+                       bAnimChannelType *acf= ANIM_channel_get_typeinfo(ale);
                        int sel=0;
                        
                        /* determine if any need to draw channel */
                        if (ale->datatype != ALE_NONE) {
                                /* determine if channel is selected */
-                               switch (ale->type) {
-                                       case ANIMTYPE_SCENE:
-                                       {
-                                               Scene *sce= (Scene *)ale->data;
-                                               sel = SEL_SCEC(sce);
-                                       }
-                                               break;
-                                       case ANIMTYPE_OBJECT:
-                                       {
-                                               Base *base= (Base *)ale->data;
-                                               sel = SEL_OBJC(base);
-                                       }
-                                               break;
-                                       case ANIMTYPE_GROUP:
-                                       {
-                                               bActionGroup *agrp = (bActionGroup *)ale->data;
-                                               sel = SEL_AGRP(agrp);
-                                       }
-                                               break;
-                                       case ANIMTYPE_FCURVE:
-                                       {
-                                               FCurve *fcu = (FCurve *)ale->data;
-                                               sel = SEL_FCU(fcu);
-                                       }
-                                               break;
-                                       case ANIMTYPE_GPLAYER:
-                                       {
-                                               bGPDlayer *gpl = (bGPDlayer *)ale->data;
-                                               sel = SEL_GPL(gpl);
-                                       }
-                                               break;
-                               }
+                               if (acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT))
+                                       sel= ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT);
                                
                                if (ELEM(ac->datatype, ANIMCONT_ACTION, ANIMCONT_DOPESHEET)) {
                                        switch (ale->type) {