2.5 compile errors.
[blender-staging.git] / source / blender / editors / space_file / file_ops.c
index b584524e396a90db6530d5f81b1f3415fb9d70a7..94c023207f5628013b4f625c5f37569c01660e08 100644 (file)
 
 /* ---------- FILE SELECTION ------------ */
 
-static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, short y)
+static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, short x, short y)
 {
        float fx,fy;
-       int offsetx, offsety;
-       int columns;
        int active_file = -1;
        int numfiles = filelist_numfiles(sfile->files);
        View2D* v2d = &ar->v2d;
 
        UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
 
-       offsetx = (fx - (v2d->cur.xmin+sfile->tile_border_x))/(sfile->tile_w + 2*sfile->tile_border_x);
-       offsety = (v2d->tot.ymax - sfile->tile_border_y - fy)/(sfile->tile_h + 2*sfile->tile_border_y);
-       columns = (v2d->cur.xmax - v2d->cur.xmin) / (sfile->tile_w+ 2*sfile->tile_border_x);
-       active_file = offsetx + columns*offsety;
+       active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
 
        if ( (active_file < 0) || (active_file >= numfiles) )
        {
@@ -90,28 +85,6 @@ static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, sh
 }
 
 
-static int find_file_mouse_vert(SpaceFile *sfile, struct ARegion* ar, short x, short y)
-{
-       int offsetx, offsety;
-       float fx,fy;
-       int active_file = -1;
-       int numfiles = filelist_numfiles(sfile->files);
-       int rows;
-       View2D* v2d = &ar->v2d;
-
-       UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
-       
-       offsetx = (fx-sfile->tile_border_x)/(sfile->tile_w + sfile->tile_border_x);
-       offsety = (v2d->cur.ymax-fy-sfile->tile_border_y)/(sfile->tile_h + sfile->tile_border_y);
-       rows = (v2d->cur.ymax - v2d->cur.ymin - 2*sfile->tile_border_y) / (sfile->tile_h+sfile->tile_border_y);
-       active_file = rows*offsetx + offsety;
-       if ( (active_file < 0) || (active_file >= numfiles) )
-       {
-               active_file = -1;
-       }
-       return active_file;
-}
-
 static void file_deselect_all(SpaceFile* sfile)
 {
        int numfiles = filelist_numfiles(sfile->files);
@@ -125,23 +98,20 @@ static void file_deselect_all(SpaceFile* sfile)
        }
 }
 
-static void file_select(SpaceFile* sfile, FileSelectParams* params, ARegion* ar, const rcti* rect, short val)
+static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short val)
 {
        int first_file = -1;
        int last_file = -1;
        int act_file;
        short selecting = (val == LEFTMOUSE);
+       FileSelectParams *params = ED_fileselect_get_params(sfile);
+       FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
 
        int numfiles = filelist_numfiles(sfile->files);
 
        params->selstate = NOTACTIVE;
-       if (params->display) {
-               first_file = find_file_mouse_hor(sfile, ar, rect->xmin, rect->ymax);
-               last_file = find_file_mouse_hor(sfile, ar, rect->xmax, rect->ymin);
-       } else {
-               first_file = find_file_mouse_vert(sfile, ar, rect->xmin, rect->ymax);
-               last_file = find_file_mouse_vert(sfile, ar, rect->xmax, rect->ymin);
-       }
+       first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax);
+       last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin);
        
        /* select all valid files between first and last indicated */
        if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) {
@@ -153,7 +123,7 @@ static void file_select(SpaceFile* sfile, FileSelectParams* params, ARegion* ar,
                                file->flags &= ~ACTIVE;
                }
        }
-       
+
        /* make the last file active */
        if (last_file >= 0 && last_file < numfiles) {
                struct direntry* file = filelist_file(sfile->files, last_file);
@@ -215,16 +185,16 @@ static int file_border_select_exec(bContext *C, wmOperator *op)
        rect.xmax= RNA_int_get(op->ptr, "xmax");
        rect.ymax= RNA_int_get(op->ptr, "ymax");
 
-       file_select(sfile, sfile->params, ar, &rect, val );
+       file_select(sfile, ar, &rect, val );
        WM_event_add_notifier(C, NC_WINDOW, NULL);
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_border_select(wmOperatorType *ot)
+void FILE_OT_select_border(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Activate/Select File";
-       ot->idname= "ED_FILE_OT_border_select";
+       ot->idname= "FILE_OT_select_border";
        
        /* api callbacks */
        ot->invoke= WM_border_select_invoke;
@@ -252,18 +222,21 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
        rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
        val = event->val;
 
-       /* single select, deselect all selected first */
-       file_deselect_all(sfile);
-       file_select(sfile, sfile->params, ar, &rect, val );
-       WM_event_add_notifier(C, NC_WINDOW, NULL);
+       if (BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin)) { 
+
+               /* single select, deselect all selected first */
+               file_deselect_all(sfile);
+               file_select(sfile, ar, &rect, val );
+               WM_event_add_notifier(C, NC_WINDOW, NULL);
+       }
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_select(wmOperatorType *ot)
+void FILE_OT_select(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Activate/Select File";
-       ot->idname= "ED_FILE_OT_select";
+       ot->idname= "FILE_OT_select";
        
        /* api callbacks */
        ot->invoke= file_select_invoke;
@@ -303,11 +276,11 @@ static int file_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_select_all(wmOperatorType *ot)
+void FILE_OT_select_all_toggle(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Select/Deselect all files";
-       ot->idname= "ED_FILE_OT_select_all";
+       ot->idname= "FILE_OT_select_all_toggle";
        
        /* api callbacks */
        ot->invoke= file_select_all_invoke;
@@ -319,36 +292,58 @@ void ED_FILE_OT_select_all(wmOperatorType *ot)
 
 /* ---------- BOOKMARKS ----------- */
 
-static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, short x, short y)
+static int file_select_bookmark_category(SpaceFile* sfile, ARegion* ar, short x, short y, FSMenuCategory category)
 {
-       int nentries = fsmenu_get_nentries();
-       float fx, fy;
-       short posy;
-
-       UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
-
-       posy = ar->v2d.cur.ymax - 2*TILE_BORDER_Y - fy;
-       params->active_bookmark = ((float)posy / (U.fontsize*3.0f/2.0f));
-       if (params->active_bookmark < 0 || params->active_bookmark > nentries) {
-               params->active_bookmark = -1;
+       struct FSMenu* fsmenu = fsmenu_get();
+       int nentries = fsmenu_get_nentries(fsmenu, category);
+       int linestep = file_font_pointsize()*2.0f;
+       short xs, ys;
+       int i;
+       int selected = -1;
+
+       for (i=0; i < nentries; ++i) {
+               fsmenu_get_pos(fsmenu, category, i, &xs, &ys);
+               if ( (y<=ys) && (y>ys-linestep) ) {
+                       fsmenu_select_entry(fsmenu, category, i);
+                       selected = i;
+                       break;
+               }
        }
+       return selected;
 }
 
 static void file_select_bookmark(SpaceFile* sfile, ARegion* ar, short x, short y)
 {
+       float fx, fy;
+       int selected;
+       FSMenuCategory category = FS_CATEGORY_SYSTEM;
+
        if (BLI_in_rcti(&ar->v2d.mask, x, y)) {
-               char *selected;
-               set_active_bookmark(sfile->params, ar, x, y);
-               selected= fsmenu_get_entry(sfile->params->active_bookmark);                     
-               /* which string */
-               if (selected) {
-                       FileSelectParams* params = sfile->params;
-                       BLI_strncpy(params->dir, selected, sizeof(params->dir));
-                       BLI_cleanup_dir(G.sce, params->dir);
-                       filelist_free(sfile->files);    
-                       filelist_setdir(sfile->files, params->dir);
-                       params->file[0] = '\0';                 
-                       params->active_file = -1;
+               char *entry;
+
+               UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
+               selected = file_select_bookmark_category(sfile, ar, fx, fy, FS_CATEGORY_SYSTEM);
+               if (selected<0) {
+                       category = FS_CATEGORY_BOOKMARKS;
+                       selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
+               }
+               if (selected<0) {
+                       category = FS_CATEGORY_RECENT;
+                       selected = file_select_bookmark_category(sfile, ar, fx, fy, category);
+               }
+               
+               if (selected>=0) {
+                       entry= fsmenu_get_entry(fsmenu_get(), category, selected);                      
+                       /* which string */
+                       if (entry) {
+                               FileSelectParams* params = sfile->params;
+                               BLI_strncpy(params->dir, entry, sizeof(params->dir));
+                               BLI_cleanup_dir(G.sce, params->dir);
+                               filelist_free(sfile->files);    
+                               filelist_setdir(sfile->files, params->dir);
+                               params->file[0] = '\0';                 
+                               params->active_file = -1;
+                       }
                }
        }
 }
@@ -369,11 +364,11 @@ static int bookmark_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_select_bookmark(wmOperatorType *ot)
+void FILE_OT_select_bookmark(wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Select Directory";
-       ot->idname= "ED_FILE_OT_select_bookmark";
+       ot->idname= "FILE_OT_select_bookmark";
        
        /* api callbacks */
        ot->invoke= bookmark_select_invoke;
@@ -394,12 +389,12 @@ static int loadimages_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_loadimages(wmOperatorType *ot)
+void FILE_OT_loadimages(wmOperatorType *ot)
 {
        
        /* identifiers */
        ot->name= "Load Images";
-       ot->idname= "ED_FILE_OT_loadimages";
+       ot->idname= "FILE_OT_loadimages";
        
        /* api callbacks */
        ot->invoke= loadimages_invoke;
@@ -416,17 +411,14 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
        
        numfiles = filelist_numfiles(sfile->files);
        params = ED_fileselect_get_params(sfile);
+
+       actfile = find_file_mouse(sfile, ar, mx , my);
        
-       if (params->display) {
-               actfile = find_file_mouse_hor(sfile, ar, mx , my);
-       } else {
-               actfile = find_file_mouse_vert(sfile, ar, mx, my);
-       }
-       
-       if (actfile >= 0 && actfile < numfiles ) {
+       if (params && (actfile >= 0) && (actfile < numfiles) ) {
                params->active_file=actfile;
                return 1;
-       }
+       } 
+       params->active_file= -1;
        return 0;
 }
 
@@ -442,11 +434,11 @@ static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_highlight(struct wmOperatorType *ot)
+void FILE_OT_highlight(struct wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Highlight File";
-       ot->idname= "ED_FILE_OT_highlight";
+       ot->idname= "FILE_OT_highlight";
        
        /* api callbacks */
        ot->invoke= file_highlight_invoke;
@@ -457,63 +449,58 @@ int file_cancel_exec(bContext *C, wmOperator *unused)
 {
        SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
        
-       if(sfile->op) {
-               WM_operator_free(sfile->op);
-               sfile->op = NULL;
-       }
-       ED_screen_full_prevspace(C);
+       WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
+       sfile->op = NULL;
        
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_cancel(struct wmOperatorType *ot)
+void FILE_OT_cancel(struct wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Cancel File Load";
-       ot->idname= "ED_FILE_OT_cancel";
+       ot->idname= "FILE_OT_cancel";
        
        /* api callbacks */
        ot->exec= file_cancel_exec;
        ot->poll= ED_operator_file_active;
 }
 
-
-int file_load_exec(bContext *C, wmOperator *unused)
+/* sends events now, so things get handled on windowqueue level */
+int file_exec(bContext *C, wmOperator *unused)
 {
        SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
        char name[FILE_MAX];
        
-       ED_screen_full_prevspace(C);
-       
        if(sfile->op) {
                wmOperator *op= sfile->op;
                
-               /* if load .blend, all UI pointers after exec are invalid! */
-               /* but, operator can be freed still */
-               
                sfile->op = NULL;
                BLI_strncpy(name, sfile->params->dir, sizeof(name));
                strcat(name, sfile->params->file);
                RNA_string_set(op->ptr, "filename", name);
                
-               /* this gives ownership to pupmenu */
-               uiPupMenuSaveOver(C, op, name);
+               fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
+               BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
+               fsmenu_write_file(fsmenu_get(), name);
+               WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
        }
-
+                               
        return OPERATOR_FINISHED;
 }
 
-void ED_FILE_OT_load(struct wmOperatorType *ot)
+void FILE_OT_exec(struct wmOperatorType *ot)
 {
        /* identifiers */
-       ot->name= "Load File";
-       ot->idname= "ED_FILE_OT_load";
+       ot->name= "Execute File Window";
+       ot->idname= "FILE_OT_exec";
        
        /* api callbacks */
-       ot->exec= file_load_exec;
+       ot->exec= file_exec;
        ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
 }
 
+
 int file_parent_exec(bContext *C, wmOperator *unused)
 {
        SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
@@ -530,11 +517,12 @@ int file_parent_exec(bContext *C, wmOperator *unused)
 
 }
 
-void ED_FILE_OT_parent(struct wmOperatorType *ot)
+
+void FILE_OT_parent(struct wmOperatorType *ot)
 {
        /* identifiers */
        ot->name= "Parent File";
-       ot->idname= "ED_FILE_OT_parent";
+       ot->idname= "FILE_OT_parent";
        
        /* api callbacks */
        ot->exec= file_parent_exec;
@@ -542,4 +530,65 @@ void ED_FILE_OT_parent(struct wmOperatorType *ot)
 }
 
 
+int file_refresh_exec(bContext *C, wmOperator *unused)
+{
+       SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
+       
+       if(sfile->params) {
+               filelist_setdir(sfile->files, sfile->params->dir);
+               filelist_free(sfile->files);
+               sfile->params->active_file = -1;
+       }               
+       ED_area_tag_redraw(CTX_wm_area(C));
+
+       return OPERATOR_FINISHED;
+
+}
 
+
+void FILE_OT_refresh(struct wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Refresh Filelist";
+       ot->idname= "FILE_OT_refresh";
+       
+       /* api callbacks */
+       ot->exec= file_refresh_exec;
+       ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
+
+struct ARegion *file_buttons_region(struct ScrArea *sa)
+{
+       ARegion *ar;
+       
+       for(ar= sa->regionbase.first; ar; ar= ar->next)
+               if(ar->regiontype==RGN_TYPE_CHANNELS)
+                       return ar;
+       return NULL;
+}
+
+int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
+{
+       ScrArea *sa= CTX_wm_area(C);
+       ARegion *ar= file_buttons_region(sa);
+       
+       if(ar) {
+               ar->flag ^= RGN_FLAG_HIDDEN;
+               ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
+               
+               ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa);
+               ED_area_tag_redraw(sa);
+       }
+       return OPERATOR_FINISHED;
+}
+
+void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Toggle Bookmarks";
+       ot->idname= "FILE_OT_bookmark_toggle";
+       
+       /* api callbacks */
+       ot->exec= file_bookmark_toggle_exec;
+       ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}