Blender  V2.59
space_file.c
Go to the documentation of this file.
00001 /*
00002  * $Id: space_file.c 36947 2011-05-27 09:57:53Z blendix $
00003  *
00004  * ***** BEGIN GPL LICENSE BLOCK *****
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version. 
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software Foundation,
00018  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  *
00020  * The Original Code is Copyright (C) 2008 Blender Foundation.
00021  * All rights reserved.
00022  *
00023  * 
00024  * Contributor(s): Blender Foundation
00025  *
00026  * ***** END GPL LICENSE BLOCK *****
00027  */
00028 
00034 #include <string.h>
00035 #include <stdio.h>
00036 
00037 
00038 #include "RNA_access.h"
00039 
00040 #include "MEM_guardedalloc.h"
00041 
00042 #include "BIF_gl.h"
00043 
00044 #include "BLO_readfile.h"
00045 
00046 #include "BLI_blenlib.h"
00047 #include "BLI_math.h"
00048 #include "BLI_rand.h"
00049 #include "BLI_storage_types.h"
00050 #include "BLI_utildefines.h"
00051 
00052 #include "BKE_context.h"
00053 #include "BKE_screen.h"
00054 
00055 #include "ED_space_api.h"
00056 #include "ED_screen.h"
00057 #include "ED_fileselect.h"
00058 
00059 #include "IMB_imbuf_types.h"
00060 #include "IMB_thumbs.h"
00061 
00062 #include "WM_api.h"
00063 #include "WM_types.h"
00064 
00065 #include "UI_resources.h"
00066 #include "UI_view2d.h"
00067 
00068 
00069 #include "file_intern.h"        // own include
00070 #include "fsmenu.h"
00071 #include "filelist.h"
00072 
00073 /* ******************** default callbacks for file space ***************** */
00074 
00075 static SpaceLink *file_new(const bContext *UNUSED(C))
00076 {
00077         ARegion *ar;
00078         SpaceFile *sfile;
00079         
00080         sfile= MEM_callocN(sizeof(SpaceFile), "initfile");
00081         sfile->spacetype= SPACE_FILE;
00082 
00083         /* header */
00084         ar= MEM_callocN(sizeof(ARegion), "header for file");
00085         BLI_addtail(&sfile->regionbase, ar);
00086         ar->regiontype= RGN_TYPE_HEADER;
00087         ar->alignment= RGN_ALIGN_TOP;
00088 
00089         /* channel list region */
00090         ar= MEM_callocN(sizeof(ARegion), "channel area for file");
00091         BLI_addtail(&sfile->regionbase, ar);
00092         ar->regiontype= RGN_TYPE_CHANNELS;
00093         ar->alignment= RGN_ALIGN_LEFT;  
00094 
00095         /* ui list region */
00096         ar= MEM_callocN(sizeof(ARegion), "ui area for file");
00097         BLI_addtail(&sfile->regionbase, ar);
00098         ar->regiontype= RGN_TYPE_UI;
00099         ar->alignment= RGN_ALIGN_TOP;
00100 
00101         /* main area */
00102         ar= MEM_callocN(sizeof(ARegion), "main area for file");
00103         BLI_addtail(&sfile->regionbase, ar);
00104         ar->regiontype= RGN_TYPE_WINDOW;
00105         ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM);
00106         ar->v2d.align = (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_POS_Y);
00107         ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
00108         ar->v2d.keeptot= V2D_KEEPTOT_STRICT;
00109         ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
00110 
00111         return (SpaceLink *)sfile;
00112 }
00113 
00114 /* not spacelink itself */
00115 static void file_free(SpaceLink *sl)
00116 {       
00117         SpaceFile *sfile= (SpaceFile *) sl;
00118         
00119         if(sfile->files) {
00120                 // XXXXX would need to do thumbnails_stop here, but no context available
00121                 filelist_freelib(sfile->files);
00122                 filelist_free(sfile->files);
00123                 MEM_freeN(sfile->files);
00124                 sfile->files= NULL;
00125         }
00126 
00127         if(sfile->folders_prev) {
00128                 folderlist_free(sfile->folders_prev);
00129                 MEM_freeN(sfile->folders_prev);
00130                 sfile->folders_prev= NULL;
00131         }
00132 
00133         if(sfile->folders_next) {
00134                 folderlist_free(sfile->folders_next);
00135                 MEM_freeN(sfile->folders_next);
00136                 sfile->folders_next= NULL;
00137         }
00138 
00139         if (sfile->params) {
00140                 MEM_freeN(sfile->params);
00141                 sfile->params= NULL;
00142         }
00143 
00144         if (sfile->layout) {
00145                 MEM_freeN(sfile->layout);
00146                 sfile->layout = NULL;
00147         }
00148 }
00149 
00150 
00151 /* spacetype; init callback, area size changes, screen set, etc */
00152 static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
00153 {
00154         SpaceFile *sfile= (SpaceFile*)sa->spacedata.first;
00155         //printf("file_init\n");
00156 
00157         if(sfile->layout) sfile->layout->dirty= 1;
00158 }
00159 
00160 
00161 static SpaceLink *file_duplicate(SpaceLink *sl)
00162 {
00163         SpaceFile *sfileo= (SpaceFile*)sl;
00164         SpaceFile *sfilen= MEM_dupallocN(sl);
00165         
00166         /* clear or remove stuff from old */
00167         sfilen->op = NULL; /* file window doesn't own operators */
00168 
00169         if (sfileo->params) {
00170                 sfilen->files = filelist_new(sfileo->params->type);
00171                 sfilen->params= MEM_dupallocN(sfileo->params);
00172                 filelist_setdir(sfilen->files, sfilen->params->dir);
00173         }
00174 
00175         if(sfileo->folders_prev)
00176                 sfilen->folders_prev = folderlist_duplicate(sfileo->folders_prev);
00177 
00178         if(sfileo->folders_next)
00179                 sfilen->folders_next = folderlist_duplicate(sfileo->folders_next);
00180         
00181         if (sfileo->layout) {
00182                 sfilen->layout= MEM_dupallocN(sfileo->layout);
00183         }
00184         return (SpaceLink *)sfilen;
00185 }
00186 
00187 static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
00188 {
00189         SpaceFile *sfile= CTX_wm_space_file(C);
00190         FileSelectParams *params = ED_fileselect_get_params(sfile);
00191 
00192         if (!sfile->folders_prev)
00193                 sfile->folders_prev = folderlist_new();
00194         if (!sfile->files) {
00195                 sfile->files = filelist_new(params->type);
00196                 filelist_setdir(sfile->files, params->dir);
00197                 params->active_file = -1; // added this so it opens nicer (ton)
00198         }
00199         filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT);
00200         filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0);      
00201         filelist_setfilter_types(sfile->files, params->filter_glob);
00202         if (filelist_empty(sfile->files))
00203         {
00204                 thumbnails_stop(sfile->files, C);
00205                 filelist_readdir(sfile->files);
00206                 if(params->sort!=FILE_SORT_NONE) {
00207                         filelist_sort(sfile->files, params->sort);
00208                 }
00209                 BLI_strncpy(params->dir, filelist_dir(sfile->files), FILE_MAX);
00210                 if(params->display == FILE_IMGDISPLAY) {
00211                         thumbnails_start(sfile->files, C);
00212                 }
00213         } else {
00214                 if(params->sort!=FILE_SORT_NONE) {
00215                         thumbnails_stop(sfile->files, C);
00216                         filelist_sort(sfile->files, params->sort);
00217                         if(params->display == FILE_IMGDISPLAY) {
00218                                 thumbnails_start(sfile->files, C);
00219                         }
00220                 } else {
00221                         if(params->display == FILE_IMGDISPLAY) {
00222                                 if (!thumbnails_running(sfile->files,C)) {
00223                                         thumbnails_start(sfile->files, C);
00224                                 }
00225                         } else {
00226                                 /* stop any running thumbnail jobs if we're not 
00227                                  displaying them - speedup for NFS */
00228                                 thumbnails_stop(sfile->files, C);
00229                         }
00230                         filelist_filter(sfile->files);
00231                 }
00232         }
00233         
00234         if (params->renamefile[0] != '\0') {
00235                 int idx = filelist_find(sfile->files, params->renamefile);
00236                 if (idx >= 0) {
00237                         struct direntry *file= filelist_file(sfile->files, idx);
00238                         if (file) {
00239                                 file->selflag |= EDITING_FILE;
00240                         }
00241                 }
00242                 BLI_strncpy(sfile->params->renameedit, sfile->params->renamefile, sizeof(sfile->params->renameedit));
00243                 params->renamefile[0] = '\0';
00244         }
00245         if (sfile->layout) sfile->layout->dirty= 1;
00246 
00247 }
00248 
00249 static void file_listener(ScrArea *sa, wmNotifier *wmn)
00250 {
00251         /* SpaceFile* sfile = (SpaceFile*)sa->spacedata.first; */
00252 
00253         /* context changes */
00254         switch(wmn->category) {
00255                 case NC_SPACE:
00256                         switch (wmn->data) {
00257                                 case ND_SPACE_FILE_LIST:
00258                                         ED_area_tag_refresh(sa);
00259                                         ED_area_tag_redraw(sa);
00260                                         break;
00261                                 case ND_SPACE_FILE_PARAMS:
00262                                         ED_area_tag_refresh(sa);
00263                                         ED_area_tag_redraw(sa);
00264                                         break;
00265                         }
00266                         break;
00267         }
00268 }
00269 
00270 /* add handlers, stuff you only do once or on area/region changes */
00271 static void file_main_area_init(wmWindowManager *wm, ARegion *ar)
00272 {
00273         wmKeyMap *keymap;
00274         
00275         UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
00276         
00277         /* own keymaps */
00278         keymap= WM_keymap_find(wm->defaultconf, "File Browser", SPACE_FILE, 0);
00279         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00280 
00281         keymap= WM_keymap_find(wm->defaultconf, "File Browser Main", SPACE_FILE, 0);
00282         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00283                                                            
00284 
00285 }
00286 
00287 static void file_main_area_listener(ARegion *ar, wmNotifier *wmn)
00288 {
00289         /* context changes */
00290         switch(wmn->category) {
00291                 case NC_SPACE:
00292                         switch (wmn->data) {
00293                                 case ND_SPACE_FILE_LIST:
00294                                         ED_region_tag_redraw(ar);
00295                                         break;
00296                                 case ND_SPACE_FILE_PARAMS:
00297                                         ED_region_tag_redraw(ar);
00298                                         break;
00299                         }
00300                         break;
00301         }
00302 }
00303 
00304 static void file_main_area_draw(const bContext *C, ARegion *ar)
00305 {
00306         /* draw entirely, view changes should be handled here */
00307         SpaceFile *sfile= CTX_wm_space_file(C);
00308         FileSelectParams *params = ED_fileselect_get_params(sfile);
00309         FileLayout *layout=NULL;
00310 
00311         View2D *v2d= &ar->v2d;
00312         View2DScrollers *scrollers;
00313         float col[3];
00314 
00315         /* Needed, because filelist is not initialized on loading */
00316         if (!sfile->files || filelist_empty(sfile->files))
00317                 file_refresh(C, NULL);
00318 
00319         layout = ED_fileselect_get_layout(sfile, ar);
00320 
00321         /* clear and setup matrix */
00322         UI_GetThemeColor3fv(TH_BACK, col);
00323         glClearColor(col[0], col[1], col[2], 0.0);
00324         glClear(GL_COLOR_BUFFER_BIT);
00325         
00326         /* Allow dynamically sliders to be set, saves notifiers etc. */
00327         if (layout && (layout->flag == FILE_LAYOUT_VER)) {
00328                 v2d->scroll = V2D_SCROLL_RIGHT;
00329                 v2d->keepofs &= ~V2D_LOCKOFS_Y;
00330                 v2d->keepofs |= V2D_LOCKOFS_X;
00331         }
00332         else {
00333                 v2d->scroll = V2D_SCROLL_BOTTOM;
00334                 v2d->keepofs &= ~V2D_LOCKOFS_X;
00335                 v2d->keepofs |= V2D_LOCKOFS_Y;
00336                 
00337                 /* XXX this happens on scaling down Screen (like from startup.blend) */
00338                 /* view2d has no type specific for filewindow case, which doesnt scroll vertically */
00339                 if(v2d->cur.ymax < 0) {
00340                         v2d->cur.ymin -= v2d->cur.ymax;
00341                         v2d->cur.ymax= 0;
00342                 }
00343         }
00344         /* v2d has initialized flag, so this call will only set the mask correct */
00345         UI_view2d_region_reinit(v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
00346 
00347         /* sets tile/border settings in sfile */
00348         file_calc_previews(C, ar);
00349 
00350         /* set view */
00351         UI_view2d_view_ortho(v2d);
00352         
00353         /* on first read, find active file */
00354         if (params->active_file == -1) {
00355                 wmEvent *event= CTX_wm_window(C)->eventstate;
00356                 file_hilight_set(sfile, ar, event->x, event->y);
00357         }
00358         
00359         file_draw_list(C, ar);
00360         
00361         /* reset view matrix */
00362         UI_view2d_view_restore(C);
00363         
00364         /* scrollers */
00365         scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
00366         UI_view2d_scrollers_draw(C, v2d, scrollers);
00367         UI_view2d_scrollers_free(scrollers);
00368 
00369 }
00370 
00371 static void file_operatortypes(void)
00372 {
00373         WM_operatortype_append(FILE_OT_select);
00374         WM_operatortype_append(FILE_OT_select_all_toggle);
00375         WM_operatortype_append(FILE_OT_select_border);
00376         WM_operatortype_append(FILE_OT_select_bookmark);
00377         WM_operatortype_append(FILE_OT_highlight);
00378         WM_operatortype_append(FILE_OT_execute);
00379         WM_operatortype_append(FILE_OT_cancel);
00380         WM_operatortype_append(FILE_OT_parent);
00381         WM_operatortype_append(FILE_OT_previous);
00382         WM_operatortype_append(FILE_OT_next);
00383         WM_operatortype_append(FILE_OT_refresh);
00384         WM_operatortype_append(FILE_OT_bookmark_toggle);
00385         WM_operatortype_append(FILE_OT_bookmark_add);
00386         WM_operatortype_append(FILE_OT_delete_bookmark);
00387         WM_operatortype_append(FILE_OT_hidedot);
00388         WM_operatortype_append(FILE_OT_filenum);
00389         WM_operatortype_append(FILE_OT_directory_new);
00390         WM_operatortype_append(FILE_OT_delete);
00391         WM_operatortype_append(FILE_OT_rename);
00392         WM_operatortype_append(FILE_OT_smoothscroll);
00393         WM_operatortype_append(FILE_OT_directory);
00394 }
00395 
00396 /* NOTE: do not add .blend file reading on this level */
00397 static void file_keymap(struct wmKeyConfig *keyconf)
00398 {
00399         wmKeyMapItem *kmi;
00400         /* keys for all areas */
00401         wmKeyMap *keymap= WM_keymap_find(keyconf, "File Browser", SPACE_FILE, 0);
00402         WM_keymap_add_item(keymap, "FILE_OT_bookmark_toggle", NKEY, KM_PRESS, 0, 0);
00403         WM_keymap_add_item(keymap, "FILE_OT_parent", PKEY, KM_PRESS, 0, 0);
00404         WM_keymap_add_item(keymap, "FILE_OT_bookmark_add", BKEY, KM_PRESS, KM_CTRL, 0);
00405         WM_keymap_add_item(keymap, "FILE_OT_hidedot", HKEY, KM_PRESS, 0, 0);
00406         WM_keymap_add_item(keymap, "FILE_OT_previous", BACKSPACEKEY, KM_PRESS, 0, 0);
00407         WM_keymap_add_item(keymap, "FILE_OT_next", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0);
00408         WM_keymap_add_item(keymap, "FILE_OT_directory_new", IKEY, KM_PRESS, 0, 0);  /* XXX needs button */
00409         WM_keymap_add_item(keymap, "FILE_OT_delete", XKEY, KM_PRESS, 0, 0);
00410         WM_keymap_add_item(keymap, "FILE_OT_delete", DELKEY, KM_PRESS, 0, 0);
00411         WM_keymap_verify_item(keymap, "FILE_OT_smoothscroll", TIMER1, KM_ANY, KM_ANY, 0);
00412 
00413         /* keys for main area */
00414         keymap= WM_keymap_find(keyconf, "File Browser Main", SPACE_FILE, 0);
00415         kmi= WM_keymap_add_item(keymap, "FILE_OT_execute", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
00416         RNA_boolean_set(kmi->ptr, "need_active", 1);
00417         WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, 0, 0);
00418         kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0);
00419         RNA_boolean_set(kmi->ptr, "extend", 1);
00420         kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_ALT, 0);
00421         RNA_boolean_set(kmi->ptr, "extend", 1);
00422         RNA_boolean_set(kmi->ptr, "fill", 1);
00423         WM_keymap_add_item(keymap, "FILE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
00424         WM_keymap_add_item(keymap, "FILE_OT_refresh", PADPERIOD, KM_PRESS, 0, 0);
00425         WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0);
00426         WM_keymap_add_item(keymap, "FILE_OT_select_border", EVT_TWEAK_L, KM_ANY, 0, 0);
00427         WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
00428         WM_keymap_add_item(keymap, "FILE_OT_highlight", MOUSEMOVE, KM_ANY, KM_ANY, 0);
00429         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
00430         RNA_int_set(kmi->ptr, "increment", 1);
00431         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
00432         RNA_int_set(kmi->ptr, "increment", 10);
00433         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
00434         RNA_int_set(kmi->ptr, "increment", 100);
00435         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0,0);
00436         RNA_int_set(kmi->ptr, "increment", -1);
00437         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT, 0);
00438         RNA_int_set(kmi->ptr, "increment", -10);
00439         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL, 0);
00440         RNA_int_set(kmi->ptr, "increment",-100);
00441         
00442         
00443         /* keys for button area (top) */
00444         keymap= WM_keymap_find(keyconf, "File Browser Buttons", SPACE_FILE, 0);
00445         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, 0, 0);
00446         RNA_int_set(kmi->ptr, "increment", 1);
00447         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_SHIFT, 0);
00448         RNA_int_set(kmi->ptr, "increment", 10);
00449         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
00450         RNA_int_set(kmi->ptr, "increment", 100);
00451         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, 0, 0);
00452         RNA_int_set(kmi->ptr, "increment", -1);
00453         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_SHIFT,0);
00454         RNA_int_set(kmi->ptr, "increment", -10);
00455         kmi = WM_keymap_add_item(keymap, "FILE_OT_filenum", PADMINUS, KM_PRESS, KM_CTRL,0);
00456         RNA_int_set(kmi->ptr, "increment",-100);
00457 }
00458 
00459 
00460 static void file_channel_area_init(wmWindowManager *wm, ARegion *ar)
00461 {
00462         wmKeyMap *keymap;
00463 
00464         ED_region_panels_init(wm, ar);
00465 
00466         /* own keymaps */
00467         keymap= WM_keymap_find(wm->defaultconf, "File Browser", SPACE_FILE, 0); 
00468         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00469 }
00470 
00471 static void file_channel_area_draw(const bContext *C, ARegion *ar)
00472 {
00473         ED_region_panels(C, ar, 1, NULL, -1);
00474 }
00475 
00476 static void file_channel_area_listener(ARegion *UNUSED(ar), wmNotifier *wmn)
00477 {
00478         /* context changes */
00479         switch(wmn->category) {
00480                 
00481         }
00482 }
00483 
00484 /* add handlers, stuff you only do once or on area/region changes */
00485 static void file_header_area_init(wmWindowManager *wm, ARegion *ar)
00486 {
00487         wmKeyMap *keymap;
00488         
00489         ED_region_header_init(ar);
00490         
00491         keymap= WM_keymap_find(wm->defaultconf, "File Browser", SPACE_FILE, 0); 
00492         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00493 }
00494 
00495 static void file_header_area_draw(const bContext *C, ARegion *ar)
00496 {
00497         ED_region_header(C, ar);
00498 }
00499 
00500 /* add handlers, stuff you only do once or on area/region changes */
00501 static void file_ui_area_init(wmWindowManager *wm, ARegion *ar)
00502 {
00503         wmKeyMap *keymap;
00504 
00505         UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
00506 
00507         /* own keymap */
00508         keymap= WM_keymap_find(wm->defaultconf, "File Browser", SPACE_FILE, 0);
00509         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00510 
00511         keymap= WM_keymap_find(wm->defaultconf, "File Browser Buttons", SPACE_FILE, 0);
00512         WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
00513 }
00514 
00515 static void file_ui_area_draw(const bContext *C, ARegion *ar)
00516 {
00517         float col[3];
00518         /* clear */
00519         UI_GetThemeColor3fv(TH_PANEL, col);
00520         glClearColor(col[0], col[1], col[2], 0.0);
00521         glClear(GL_COLOR_BUFFER_BIT);
00522 
00523         /* set view2d view matrix for scrolling (without scrollers) */
00524         UI_view2d_view_ortho(&ar->v2d);
00525 
00526         file_draw_buttons(C, ar);
00527 
00528         UI_view2d_view_restore(C);
00529 }
00530 
00531 static void file_ui_area_listener(ARegion *ar, wmNotifier *wmn)
00532 {
00533         /* context changes */
00534         switch(wmn->category) {
00535                 case NC_SPACE:
00536                         switch (wmn->data) {
00537                                 case ND_SPACE_FILE_LIST:
00538                                         ED_region_tag_redraw(ar);
00539                                         break;
00540                         }
00541                         break;
00542         }
00543 }
00544 
00545 /* only called once, from space/spacetypes.c */
00546 void ED_spacetype_file(void)
00547 {
00548         SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype file");
00549         ARegionType *art;
00550         
00551         st->spaceid= SPACE_FILE;
00552         strncpy(st->name, "File", BKE_ST_MAXNAME);
00553         
00554         st->new= file_new;
00555         st->free= file_free;
00556         st->init= file_init;
00557         st->duplicate= file_duplicate;
00558         st->refresh= file_refresh;
00559         st->listener= file_listener;
00560         st->operatortypes= file_operatortypes;
00561         st->keymap= file_keymap;
00562         
00563         /* regions: main window */
00564         art= MEM_callocN(sizeof(ARegionType), "spacetype file region");
00565         art->regionid = RGN_TYPE_WINDOW;
00566         art->init= file_main_area_init;
00567         art->draw= file_main_area_draw;
00568         art->listener= file_main_area_listener;
00569         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
00570         BLI_addhead(&st->regiontypes, art);
00571         
00572         /* regions: header */
00573         art= MEM_callocN(sizeof(ARegionType), "spacetype file region");
00574         art->regionid = RGN_TYPE_HEADER;
00575         art->prefsizey= HEADERY;
00576         art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_HEADER;
00577         art->init= file_header_area_init;
00578         art->draw= file_header_area_draw;
00579         // art->listener= file_header_area_listener;
00580         BLI_addhead(&st->regiontypes, art);
00581         
00582         /* regions: ui */
00583         art= MEM_callocN(sizeof(ARegionType), "spacetype file region");
00584         art->regionid = RGN_TYPE_UI;
00585         art->prefsizey= 60;
00586         art->keymapflag= ED_KEYMAP_UI;
00587         art->listener= file_ui_area_listener;
00588         art->init= file_ui_area_init;
00589         art->draw= file_ui_area_draw;
00590         BLI_addhead(&st->regiontypes, art);
00591 
00592         /* regions: channels (directories) */
00593         art= MEM_callocN(sizeof(ARegionType), "spacetype file region");
00594         art->regionid = RGN_TYPE_CHANNELS;
00595         art->prefsizex= 240;
00596         art->keymapflag= ED_KEYMAP_UI;
00597         art->listener= file_channel_area_listener;
00598         art->init= file_channel_area_init;
00599         art->draw= file_channel_area_draw;
00600         BLI_addhead(&st->regiontypes, art);
00601         file_panels_register(art);
00602 
00603         BKE_spacetype_register(st);
00604 
00605 }
00606 
00607 void ED_file_init(void)
00608 {
00609         char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL);
00610         
00611         fsmenu_read_system(fsmenu_get());
00612 
00613         if (cfgdir) {
00614                 char name[FILE_MAX];
00615                 BLI_make_file_string("/", name, cfgdir, BLENDER_BOOKMARK_FILE);
00616                 fsmenu_read_bookmarks(fsmenu_get(), name);
00617         }
00618         
00619         filelist_init_icons();
00620         IMB_thumb_makedirs();
00621 }
00622 
00623 void ED_file_exit(void)
00624 {
00625         fsmenu_free(fsmenu_get());
00626         filelist_free_icons();
00627 }