diff options
Diffstat (limited to 'source/blender/editors/space_file/space_file.c')
-rw-r--r-- | source/blender/editors/space_file/space_file.c | 222 |
1 files changed, 162 insertions, 60 deletions
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index d5be04cff20..97c2d75e469 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -39,8 +39,8 @@ #include "BLI_utildefines.h" #include "BLI_fileops_types.h" -#include "BLO_readfile.h" +#include "BKE_appdir.h" #include "BKE_context.h" #include "BKE_screen.h" #include "BKE_global.h" @@ -71,7 +71,7 @@ static SpaceLink *file_new(const bContext *UNUSED(C)) { ARegion *ar; SpaceFile *sfile; - + sfile = MEM_callocN(sizeof(SpaceFile), "initfile"); sfile->spacetype = SPACE_FILE; @@ -81,12 +81,18 @@ static SpaceLink *file_new(const bContext *UNUSED(C)) ar->regiontype = RGN_TYPE_HEADER; ar->alignment = RGN_ALIGN_TOP; - /* channel list region */ - ar = MEM_callocN(sizeof(ARegion), "channel area for file"); + /* Tools region */ + ar = MEM_callocN(sizeof(ARegion), "tools area for file"); BLI_addtail(&sfile->regionbase, ar); - ar->regiontype = RGN_TYPE_CHANNELS; + ar->regiontype = RGN_TYPE_TOOLS; ar->alignment = RGN_ALIGN_LEFT; + /* Tool props (aka operator) region */ + ar = MEM_callocN(sizeof(ARegion), "tool props area for file"); + BLI_addtail(&sfile->regionbase, ar); + ar->regiontype = RGN_TYPE_TOOL_PROPS; + ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV; + /* ui list region */ ar = MEM_callocN(sizeof(ARegion), "ui area for file"); BLI_addtail(&sfile->regionbase, ar); @@ -111,6 +117,8 @@ static void file_free(SpaceLink *sl) { SpaceFile *sfile = (SpaceFile *) sl; + BLI_assert(sfile->previews_timer == NULL); + if (sfile->files) { // XXXXX would need to do thumbnails_stop here, but no context available filelist_freelib(sfile->files); @@ -149,7 +157,13 @@ static void file_init(wmWindowManager *UNUSED(wm), ScrArea *sa) SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; /* refresh system directory list */ - fsmenu_refresh_system_category(fsmenu_get()); + fsmenu_refresh_system_category(ED_fsmenu_get()); + + /* Update bookmarks 'valid' state. + * Done here, because it seems BLI_is_dir() can have huge impact on performances + * in some cases, on win systems... See T43684. + */ + fsmenu_refresh_bookmarks_status(ED_fsmenu_get()); if (sfile->layout) sfile->layout->dirty = true; } @@ -158,7 +172,12 @@ static void file_exit(wmWindowManager *wm, ScrArea *sa) { SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; - ED_fileselect_exit(wm, sfile); + if (sfile->previews_timer) { + WM_event_remove_timer_notifier(wm, NULL, sfile->previews_timer); + sfile->previews_timer = NULL; + } + + ED_fileselect_exit(wm, sa, sfile); } static SpaceLink *file_duplicate(SpaceLink *sl) @@ -187,75 +206,94 @@ static SpaceLink *file_duplicate(SpaceLink *sl) return (SpaceLink *)sfilen; } -static void file_refresh(const bContext *C, ScrArea *UNUSED(sa)) +static void file_refresh(const bContext *C, ScrArea *sa) { wmWindowManager *wm = CTX_wm_manager(C); SpaceFile *sfile = CTX_wm_space_file(C); FileSelectParams *params = ED_fileselect_get_params(sfile); + struct FSMenu *fsmenu = ED_fsmenu_get(); - if (!sfile->folders_prev) + if (!sfile->folders_prev) { sfile->folders_prev = folderlist_new(); + } if (!sfile->files) { sfile->files = filelist_new(params->type); - filelist_setdir(sfile->files, params->dir); - params->active_file = -1; // added this so it opens nicer (ton) + params->highlight_file = -1; /* added this so it opens nicer (ton) */ + } + filelist_setdir(sfile->files, params->dir); + filelist_setrecursion(sfile->files, params->recursion_level); + filelist_setsorting(sfile->files, params->sort); + filelist_setfilter_options(sfile->files, (params->flag & FILE_HIDE_DOT) != 0, + false, /* TODO hide_parent, should be controllable? */ + params->flag & FILE_FILTER ? params->filter : 0, + params->filter_id, + params->filter_glob, + params->filter_search); + + /* Update the active indices of bookmarks & co. */ + sfile->systemnr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_SYSTEM, params->dir); + sfile->system_bookmarknr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_SYSTEM_BOOKMARKS, params->dir); + sfile->bookmarknr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir); + sfile->recentnr = fsmenu_get_active_indices(fsmenu, FS_CATEGORY_RECENT, params->dir); + + if (filelist_force_reset(sfile->files)) { + filelist_readjob_stop(wm, sa); + filelist_clear(sfile->files); } - filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT); - filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0); - filelist_setfilter_types(sfile->files, params->filter_glob); if (filelist_empty(sfile->files)) { - thumbnails_stop(wm, sfile->files); - filelist_readdir(sfile->files); - if (params->sort != FILE_SORT_NONE) { - filelist_sort(sfile->files, params->sort); - } - BLI_strncpy(params->dir, filelist_dir(sfile->files), FILE_MAX); - if (params->display == FILE_IMGDISPLAY) { - thumbnails_start(sfile->files, C); + if (!filelist_pending(sfile->files)) { + filelist_readjob_start(sfile->files, C); } } + + filelist_sort(sfile->files); + filelist_filter(sfile->files); + + if (params->display == FILE_IMGDISPLAY) { + filelist_cache_previews_set(sfile->files, true); + } else { - if (params->sort != FILE_SORT_NONE) { - thumbnails_stop(wm, sfile->files); - filelist_sort(sfile->files, params->sort); - if (params->display == FILE_IMGDISPLAY) { - thumbnails_start(sfile->files, C); - } - } - else { - if (params->display == FILE_IMGDISPLAY) { - if (!thumbnails_running(wm, sfile->files)) { - thumbnails_start(sfile->files, C); - } - } - else { - /* stop any running thumbnail jobs if we're not - * displaying them - speedup for NFS */ - thumbnails_stop(wm, sfile->files); - } - filelist_filter(sfile->files); + filelist_cache_previews_set(sfile->files, false); + if (sfile->previews_timer) { + WM_event_remove_timer_notifier(wm, CTX_wm_window(C), sfile->previews_timer); + sfile->previews_timer = NULL; } } - + if (params->renamefile[0] != '\0') { - int idx = filelist_find(sfile->files, params->renamefile); + int idx = filelist_file_findpath(sfile->files, params->renamefile); if (idx >= 0) { - struct direntry *file = filelist_file(sfile->files, idx); + FileDirEntry *file = filelist_file(sfile->files, idx); if (file) { - file->selflag |= EDITING_FILE; + filelist_entry_select_set(sfile->files, file, FILE_SEL_ADD, FILE_SEL_EDITING, CHECK_ALL); } } BLI_strncpy(sfile->params->renameedit, sfile->params->renamefile, sizeof(sfile->params->renameedit)); - params->renamefile[0] = '\0'; + /* File listing is now async, do not clear renamefile if matching entry not found + * and dirlist is not finished! */ + if (idx >= 0 || filelist_is_ready(sfile->files)) { + params->renamefile[0] = '\0'; + } + } + + if (sfile->layout) { + sfile->layout->dirty = true; } - if (sfile->layout) sfile->layout->dirty = true; + /* Might be called with NULL sa, see file_main_area_draw() below. */ + if (sa && BKE_area_find_region_type(sa, RGN_TYPE_TOOLS) == NULL) { + /* Create TOOLS/TOOL_PROPS regions. */ + file_tools_region(sa); + + ED_area_initialize(wm, CTX_wm_window(C), sa); + ED_area_tag_redraw(sa); + } } static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) { - /* SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; */ + SpaceFile *sfile = (SpaceFile *)sa->spacedata.first; /* context changes */ switch (wmn->category) { @@ -269,6 +307,12 @@ static void file_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) ED_area_tag_refresh(sa); ED_area_tag_redraw(sa); break; + case ND_SPACE_FILE_PREVIEW: + if (sfile->files && filelist_cache_previews_update(sfile->files)) { + ED_area_tag_refresh(sa); + ED_area_tag_redraw(sa); + } + break; } break; } @@ -354,7 +398,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar) UI_view2d_view_ortho(v2d); /* on first read, find active file */ - if (params->active_file == -1) { + if (params->highlight_file == -1) { wmEvent *event = CTX_wm_window(C)->eventstate; file_highlight_set(sfile, ar, event->x, event->y); } @@ -374,6 +418,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar) static void file_operatortypes(void) { WM_operatortype_append(FILE_OT_select); + WM_operatortype_append(FILE_OT_select_walk); WM_operatortype_append(FILE_OT_select_all_toggle); WM_operatortype_append(FILE_OT_select_border); WM_operatortype_append(FILE_OT_select_bookmark); @@ -387,6 +432,8 @@ static void file_operatortypes(void) WM_operatortype_append(FILE_OT_bookmark_toggle); WM_operatortype_append(FILE_OT_bookmark_add); WM_operatortype_append(FILE_OT_bookmark_delete); + WM_operatortype_append(FILE_OT_bookmark_cleanup); + WM_operatortype_append(FILE_OT_bookmark_move); WM_operatortype_append(FILE_OT_reset_recent); WM_operatortype_append(FILE_OT_hidedot); WM_operatortype_append(FILE_OT_filenum); @@ -437,6 +484,49 @@ static void file_keymap(struct wmKeyConfig *keyconf) RNA_boolean_set(kmi->ptr, "fill", true); RNA_boolean_set(kmi->ptr, "open", false); + + /* arrow keys navigation (walk selecting) */ + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP); + RNA_boolean_set(kmi->ptr, "extend", true); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", UPARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_UP); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "fill", true); + + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN); + RNA_boolean_set(kmi->ptr, "extend", true); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", DOWNARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_DOWN); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "fill", true); + + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT); + RNA_boolean_set(kmi->ptr, "extend", true); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", LEFTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_LEFT); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "fill", true); + + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT); + RNA_boolean_set(kmi->ptr, "extend", true); + kmi = WM_keymap_add_item(keymap, "FILE_OT_select_walk", RIGHTARROWKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "direction", FILE_SELECT_WALK_RIGHT); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "fill", true); + + /* front and back mouse folder navigation */ WM_keymap_add_item(keymap, "FILE_OT_previous", BUTTON4MOUSE, KM_CLICK, 0, 0); WM_keymap_add_item(keymap, "FILE_OT_next", BUTTON5MOUSE, KM_CLICK, 0, 0); @@ -478,7 +568,7 @@ static void file_keymap(struct wmKeyConfig *keyconf) } -static void file_channel_area_init(wmWindowManager *wm, ARegion *ar) +static void file_tools_area_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; @@ -490,12 +580,12 @@ static void file_channel_area_init(wmWindowManager *wm, ARegion *ar) WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } -static void file_channel_area_draw(const bContext *C, ARegion *ar) +static void file_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } -static void file_channel_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn)) +static void file_tools_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn)) { #if 0 /* context changes */ @@ -621,12 +711,24 @@ void ED_spacetype_file(void) /* regions: channels (directories) */ art = MEM_callocN(sizeof(ARegionType), "spacetype file region"); - art->regionid = RGN_TYPE_CHANNELS; + art->regionid = RGN_TYPE_TOOLS; art->prefsizex = 240; + art->prefsizey = 60; + art->keymapflag = ED_KEYMAP_UI; + art->listener = file_tools_area_listener; + art->init = file_tools_area_init; + art->draw = file_tools_area_draw; + BLI_addhead(&st->regiontypes, art); + + /* regions: tool properties */ + art = MEM_callocN(sizeof(ARegionType), "spacetype file operator region"); + art->regionid = RGN_TYPE_TOOL_PROPS; + art->prefsizex = 0; + art->prefsizey = 360; art->keymapflag = ED_KEYMAP_UI; - art->listener = file_channel_area_listener; - art->init = file_channel_area_init; - art->draw = file_channel_area_draw; + art->listener = file_tools_area_listener; + art->init = file_tools_area_init; + art->draw = file_tools_area_draw; BLI_addhead(&st->regiontypes, art); file_panels_register(art); @@ -656,16 +758,16 @@ void ED_file_exit(void) void ED_file_read_bookmarks(void) { - const char * const cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL); + const char * const cfgdir = BKE_appdir_folder_id(BLENDER_USER_CONFIG, NULL); fsmenu_free(); - fsmenu_read_system(fsmenu_get(), true); + fsmenu_read_system(ED_fsmenu_get(), true); if (cfgdir) { char name[FILE_MAX]; BLI_make_file_string("/", name, cfgdir, BLENDER_BOOKMARK_FILE); - fsmenu_read_bookmarks(fsmenu_get(), name); + fsmenu_read_bookmarks(ED_fsmenu_get(), name); } } |