2.5
[blender.git] / source / blender / editors / space_ipo / space_ipo.c
index 4272f45ea6d8af9218facfdd551c770ab6d07f00..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;
        
@@ -77,7 +78,6 @@ static SpaceLink *ipo_new(void)
        BLI_addtail(&sipo->regionbase, ar);
        ar->regiontype= RGN_TYPE_HEADER;
        ar->alignment= RGN_ALIGN_BOTTOM;
-       UI_view2d_header_default(&ar->v2d);
        
        /* channels */
        ar= MEM_callocN(sizeof(ARegion), "main area for ipo");
@@ -86,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 */
@@ -96,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;
@@ -105,7 +107,7 @@ static SpaceLink *ipo_new(void)
        ar->v2d.min[1]= 0.01f;
        
        ar->v2d.max[0]= MAXFRAMEF;
-       ar->v2d.max[1]= 10000.0f;
+       ar->v2d.max[1]= 50000.0f;
        
        ar->v2d.scroll= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
        ar->v2d.scroll |= (V2D_SCROLL_LEFT|V2D_SCROLL_SCALE_VERTICAL);
@@ -146,56 +148,12 @@ 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)
 {
        ListBase *keymap;
        
-       UI_view2d_size_update(&ar->v2d, ar->winx, ar->winy);
+       UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
        
        /* own keymap */
        keymap= WM_keymap_listbase(wm, "Ipo", SPACE_IPO, 0);    /* XXX weak? */
@@ -205,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);
@@ -228,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);
        
@@ -252,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 */
@@ -261,12 +233,23 @@ 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 */
 static void ipo_header_area_init(wmWindowManager *wm, ARegion *ar)
 {
-       UI_view2d_size_update(&ar->v2d, ar->winx, ar->winy);
+       UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
 }
 
 static void ipo_header_area_draw(const bContext *C, ARegion *ar)
@@ -294,6 +277,12 @@ static void ipo_header_area_draw(const bContext *C, ARegion *ar)
 static void ipo_main_area_listener(ARegion *ar, wmNotifier *wmn)
 {
        /* context changes */
+       switch(wmn->type) {
+               
+               case WM_NOTE_MARKERS_CHANGED:
+                       ED_region_tag_redraw(ar);
+                       break;
+       }
 }
 
 /* only called once, from space/spacetypes.c */
@@ -317,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;
+       art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION;
 
        BLI_addhead(&st->regiontypes, art);
        
@@ -335,10 +324,10 @@ void ED_spacetype_ipo(void)
        /* regions: channels */
        art= MEM_callocN(sizeof(ARegionType), "spacetype ipo region");
        art->regionid = RGN_TYPE_CHANNELS;
-       art->minsizex= 80;
+       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);