|
Blender
V2.59
|
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 }