2.5
[blender.git] / source / blender / editors / space_ipo / space_ipo.c
index 325d14120aeaf944aa1bdf389d43fa6627cc07eb..99b0ebcf03c2b1a7bd18e43bbfd6ad8ce7373983 100644 (file)
 #include "BLI_arithb.h"
 #include "BLI_rand.h"
 
-#include "BKE_global.h"
+#include "BKE_context.h"
 #include "BKE_screen.h"
 
 #include "ED_space_api.h"
 #include "ED_screen.h"
+#include "ED_anim_api.h"
+#include "ED_markers.h"
 
 #include "BIF_gl.h"
 
 #include "UI_resources.h"
 #include "UI_view2d.h"
 
-#include "ED_markers.h"
-
 #include "ipo_intern.h"        // own include
 
 /* ******************** default callbacks for ipo space ***************** */
 
-static SpaceLink *ipo_new(void)
+static SpaceLink *ipo_new(const bContext *C)
 {
+       Scene *scene= CTX_data_scene(C);
        ARegion *ar;
        SpaceIpo *sipo;
        
@@ -85,6 +86,8 @@ static SpaceLink *ipo_new(void)
        ar->regiontype= RGN_TYPE_CHANNELS;
        ar->alignment= RGN_ALIGN_LEFT;
        
+       ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
+       
        /* XXX view2d init for channels */
        
        /* main area */
@@ -95,7 +98,7 @@ static SpaceLink *ipo_new(void)
        
        ar->v2d.tot.xmin= 0.0f;
        ar->v2d.tot.ymin= -10.0f;
-       ar->v2d.tot.xmax= 250.0;
+       ar->v2d.tot.xmax= scene->r.efra;
        ar->v2d.tot.ymax= 10.0f;
        
        ar->v2d.cur= ar->v2d.tot;
@@ -145,50 +148,6 @@ static SpaceLink *ipo_duplicate(SpaceLink *sl)
        return (SpaceLink *)sipon;
 }
 
-
-// XXX this should be defined in some general lib for anim editors...
-static void draw_cfra(const bContext *C, SpaceIpo *sipo, View2D *v2d)
-{
-       Scene *scene= C->scene;
-       float vec[2];
-       
-       //vec[0] = get_ipo_cfra_from_cfra(sipo, scene->r.cfra);
-       vec[0] = scene->r.cfra;
-       vec[0]*= scene->r.framelen;
-       
-       vec[1]= v2d->cur.ymin;
-       UI_ThemeColor(TH_CFRAME);
-       glLineWidth(2.0);
-       
-       glBegin(GL_LINE_STRIP);
-       glVertex2fv(vec);
-       vec[1]= v2d->cur.ymax;
-       glVertex2fv(vec);
-       glEnd();
-       
-#if 0
-       if(sipo->blocktype==ID_OB) {
-               ob= (G.scene->basact) ? (G.scene->basact->object) : 0;
-               if (ob && (ob->ipoflag & OB_OFFS_OB) && (give_timeoffset(ob)!=0.0)) { 
-                       vec[0]-= give_timeoffset(ob);
-                       
-                       UI_ThemeColorShade(TH_HILITE, -30);
-                       
-                       glBegin(GL_LINE_STRIP);
-                       glVertex2fv(vec);
-                       vec[1]= G.v2d->cur.ymin;
-                       glVertex2fv(vec);
-                       glEnd();
-               }
-       }
-#endif
-       
-       glLineWidth(1.0);
-       
-       /* Draw current frame number in a little box */
-       //draw_cfra_number(vec[0]);
-}
-
 /* add handlers, stuff you only do once or on area/region changes */
 static void ipo_main_area_init(wmWindowManager *wm, ARegion *ar)
 {
@@ -204,12 +163,12 @@ static void ipo_main_area_init(wmWindowManager *wm, ARegion *ar)
 static void ipo_main_area_draw(const bContext *C, ARegion *ar)
 {
        /* draw entirely, view changes should be handled here */
-       SpaceIpo *sipo= C->area->spacedata.first;
+       SpaceIpo *sipo= (SpaceIpo*)CTX_wm_space_data(C);
        View2D *v2d= &ar->v2d;
        View2DGrid *grid;
        View2DScrollers *scrollers;
        float col[3];
-       int unit;
+       short unit=0, flag=0;
        
        /* clear and setup matrix */
        UI_GetThemeColor3fv(TH_BACK, col);
@@ -227,12 +186,18 @@ static void ipo_main_area_draw(const bContext *C, ARegion *ar)
        /* data... */
        
        /* current frame */
-       draw_cfra(C, sipo, v2d);
+       if (sipo->flag & SIPO_DRAWTIME)         flag |= DRAWCFRA_UNIT_SECONDS;
+       if ((sipo->flag & SIPO_NODRAWCFRANUM)==0)  flag |= DRAWCFRA_SHOW_NUMBOX;
+       ANIM_draw_cfra(C, v2d, flag);
        
        /* markers */
        UI_view2d_view_orthoSpecial(C, v2d, 1);
        draw_markers_time(C, 0);
        
+       /* preview range */
+       UI_view2d_view_ortho(C, v2d);
+       ANIM_draw_previewrange(C, v2d);
+       
        /* reset view matrix */
        UI_view2d_view_restore(C);
        
@@ -251,8 +216,16 @@ void ipo_keymap(struct wmWindowManager *wm)
 {
 }
 
+static void ipo_channel_area_init(wmWindowManager *wm, ARegion *ar)
+{
+       UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
+}
+
 static void ipo_channel_area_draw(const bContext *C, ARegion *ar)
 {
+       //SpaceIpo *sipo= C->area->spacedata.first;
+       View2D *v2d= &ar->v2d;
+       View2DScrollers *scrollers;
        float col[3];
        
        /* clear and setup matrix */
@@ -260,6 +233,17 @@ static void ipo_channel_area_draw(const bContext *C, ARegion *ar)
        glClearColor(col[0], col[1], col[2], 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        
+       UI_view2d_view_ortho(C, v2d);
+       
+       /* data... */
+       
+       /* reset view matrix */
+       UI_view2d_view_restore(C);
+       
+       /* scrollers */
+       scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
+       UI_view2d_scrollers_draw(C, v2d, scrollers);
+       UI_view2d_scrollers_free(scrollers);
 }
 
 /* add handlers, stuff you only do once or on area/region changes */
@@ -322,7 +306,7 @@ void ED_spacetype_ipo(void)
        art->init= ipo_main_area_init;
        art->draw= ipo_main_area_draw;
        art->listener= ipo_main_area_listener;
-       art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS;
+       art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION;
 
        BLI_addhead(&st->regiontypes, art);
        
@@ -343,7 +327,7 @@ void ED_spacetype_ipo(void)
        art->minsizex= 200;
        art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
        
-//     art->init= ipo_channel_area_init;
+       art->init= ipo_channel_area_init;
        art->draw= ipo_channel_area_draw;
        
        BLI_addhead(&st->regiontypes, art);