Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_file/file_ops.c')
-rw-r--r--source/blender/editors/space_file/file_ops.c3601
1 files changed, 1823 insertions, 1778 deletions
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 482774c8131..073b6d0f487 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -69,161 +69,158 @@
/* ---------- FILE SELECTION ------------ */
static FileSelection find_file_mouse_rect(SpaceFile *sfile, ARegion *ar, const rcti *rect_region)
{
- FileSelection sel;
+ FileSelection sel;
- View2D *v2d = &ar->v2d;
- rcti rect_view;
- rctf rect_view_fl;
- rctf rect_region_fl;
+ View2D *v2d = &ar->v2d;
+ rcti rect_view;
+ rctf rect_view_fl;
+ rctf rect_region_fl;
- BLI_rctf_rcti_copy(&rect_region_fl, rect_region);
+ BLI_rctf_rcti_copy(&rect_region_fl, rect_region);
- UI_view2d_region_to_view_rctf(v2d, &rect_region_fl, &rect_view_fl);
+ UI_view2d_region_to_view_rctf(v2d, &rect_region_fl, &rect_view_fl);
- BLI_rcti_init(&rect_view,
- (int)(v2d->tot.xmin + rect_view_fl.xmin),
- (int)(v2d->tot.xmin + rect_view_fl.xmax),
- (int)(v2d->tot.ymax - rect_view_fl.ymin),
- (int)(v2d->tot.ymax - rect_view_fl.ymax));
+ BLI_rcti_init(&rect_view,
+ (int)(v2d->tot.xmin + rect_view_fl.xmin),
+ (int)(v2d->tot.xmin + rect_view_fl.xmax),
+ (int)(v2d->tot.ymax - rect_view_fl.ymin),
+ (int)(v2d->tot.ymax - rect_view_fl.ymax));
- sel = ED_fileselect_layout_offset_rect(sfile->layout, &rect_view);
+ sel = ED_fileselect_layout_offset_rect(sfile->layout, &rect_view);
- return sel;
+ return sel;
}
static void file_deselect_all(SpaceFile *sfile, unsigned int flag)
{
- FileSelection sel;
- sel.first = 0;
- sel.last = filelist_files_ensure(sfile->files) - 1;
+ FileSelection sel;
+ sel.first = 0;
+ sel.last = filelist_files_ensure(sfile->files) - 1;
- filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_REMOVE, flag, CHECK_ALL);
+ filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_REMOVE, flag, CHECK_ALL);
}
typedef enum FileSelect {
- FILE_SELECT_NOTHING = 0,
- FILE_SELECT_DIR = 1,
- FILE_SELECT_FILE = 2,
+ FILE_SELECT_NOTHING = 0,
+ FILE_SELECT_DIR = 1,
+ FILE_SELECT_FILE = 2,
} FileSelect;
static void clamp_to_filelist(int numfiles, FileSelection *sel)
{
- /* box select before the first file */
- if ( (sel->first < 0) && (sel->last >= 0) ) {
- sel->first = 0;
- }
- /* don't select if everything is outside filelist */
- if ( (sel->first >= numfiles) && ((sel->last < 0) || (sel->last >= numfiles)) ) {
- sel->first = -1;
- sel->last = -1;
- }
-
- /* fix if last file invalid */
- if ( (sel->first > 0) && (sel->last < 0) )
- sel->last = numfiles - 1;
-
- /* clamp */
- if ( (sel->first >= numfiles) ) {
- sel->first = numfiles - 1;
- }
- if ( (sel->last >= numfiles) ) {
- sel->last = numfiles - 1;
- }
+ /* box select before the first file */
+ if ((sel->first < 0) && (sel->last >= 0)) {
+ sel->first = 0;
+ }
+ /* don't select if everything is outside filelist */
+ if ((sel->first >= numfiles) && ((sel->last < 0) || (sel->last >= numfiles))) {
+ sel->first = -1;
+ sel->last = -1;
+ }
+
+ /* fix if last file invalid */
+ if ((sel->first > 0) && (sel->last < 0))
+ sel->last = numfiles - 1;
+
+ /* clamp */
+ if ((sel->first >= numfiles)) {
+ sel->first = numfiles - 1;
+ }
+ if ((sel->last >= numfiles)) {
+ sel->last = numfiles - 1;
+ }
}
static FileSelection file_selection_get(bContext *C, const rcti *rect, bool fill)
{
- ARegion *ar = CTX_wm_region(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- int numfiles = filelist_files_ensure(sfile->files);
- FileSelection sel;
-
- sel = find_file_mouse_rect(sfile, ar, rect);
- if (!((sel.first == -1) && (sel.last == -1)) ) {
- clamp_to_filelist(numfiles, &sel);
- }
-
-
- /* if desired, fill the selection up from the last selected file to the current one */
- if (fill && (sel.last >= 0) && (sel.last < numfiles) ) {
- int f;
- /* Try to find a smaller-index selected item. */
- for (f = sel.last; f >= 0; f--) {
- if (filelist_entry_select_index_get(sfile->files, f, CHECK_ALL) )
- break;
- }
- if (f >= 0) {
- sel.first = f + 1;
- }
- /* If none found, try to find a higher-index selected item. */
- else {
- for (f = sel.first; f < numfiles; f++) {
- if (filelist_entry_select_index_get(sfile->files, f, CHECK_ALL) )
- break;
- }
- if (f < numfiles) {
- sel.last = f - 1;
- }
- }
- }
- return sel;
+ ARegion *ar = CTX_wm_region(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ int numfiles = filelist_files_ensure(sfile->files);
+ FileSelection sel;
+
+ sel = find_file_mouse_rect(sfile, ar, rect);
+ if (!((sel.first == -1) && (sel.last == -1))) {
+ clamp_to_filelist(numfiles, &sel);
+ }
+
+ /* if desired, fill the selection up from the last selected file to the current one */
+ if (fill && (sel.last >= 0) && (sel.last < numfiles)) {
+ int f;
+ /* Try to find a smaller-index selected item. */
+ for (f = sel.last; f >= 0; f--) {
+ if (filelist_entry_select_index_get(sfile->files, f, CHECK_ALL))
+ break;
+ }
+ if (f >= 0) {
+ sel.first = f + 1;
+ }
+ /* If none found, try to find a higher-index selected item. */
+ else {
+ for (f = sel.first; f < numfiles; f++) {
+ if (filelist_entry_select_index_get(sfile->files, f, CHECK_ALL))
+ break;
+ }
+ if (f < numfiles) {
+ sel.last = f - 1;
+ }
+ }
+ }
+ return sel;
}
static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
{
- Main *bmain = CTX_data_main(C);
- FileSelect retval = FILE_SELECT_NOTHING;
- SpaceFile *sfile = CTX_wm_space_file(C);
- FileSelectParams *params = ED_fileselect_get_params(sfile);
- int numfiles = filelist_files_ensure(sfile->files);
- const FileDirEntry *file;
-
- /* make the selected file active */
- if ((selected_idx >= 0) &&
- (selected_idx < numfiles) &&
- (file = filelist_file(sfile->files, selected_idx)))
- {
- params->highlight_file = selected_idx;
- params->active_file = selected_idx;
-
- if (file->typeflag & FILE_TYPE_DIR) {
- const bool is_parent_dir = FILENAME_IS_PARENT(file->relpath);
-
- if (do_diropen == false) {
- params->file[0] = '\0';
- retval = FILE_SELECT_DIR;
- }
- /* the path is too long and we are not going up! */
- else if (!is_parent_dir && strlen(params->dir) + strlen(file->relpath) >= FILE_MAX) {
- // XXX error("Path too long, cannot enter this directory");
- }
- else {
- if (is_parent_dir) {
- /* avoids /../../ */
- BLI_parent_dir(params->dir);
-
- if (params->recursion_level > 1) {
- /* Disable 'dirtree' recursion when going up in tree. */
- params->recursion_level = 0;
- filelist_setrecursion(sfile->files, params->recursion_level);
- }
- }
- else {
- BLI_cleanup_dir(BKE_main_blendfile_path(bmain), params->dir);
- strcat(params->dir, file->relpath);
- BLI_add_slash(params->dir);
- }
-
- ED_file_change_dir(C);
- retval = FILE_SELECT_DIR;
- }
- }
- else {
- retval = FILE_SELECT_FILE;
- }
- fileselect_file_set(sfile, selected_idx);
- }
- return retval;
+ Main *bmain = CTX_data_main(C);
+ FileSelect retval = FILE_SELECT_NOTHING;
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ int numfiles = filelist_files_ensure(sfile->files);
+ const FileDirEntry *file;
+
+ /* make the selected file active */
+ if ((selected_idx >= 0) && (selected_idx < numfiles) &&
+ (file = filelist_file(sfile->files, selected_idx))) {
+ params->highlight_file = selected_idx;
+ params->active_file = selected_idx;
+
+ if (file->typeflag & FILE_TYPE_DIR) {
+ const bool is_parent_dir = FILENAME_IS_PARENT(file->relpath);
+
+ if (do_diropen == false) {
+ params->file[0] = '\0';
+ retval = FILE_SELECT_DIR;
+ }
+ /* the path is too long and we are not going up! */
+ else if (!is_parent_dir && strlen(params->dir) + strlen(file->relpath) >= FILE_MAX) {
+ // XXX error("Path too long, cannot enter this directory");
+ }
+ else {
+ if (is_parent_dir) {
+ /* avoids /../../ */
+ BLI_parent_dir(params->dir);
+
+ if (params->recursion_level > 1) {
+ /* Disable 'dirtree' recursion when going up in tree. */
+ params->recursion_level = 0;
+ filelist_setrecursion(sfile->files, params->recursion_level);
+ }
+ }
+ else {
+ BLI_cleanup_dir(BKE_main_blendfile_path(bmain), params->dir);
+ strcat(params->dir, file->relpath);
+ BLI_add_slash(params->dir);
+ }
+
+ ED_file_change_dir(C);
+ retval = FILE_SELECT_DIR;
+ }
+ }
+ else {
+ retval = FILE_SELECT_FILE;
+ }
+ fileselect_file_set(sfile, selected_idx);
+ }
+ return retval;
}
/**
@@ -231,17 +228,17 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen)
*/
static bool file_is_any_selected(struct FileList *files)
{
- const int numfiles = filelist_files_ensure(files);
- int i;
+ const int numfiles = filelist_files_ensure(files);
+ int i;
- /* Is any file selected ? */
- for (i = 0; i < numfiles; ++i) {
- if (filelist_entry_select_index_get(files, i, CHECK_ALL)) {
- return true;
- }
- }
+ /* Is any file selected ? */
+ for (i = 0; i < numfiles; ++i) {
+ if (filelist_entry_select_index_get(files, i, CHECK_ALL)) {
+ return true;
+ }
+ }
- return false;
+ return false;
}
/**
@@ -249,577 +246,607 @@ static bool file_is_any_selected(struct FileList *files)
*/
static void file_ensure_inside_viewbounds(ARegion *ar, SpaceFile *sfile, const int file)
{
- FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
- rctf *cur = &ar->v2d.cur;
- rcti rect;
- bool changed = true;
-
- file_tile_boundbox(ar, layout, file, &rect);
-
- /* down - also use if tile is higher than viewbounds so view is aligned to file name */
- if (cur->ymin > rect.ymin || layout->tile_h > ar->winy) {
- cur->ymin = rect.ymin - (2 * layout->tile_border_y);
- cur->ymax = cur->ymin + ar->winy;
- }
- /* up */
- else if (cur->ymax < rect.ymax) {
- cur->ymax = rect.ymax + layout->tile_border_y;
- cur->ymin = cur->ymax - ar->winy;
- }
- /* left - also use if tile is wider than viewbounds so view is aligned to file name */
- else if (cur->xmin > rect.xmin || layout->tile_w > ar->winx) {
- cur->xmin = rect.xmin - layout->tile_border_x;
- cur->xmax = cur->xmin + ar->winx;
- }
- /* right */
- else if (cur->xmax < rect.xmax) {
- cur->xmax = rect.xmax + (2 * layout->tile_border_x);
- cur->xmin = cur->xmax - ar->winx;
- }
- else {
- BLI_assert(cur->xmin <= rect.xmin && cur->xmax >= rect.xmax &&
- cur->ymin <= rect.ymin && cur->ymax >= rect.ymax);
- changed = false;
- }
-
- if (changed) {
- UI_view2d_curRect_validate(&ar->v2d);
- }
-}
-
-
-static FileSelect file_select(bContext *C, const rcti *rect, FileSelType select, bool fill, bool do_diropen)
-{
- SpaceFile *sfile = CTX_wm_space_file(C);
- FileSelect retval = FILE_SELECT_NOTHING;
- FileSelection sel = file_selection_get(C, rect, fill); /* get the selection */
- const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS : CHECK_ALL;
-
- /* flag the files as selected in the filelist */
- filelist_entries_select_index_range_set(sfile->files, &sel, select, FILE_SEL_SELECTED, check_type);
-
- /* Don't act on multiple selected files */
- if (sel.first != sel.last) select = 0;
-
- /* Do we have a valid selection and are we actually selecting */
- if ((sel.last >= 0) && (select != FILE_SEL_REMOVE)) {
- /* Check last selection, if selected, act on the file or dir */
- if (filelist_entry_select_index_get(sfile->files, sel.last, check_type)) {
- retval = file_select_do(C, sel.last, do_diropen);
- }
- }
-
- if (select != FILE_SEL_ADD && !file_is_any_selected(sfile->files)) {
- sfile->params->active_file = -1;
- }
- else {
- ARegion *ar = CTX_wm_region(C);
- const FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
-
- /* Adjust view to display selection. Doing iterations for first and last
- * selected item makes view showing as much of the selection possible.
- * Not really useful if tiles are (almost) bigger than viewbounds though. */
- if (((layout->flag & FILE_LAYOUT_HOR) && ar->winx > (1.2f * layout->tile_w)) ||
- ((layout->flag & FILE_LAYOUT_VER) && ar->winy > (2.0f * layout->tile_h)))
- {
- file_ensure_inside_viewbounds(ar, sfile, sel.last);
- file_ensure_inside_viewbounds(ar, sfile, sel.first);
- }
- }
-
- /* update operator for name change event */
- file_draw_check(C);
-
- return retval;
-}
-
-static int file_box_select_find_last_selected(
- SpaceFile *sfile, ARegion *ar, const FileSelection *sel,
- const int mouse_xy[2])
-{
- FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
- rcti bounds_first, bounds_last;
- int dist_first, dist_last;
- float mouseco_view[2];
-
- UI_view2d_region_to_view(&ar->v2d, UNPACK2(mouse_xy), &mouseco_view[0], &mouseco_view[1]);
-
- file_tile_boundbox(ar, layout, sel->first, &bounds_first);
- file_tile_boundbox(ar, layout, sel->last, &bounds_last);
-
- /* are first and last in the same column (horizontal layout)/row (vertical layout)? */
- if ((layout->flag & FILE_LAYOUT_HOR && bounds_first.xmin == bounds_last.xmin) ||
- (layout->flag & FILE_LAYOUT_VER && bounds_first.ymin != bounds_last.ymin))
- {
- /* use vertical distance */
- const int my_loc = (int)mouseco_view[1];
- dist_first = BLI_rcti_length_y(&bounds_first, my_loc);
- dist_last = BLI_rcti_length_y(&bounds_last, my_loc);
- }
- else {
- /* use horizontal distance */
- const int mx_loc = (int)mouseco_view[0];
- dist_first = BLI_rcti_length_x(&bounds_first, mx_loc);
- dist_last = BLI_rcti_length_x(&bounds_last, mx_loc);
- }
-
- return (dist_first < dist_last) ? sel->first : sel->last;
+ FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
+ rctf *cur = &ar->v2d.cur;
+ rcti rect;
+ bool changed = true;
+
+ file_tile_boundbox(ar, layout, file, &rect);
+
+ /* down - also use if tile is higher than viewbounds so view is aligned to file name */
+ if (cur->ymin > rect.ymin || layout->tile_h > ar->winy) {
+ cur->ymin = rect.ymin - (2 * layout->tile_border_y);
+ cur->ymax = cur->ymin + ar->winy;
+ }
+ /* up */
+ else if (cur->ymax < rect.ymax) {
+ cur->ymax = rect.ymax + layout->tile_border_y;
+ cur->ymin = cur->ymax - ar->winy;
+ }
+ /* left - also use if tile is wider than viewbounds so view is aligned to file name */
+ else if (cur->xmin > rect.xmin || layout->tile_w > ar->winx) {
+ cur->xmin = rect.xmin - layout->tile_border_x;
+ cur->xmax = cur->xmin + ar->winx;
+ }
+ /* right */
+ else if (cur->xmax < rect.xmax) {
+ cur->xmax = rect.xmax + (2 * layout->tile_border_x);
+ cur->xmin = cur->xmax - ar->winx;
+ }
+ else {
+ BLI_assert(cur->xmin <= rect.xmin && cur->xmax >= rect.xmax && cur->ymin <= rect.ymin &&
+ cur->ymax >= rect.ymax);
+ changed = false;
+ }
+
+ if (changed) {
+ UI_view2d_curRect_validate(&ar->v2d);
+ }
+}
+
+static FileSelect file_select(
+ bContext *C, const rcti *rect, FileSelType select, bool fill, bool do_diropen)
+{
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ FileSelect retval = FILE_SELECT_NOTHING;
+ FileSelection sel = file_selection_get(C, rect, fill); /* get the selection */
+ const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS :
+ CHECK_ALL;
+
+ /* flag the files as selected in the filelist */
+ filelist_entries_select_index_range_set(
+ sfile->files, &sel, select, FILE_SEL_SELECTED, check_type);
+
+ /* Don't act on multiple selected files */
+ if (sel.first != sel.last)
+ select = 0;
+
+ /* Do we have a valid selection and are we actually selecting */
+ if ((sel.last >= 0) && (select != FILE_SEL_REMOVE)) {
+ /* Check last selection, if selected, act on the file or dir */
+ if (filelist_entry_select_index_get(sfile->files, sel.last, check_type)) {
+ retval = file_select_do(C, sel.last, do_diropen);
+ }
+ }
+
+ if (select != FILE_SEL_ADD && !file_is_any_selected(sfile->files)) {
+ sfile->params->active_file = -1;
+ }
+ else {
+ ARegion *ar = CTX_wm_region(C);
+ const FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
+
+ /* Adjust view to display selection. Doing iterations for first and last
+ * selected item makes view showing as much of the selection possible.
+ * Not really useful if tiles are (almost) bigger than viewbounds though. */
+ if (((layout->flag & FILE_LAYOUT_HOR) && ar->winx > (1.2f * layout->tile_w)) ||
+ ((layout->flag & FILE_LAYOUT_VER) && ar->winy > (2.0f * layout->tile_h))) {
+ file_ensure_inside_viewbounds(ar, sfile, sel.last);
+ file_ensure_inside_viewbounds(ar, sfile, sel.first);
+ }
+ }
+
+ /* update operator for name change event */
+ file_draw_check(C);
+
+ return retval;
+}
+
+static int file_box_select_find_last_selected(SpaceFile *sfile,
+ ARegion *ar,
+ const FileSelection *sel,
+ const int mouse_xy[2])
+{
+ FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
+ rcti bounds_first, bounds_last;
+ int dist_first, dist_last;
+ float mouseco_view[2];
+
+ UI_view2d_region_to_view(&ar->v2d, UNPACK2(mouse_xy), &mouseco_view[0], &mouseco_view[1]);
+
+ file_tile_boundbox(ar, layout, sel->first, &bounds_first);
+ file_tile_boundbox(ar, layout, sel->last, &bounds_last);
+
+ /* are first and last in the same column (horizontal layout)/row (vertical layout)? */
+ if ((layout->flag & FILE_LAYOUT_HOR && bounds_first.xmin == bounds_last.xmin) ||
+ (layout->flag & FILE_LAYOUT_VER && bounds_first.ymin != bounds_last.ymin)) {
+ /* use vertical distance */
+ const int my_loc = (int)mouseco_view[1];
+ dist_first = BLI_rcti_length_y(&bounds_first, my_loc);
+ dist_last = BLI_rcti_length_y(&bounds_last, my_loc);
+ }
+ else {
+ /* use horizontal distance */
+ const int mx_loc = (int)mouseco_view[0];
+ dist_first = BLI_rcti_length_x(&bounds_first, mx_loc);
+ dist_last = BLI_rcti_length_x(&bounds_last, mx_loc);
+ }
+
+ return (dist_first < dist_last) ? sel->first : sel->last;
}
static int file_box_select_modal(bContext *C, wmOperator *op, const wmEvent *event)
{
- ARegion *ar = CTX_wm_region(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- FileSelectParams *params = ED_fileselect_get_params(sfile);
- FileSelection sel;
- rcti rect;
+ ARegion *ar = CTX_wm_region(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ FileSelection sel;
+ rcti rect;
- int result;
+ int result;
- result = WM_gesture_box_modal(C, op, event);
+ result = WM_gesture_box_modal(C, op, event);
- if (result == OPERATOR_RUNNING_MODAL) {
- WM_operator_properties_border_to_rcti(op, &rect);
+ if (result == OPERATOR_RUNNING_MODAL) {
+ WM_operator_properties_border_to_rcti(op, &rect);
- BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
+ BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
- sel = file_selection_get(C, &rect, 0);
- if ((sel.first != params->sel_first) || (sel.last != params->sel_last)) {
- int idx;
+ sel = file_selection_get(C, &rect, 0);
+ if ((sel.first != params->sel_first) || (sel.last != params->sel_last)) {
+ int idx;
- file_deselect_all(sfile, FILE_SEL_HIGHLIGHTED);
- filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_ADD, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ file_deselect_all(sfile, FILE_SEL_HIGHLIGHTED);
+ filelist_entries_select_index_range_set(
+ sfile->files, &sel, FILE_SEL_ADD, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- for (idx = sel.last; idx >= 0; idx--) {
- const FileDirEntry *file = filelist_file(sfile->files, idx);
+ for (idx = sel.last; idx >= 0; idx--) {
+ const FileDirEntry *file = filelist_file(sfile->files, idx);
- /* dont highlight readonly file (".." or ".") on box select */
- if (FILENAME_IS_CURRPAR(file->relpath)) {
- filelist_entry_select_set(sfile->files, file, FILE_SEL_REMOVE, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
- }
+ /* dont highlight readonly file (".." or ".") on box select */
+ if (FILENAME_IS_CURRPAR(file->relpath)) {
+ filelist_entry_select_set(
+ sfile->files, file, FILE_SEL_REMOVE, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
+ }
- /* make sure highlight_file is no readonly file */
- if (sel.last == idx) {
- params->highlight_file = idx;
- }
- }
- }
- params->sel_first = sel.first; params->sel_last = sel.last;
- params->active_file = file_box_select_find_last_selected(sfile, ar, &sel, event->mval);
- }
- else {
- params->highlight_file = -1;
- params->sel_first = params->sel_last = -1;
- fileselect_file_set(sfile, params->active_file);
- file_deselect_all(sfile, FILE_SEL_HIGHLIGHTED);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- }
+ /* make sure highlight_file is no readonly file */
+ if (sel.last == idx) {
+ params->highlight_file = idx;
+ }
+ }
+ }
+ params->sel_first = sel.first;
+ params->sel_last = sel.last;
+ params->active_file = file_box_select_find_last_selected(sfile, ar, &sel, event->mval);
+ }
+ else {
+ params->highlight_file = -1;
+ params->sel_first = params->sel_last = -1;
+ fileselect_file_set(sfile, params->active_file);
+ file_deselect_all(sfile, FILE_SEL_HIGHLIGHTED);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ }
- return result;
+ return result;
}
static int file_box_select_exec(bContext *C, wmOperator *op)
{
- ARegion *ar = CTX_wm_region(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- rcti rect;
- FileSelect ret;
+ ARegion *ar = CTX_wm_region(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ rcti rect;
+ FileSelect ret;
- WM_operator_properties_border_to_rcti(op, &rect);
+ WM_operator_properties_border_to_rcti(op, &rect);
- const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
- const bool select = (sel_op != SEL_OP_SUB);
- if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
- file_deselect_all(sfile, FILE_SEL_SELECTED);
- }
+ const eSelectOp sel_op = RNA_enum_get(op->ptr, "mode");
+ const bool select = (sel_op != SEL_OP_SUB);
+ if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
+ file_deselect_all(sfile, FILE_SEL_SELECTED);
+ }
- BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
+ BLI_rcti_isect(&(ar->v2d.mask), &rect, &rect);
- ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, false, false);
+ ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, false, false);
- /* unselect '..' parent entry - it's not supposed to be selected if more than
- * one file is selected */
- filelist_entry_select_index_set(sfile->files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
+ /* unselect '..' parent entry - it's not supposed to be selected if more than
+ * one file is selected */
+ filelist_entry_select_index_set(sfile->files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
- if (FILE_SELECT_DIR == ret) {
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- }
- else if (FILE_SELECT_FILE == ret) {
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- }
- return OPERATOR_FINISHED;
+ if (FILE_SELECT_DIR == ret) {
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ }
+ else if (FILE_SELECT_FILE == ret) {
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ }
+ return OPERATOR_FINISHED;
}
void FILE_OT_select_box(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Box Select";
- ot->description = "Activate/select the file(s) contained in the border";
- ot->idname = "FILE_OT_select_box";
+ /* identifiers */
+ ot->name = "Box Select";
+ ot->description = "Activate/select the file(s) contained in the border";
+ ot->idname = "FILE_OT_select_box";
- /* api callbacks */
- ot->invoke = WM_gesture_box_invoke;
- ot->exec = file_box_select_exec;
- ot->modal = file_box_select_modal;
- ot->poll = ED_operator_file_active;
- ot->cancel = WM_gesture_box_cancel;
+ /* api callbacks */
+ ot->invoke = WM_gesture_box_invoke;
+ ot->exec = file_box_select_exec;
+ ot->modal = file_box_select_modal;
+ ot->poll = ED_operator_file_active;
+ ot->cancel = WM_gesture_box_cancel;
- /* properties */
- WM_operator_properties_gesture_box(ot);
- WM_operator_properties_select_operation_simple(ot);
+ /* properties */
+ WM_operator_properties_gesture_box(ot);
+ WM_operator_properties_select_operation_simple(ot);
}
static int file_select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- ARegion *ar = CTX_wm_region(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- FileSelect ret;
- rcti rect;
- const bool extend = RNA_boolean_get(op->ptr, "extend");
- const bool fill = RNA_boolean_get(op->ptr, "fill");
- const bool do_diropen = RNA_boolean_get(op->ptr, "open");
+ ARegion *ar = CTX_wm_region(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ FileSelect ret;
+ rcti rect;
+ const bool extend = RNA_boolean_get(op->ptr, "extend");
+ const bool fill = RNA_boolean_get(op->ptr, "fill");
+ const bool do_diropen = RNA_boolean_get(op->ptr, "open");
- if (ar->regiontype != RGN_TYPE_WINDOW)
- return OPERATOR_CANCELLED;
+ if (ar->regiontype != RGN_TYPE_WINDOW)
+ return OPERATOR_CANCELLED;
- rect.xmin = rect.xmax = event->mval[0];
- rect.ymin = rect.ymax = event->mval[1];
+ rect.xmin = rect.xmax = event->mval[0];
+ rect.ymin = rect.ymax = event->mval[1];
- if (!BLI_rcti_isect_pt(&ar->v2d.mask, rect.xmin, rect.ymin))
- return OPERATOR_CANCELLED;
+ if (!BLI_rcti_isect_pt(&ar->v2d.mask, rect.xmin, rect.ymin))
+ return OPERATOR_CANCELLED;
- if (sfile && sfile->params) {
- int idx = sfile->params->highlight_file;
- int numfiles = filelist_files_ensure(sfile->files);
+ if (sfile && sfile->params) {
+ int idx = sfile->params->highlight_file;
+ int numfiles = filelist_files_ensure(sfile->files);
- if ((idx >= 0) && (idx < numfiles)) {
- /* single select, deselect all selected first */
- if (!extend) {
- file_deselect_all(sfile, FILE_SEL_SELECTED);
- }
- }
- }
+ if ((idx >= 0) && (idx < numfiles)) {
+ /* single select, deselect all selected first */
+ if (!extend) {
+ file_deselect_all(sfile, FILE_SEL_SELECTED);
+ }
+ }
+ }
- ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill, do_diropen);
+ ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill, do_diropen);
- if (extend) {
- /* unselect '..' parent entry - it's not supposed to be selected if more
- * than one file is selected */
- filelist_entry_select_index_set(sfile->files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
- }
+ if (extend) {
+ /* unselect '..' parent entry - it's not supposed to be selected if more
+ * than one file is selected */
+ filelist_entry_select_index_set(
+ sfile->files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
+ }
- if (FILE_SELECT_DIR == ret)
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- else if (FILE_SELECT_FILE == ret)
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ if (FILE_SELECT_DIR == ret)
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ else if (FILE_SELECT_FILE == ret)
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- WM_event_add_mousemove(C); /* for directory changes */
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ WM_event_add_mousemove(C); /* for directory changes */
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_select(wmOperatorType *ot)
{
- PropertyRNA *prop;
+ PropertyRNA *prop;
- /* identifiers */
- ot->name = "Select";
- ot->description = "Activate/select file";
- ot->idname = "FILE_OT_select";
+ /* identifiers */
+ ot->name = "Select";
+ ot->description = "Activate/select file";
+ ot->idname = "FILE_OT_select";
- /* api callbacks */
- ot->invoke = file_select_invoke;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->invoke = file_select_invoke;
+ ot->poll = ED_operator_file_active;
- /* properties */
- prop = RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- prop = RNA_def_boolean(ot->srna, "fill", false, "Fill", "Select everything beginning with the last selection");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- prop = RNA_def_boolean(ot->srna, "open", true, "Open", "Open a directory when selecting it");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ /* properties */
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(
+ ot->srna, "fill", false, "Fill", "Select everything beginning with the last selection");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(ot->srna, "open", true, "Open", "Open a directory when selecting it");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
/**
* \returns true if selection has changed
*/
-static bool file_walk_select_selection_set(
- bContext *C, SpaceFile *sfile,
- const int direction, const int numfiles,
- const int active_old, const int active_new, const int other_site,
- const bool has_selection, const bool extend, const bool fill)
-{
- FileSelectParams *params = sfile->params;
- struct FileList *files = sfile->files;
- const int last_sel = params->active_file; /* store old value */
- int active = active_old; /* could use active_old instead, just for readability */
- bool deselect = false;
-
- BLI_assert(params);
-
- if (has_selection) {
- if (extend &&
- filelist_entry_select_index_get(files, active_old, CHECK_ALL) &&
- filelist_entry_select_index_get(files, active_new, CHECK_ALL))
- {
- /* conditions for deselecting: initial file is selected, new file is
- * selected and either other_side isn't selected/found or we use fill */
- deselect = (fill || other_site == -1 ||
- !filelist_entry_select_index_get(files, other_site, CHECK_ALL));
-
- /* don't change highlight_file here since we either want to deselect active or we want
- * to walk through a block of selected files without selecting/deselecting anything */
- params->active_file = active_new;
- /* but we want to change active if we use fill
- * (needed to get correct selection bounds) */
- if (deselect && fill) {
- active = active_new;
- }
- }
- else {
- /* regular selection change */
- params->active_file = active = active_new;
- }
- }
- else {
- /* select last file */
- if (ELEM(direction, FILE_SELECT_WALK_UP, FILE_SELECT_WALK_LEFT)) {
- params->active_file = active = numfiles - 1;
- }
- /* select first file */
- else if (ELEM(direction, FILE_SELECT_WALK_DOWN, FILE_SELECT_WALK_RIGHT)) {
- params->active_file = active = extend ? 1 : 0;
- }
- else {
- BLI_assert(0);
- }
- }
-
- if (active < 0) {
- return false;
- }
-
- if (extend) {
- /* highlight the active walker file for extended selection for better visual feedback */
- params->highlight_file = params->active_file;
-
- /* unselect '..' parent entry - it's not supposed to be selected if more
- * than one file is selected */
- filelist_entry_select_index_set(files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
- }
- else {
- /* deselect all first */
- file_deselect_all(sfile, FILE_SEL_SELECTED);
-
- /* highlight file under mouse pos */
- params->highlight_file = -1;
- WM_event_add_mousemove(C);
- }
-
- /* do the actual selection */
- if (fill) {
- FileSelection sel = { MIN2(active, last_sel), MAX2(active, last_sel) };
-
- /* clamping selection to not include '..' parent entry */
- if (sel.first == 0) {
- sel.first = 1;
- }
-
- /* fill selection between last and first selected file */
- filelist_entries_select_index_range_set(
- files, &sel, deselect ? FILE_SEL_REMOVE : FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
- /* entire sel is cleared here, so select active again */
- if (deselect) {
- filelist_entry_select_index_set(files, active, FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
- }
- }
- else {
- filelist_entry_select_index_set(
- files, active, deselect ? FILE_SEL_REMOVE : FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
- }
-
- BLI_assert(IN_RANGE(active, -1, numfiles));
- fileselect_file_set(sfile, params->active_file);
-
- /* ensure newly selected file is inside viewbounds */
- file_ensure_inside_viewbounds(CTX_wm_region(C), sfile, params->active_file);
-
- /* selection changed */
- return true;
+static bool file_walk_select_selection_set(bContext *C,
+ SpaceFile *sfile,
+ const int direction,
+ const int numfiles,
+ const int active_old,
+ const int active_new,
+ const int other_site,
+ const bool has_selection,
+ const bool extend,
+ const bool fill)
+{
+ FileSelectParams *params = sfile->params;
+ struct FileList *files = sfile->files;
+ const int last_sel = params->active_file; /* store old value */
+ int active = active_old; /* could use active_old instead, just for readability */
+ bool deselect = false;
+
+ BLI_assert(params);
+
+ if (has_selection) {
+ if (extend && filelist_entry_select_index_get(files, active_old, CHECK_ALL) &&
+ filelist_entry_select_index_get(files, active_new, CHECK_ALL)) {
+ /* conditions for deselecting: initial file is selected, new file is
+ * selected and either other_side isn't selected/found or we use fill */
+ deselect = (fill || other_site == -1 ||
+ !filelist_entry_select_index_get(files, other_site, CHECK_ALL));
+
+ /* don't change highlight_file here since we either want to deselect active or we want
+ * to walk through a block of selected files without selecting/deselecting anything */
+ params->active_file = active_new;
+ /* but we want to change active if we use fill
+ * (needed to get correct selection bounds) */
+ if (deselect && fill) {
+ active = active_new;
+ }
+ }
+ else {
+ /* regular selection change */
+ params->active_file = active = active_new;
+ }
+ }
+ else {
+ /* select last file */
+ if (ELEM(direction, FILE_SELECT_WALK_UP, FILE_SELECT_WALK_LEFT)) {
+ params->active_file = active = numfiles - 1;
+ }
+ /* select first file */
+ else if (ELEM(direction, FILE_SELECT_WALK_DOWN, FILE_SELECT_WALK_RIGHT)) {
+ params->active_file = active = extend ? 1 : 0;
+ }
+ else {
+ BLI_assert(0);
+ }
+ }
+
+ if (active < 0) {
+ return false;
+ }
+
+ if (extend) {
+ /* highlight the active walker file for extended selection for better visual feedback */
+ params->highlight_file = params->active_file;
+
+ /* unselect '..' parent entry - it's not supposed to be selected if more
+ * than one file is selected */
+ filelist_entry_select_index_set(files, 0, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
+ }
+ else {
+ /* deselect all first */
+ file_deselect_all(sfile, FILE_SEL_SELECTED);
+
+ /* highlight file under mouse pos */
+ params->highlight_file = -1;
+ WM_event_add_mousemove(C);
+ }
+
+ /* do the actual selection */
+ if (fill) {
+ FileSelection sel = {MIN2(active, last_sel), MAX2(active, last_sel)};
+
+ /* clamping selection to not include '..' parent entry */
+ if (sel.first == 0) {
+ sel.first = 1;
+ }
+
+ /* fill selection between last and first selected file */
+ filelist_entries_select_index_range_set(
+ files, &sel, deselect ? FILE_SEL_REMOVE : FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
+ /* entire sel is cleared here, so select active again */
+ if (deselect) {
+ filelist_entry_select_index_set(files, active, FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
+ }
+ }
+ else {
+ filelist_entry_select_index_set(
+ files, active, deselect ? FILE_SEL_REMOVE : FILE_SEL_ADD, FILE_SEL_SELECTED, CHECK_ALL);
+ }
+
+ BLI_assert(IN_RANGE(active, -1, numfiles));
+ fileselect_file_set(sfile, params->active_file);
+
+ /* ensure newly selected file is inside viewbounds */
+ file_ensure_inside_viewbounds(CTX_wm_region(C), sfile, params->active_file);
+
+ /* selection changed */
+ return true;
}
/**
* \returns true if selection has changed
*/
-static bool file_walk_select_do(
- bContext *C, SpaceFile *sfile,
- FileSelectParams *params, const int direction,
- const bool extend, const bool fill)
-{
- struct FileList *files = sfile->files;
- const int numfiles = filelist_files_ensure(files);
- const bool has_selection = file_is_any_selected(files);
- const int active_old = params->active_file;
- int active_new = -1;
- int other_site = -1; /* file on the other site of active_old */
-
-
- /* *** get all needed files for handling selection *** */
-
- if (has_selection) {
- ARegion *ar = CTX_wm_region(C);
- FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
- const int idx_shift = (layout->flag & FILE_LAYOUT_HOR) ? layout->rows : layout->columns;
-
- if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_UP) ||
- (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_LEFT))
- {
- active_new = active_old - 1;
- other_site = active_old + 1;
- }
- else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_DOWN) ||
- (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_RIGHT))
- {
- active_new = active_old + 1;
- other_site = active_old - 1;
- }
- else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_LEFT) ||
- (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_UP))
- {
- active_new = active_old - idx_shift;
- other_site = active_old + idx_shift;
- }
- else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_RIGHT) ||
- (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_DOWN))
- {
-
- active_new = active_old + idx_shift;
- other_site = active_old - idx_shift;
- }
- else {
- BLI_assert(0);
- }
-
- if (!IN_RANGE(active_new, 0, numfiles)) {
- if (extend) {
- /* extend to invalid file -> abort */
- return false;
- }
- /* if we don't extend, selecting '..' (index == 0) is allowed so
- * using key selection to go to parent directory is possible */
- else if (active_new != 0) {
- /* select initial file */
- active_new = active_old;
- }
- }
- if (!IN_RANGE(other_site, 0, numfiles)) {
- other_site = -1;
- }
- }
-
- return file_walk_select_selection_set(
- C, sfile, direction, numfiles, active_old, active_new, other_site, has_selection, extend, fill);
+static bool file_walk_select_do(bContext *C,
+ SpaceFile *sfile,
+ FileSelectParams *params,
+ const int direction,
+ const bool extend,
+ const bool fill)
+{
+ struct FileList *files = sfile->files;
+ const int numfiles = filelist_files_ensure(files);
+ const bool has_selection = file_is_any_selected(files);
+ const int active_old = params->active_file;
+ int active_new = -1;
+ int other_site = -1; /* file on the other site of active_old */
+
+ /* *** get all needed files for handling selection *** */
+
+ if (has_selection) {
+ ARegion *ar = CTX_wm_region(C);
+ FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
+ const int idx_shift = (layout->flag & FILE_LAYOUT_HOR) ? layout->rows : layout->columns;
+
+ if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_UP) ||
+ (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_LEFT)) {
+ active_new = active_old - 1;
+ other_site = active_old + 1;
+ }
+ else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_DOWN) ||
+ (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_RIGHT)) {
+ active_new = active_old + 1;
+ other_site = active_old - 1;
+ }
+ else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_LEFT) ||
+ (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_UP)) {
+ active_new = active_old - idx_shift;
+ other_site = active_old + idx_shift;
+ }
+ else if ((layout->flag & FILE_LAYOUT_HOR && direction == FILE_SELECT_WALK_RIGHT) ||
+ (layout->flag & FILE_LAYOUT_VER && direction == FILE_SELECT_WALK_DOWN)) {
+
+ active_new = active_old + idx_shift;
+ other_site = active_old - idx_shift;
+ }
+ else {
+ BLI_assert(0);
+ }
+
+ if (!IN_RANGE(active_new, 0, numfiles)) {
+ if (extend) {
+ /* extend to invalid file -> abort */
+ return false;
+ }
+ /* if we don't extend, selecting '..' (index == 0) is allowed so
+ * using key selection to go to parent directory is possible */
+ else if (active_new != 0) {
+ /* select initial file */
+ active_new = active_old;
+ }
+ }
+ if (!IN_RANGE(other_site, 0, numfiles)) {
+ other_site = -1;
+ }
+ }
+
+ return file_walk_select_selection_set(C,
+ sfile,
+ direction,
+ numfiles,
+ active_old,
+ active_new,
+ other_site,
+ has_selection,
+ extend,
+ fill);
}
static int file_walk_select_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
{
- SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
- FileSelectParams *params = sfile->params;
- const int direction = RNA_enum_get(op->ptr, "direction");
- const bool extend = RNA_boolean_get(op->ptr, "extend");
- const bool fill = RNA_boolean_get(op->ptr, "fill");
+ SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
+ FileSelectParams *params = sfile->params;
+ const int direction = RNA_enum_get(op->ptr, "direction");
+ const bool extend = RNA_boolean_get(op->ptr, "extend");
+ const bool fill = RNA_boolean_get(op->ptr, "fill");
- if (file_walk_select_do(C, sfile, params, direction, extend, fill)) {
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- return OPERATOR_FINISHED;
- }
+ if (file_walk_select_do(C, sfile, params, direction, extend, fill)) {
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void FILE_OT_select_walk(wmOperatorType *ot)
{
- static const EnumPropertyItem direction_items[] = {
- {FILE_SELECT_WALK_UP, "UP", 0, "Prev", ""},
- {FILE_SELECT_WALK_DOWN, "DOWN", 0, "Next", ""},
- {FILE_SELECT_WALK_LEFT, "LEFT", 0, "Left", ""},
- {FILE_SELECT_WALK_RIGHT, "RIGHT", 0, "Right", ""},
- {0, NULL, 0, NULL, NULL},
- };
- PropertyRNA *prop;
-
- /* identifiers */
- ot->name = "Walk Select/Deselect File";
- ot->description = "Select/Deselect files by walking through them";
- ot->idname = "FILE_OT_select_walk";
-
- /* api callbacks */
- ot->invoke = file_walk_select_invoke;
- ot->poll = ED_operator_file_active;
-
- /* properties */
- prop = RNA_def_enum(ot->srna, "direction", direction_items, 0, "Walk Direction",
- "Select/Deselect file in this direction");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- prop = RNA_def_boolean(ot->srna, "extend", false, "Extend",
- "Extend selection instead of deselecting everything first");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- prop = RNA_def_boolean(ot->srna, "fill", false, "Fill", "Select everything beginning with the last selection");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ static const EnumPropertyItem direction_items[] = {
+ {FILE_SELECT_WALK_UP, "UP", 0, "Prev", ""},
+ {FILE_SELECT_WALK_DOWN, "DOWN", 0, "Next", ""},
+ {FILE_SELECT_WALK_LEFT, "LEFT", 0, "Left", ""},
+ {FILE_SELECT_WALK_RIGHT, "RIGHT", 0, "Right", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+ PropertyRNA *prop;
+
+ /* identifiers */
+ ot->name = "Walk Select/Deselect File";
+ ot->description = "Select/Deselect files by walking through them";
+ ot->idname = "FILE_OT_select_walk";
+
+ /* api callbacks */
+ ot->invoke = file_walk_select_invoke;
+ ot->poll = ED_operator_file_active;
+
+ /* properties */
+ prop = RNA_def_enum(ot->srna,
+ "direction",
+ direction_items,
+ 0,
+ "Walk Direction",
+ "Select/Deselect file in this direction");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(ot->srna,
+ "extend",
+ false,
+ "Extend",
+ "Extend selection instead of deselecting everything first");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(
+ ot->srna, "fill", false, "Fill", "Select everything beginning with the last selection");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- FileSelection sel;
- const int numfiles = filelist_files_ensure(sfile->files);
- const bool has_selection = file_is_any_selected(sfile->files);
-
- sel.first = 0;
- sel.last = numfiles - 1;
-
- /* select all only if previously no file was selected */
- if (has_selection) {
- filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
- sfile->params->active_file = -1;
- }
- else {
- const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS : CHECK_FILES;
- int i;
-
- filelist_entries_select_index_range_set(sfile->files, &sel, FILE_SEL_ADD, FILE_SEL_SELECTED, check_type);
-
- /* set active_file to first selected */
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, check_type)) {
- sfile->params->active_file = i;
- break;
- }
- }
- }
-
- file_draw_check(C);
- WM_event_add_mousemove(C);
- ED_area_tag_redraw(sa);
-
- return OPERATOR_FINISHED;
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ FileSelection sel;
+ const int numfiles = filelist_files_ensure(sfile->files);
+ const bool has_selection = file_is_any_selected(sfile->files);
+
+ sel.first = 0;
+ sel.last = numfiles - 1;
+
+ /* select all only if previously no file was selected */
+ if (has_selection) {
+ filelist_entries_select_index_range_set(
+ sfile->files, &sel, FILE_SEL_REMOVE, FILE_SEL_SELECTED, CHECK_ALL);
+ sfile->params->active_file = -1;
+ }
+ else {
+ const FileCheckType check_type = (sfile->params->flag & FILE_DIRSEL_ONLY) ? CHECK_DIRS :
+ CHECK_FILES;
+ int i;
+
+ filelist_entries_select_index_range_set(
+ sfile->files, &sel, FILE_SEL_ADD, FILE_SEL_SELECTED, check_type);
+
+ /* set active_file to first selected */
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, check_type)) {
+ sfile->params->active_file = i;
+ break;
+ }
+ }
+ }
+
+ file_draw_check(C);
+ WM_event_add_mousemove(C);
+ ED_area_tag_redraw(sa);
+
+ return OPERATOR_FINISHED;
}
void FILE_OT_select_all(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "(De)select All Files";
- ot->description = "Select or deselect all files";
- ot->idname = "FILE_OT_select_all";
+ /* identifiers */
+ ot->name = "(De)select All Files";
+ ot->description = "Select or deselect all files";
+ ot->idname = "FILE_OT_select_all";
- /* api callbacks */
- ot->exec = file_select_all_exec;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->exec = file_select_all_exec;
+ ot->poll = ED_operator_file_active;
- /* properties */
+ /* properties */
}
/* ---------- BOOKMARKS ----------- */
@@ -828,487 +855,500 @@ void FILE_OT_select_all(wmOperatorType *ot)
* Does not hurt keeping it around for now. */
static int bookmark_select_exec(bContext *C, wmOperator *op)
{
- Main *bmain = CTX_data_main(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- PropertyRNA *prop;
+ Main *bmain = CTX_data_main(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ PropertyRNA *prop;
- if ((prop = RNA_struct_find_property(op->ptr, "dir"))) {
- char entry[256];
- FileSelectParams *params = sfile->params;
+ if ((prop = RNA_struct_find_property(op->ptr, "dir"))) {
+ char entry[256];
+ FileSelectParams *params = sfile->params;
- RNA_property_string_get(op->ptr, prop, entry);
- BLI_strncpy(params->dir, entry, sizeof(params->dir));
- BLI_cleanup_dir(BKE_main_blendfile_path(bmain), params->dir);
- ED_file_change_dir(C);
+ RNA_property_string_get(op->ptr, prop, entry);
+ BLI_strncpy(params->dir, entry, sizeof(params->dir));
+ BLI_cleanup_dir(BKE_main_blendfile_path(bmain), params->dir);
+ ED_file_change_dir(C);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ }
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_select_bookmark(wmOperatorType *ot)
{
- PropertyRNA *prop;
+ PropertyRNA *prop;
- /* identifiers */
- ot->name = "Select Directory";
- ot->description = "Select a bookmarked directory";
- ot->idname = "FILE_OT_select_bookmark";
+ /* identifiers */
+ ot->name = "Select Directory";
+ ot->description = "Select a bookmarked directory";
+ ot->idname = "FILE_OT_select_bookmark";
- /* api callbacks */
- ot->exec = bookmark_select_exec;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->exec = bookmark_select_exec;
+ ot->poll = ED_operator_file_active;
- /* properties */
- prop = RNA_def_string(ot->srna, "dir", NULL, FILE_MAXDIR, "Dir", "");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ /* properties */
+ prop = RNA_def_string(ot->srna, "dir", NULL, FILE_MAXDIR, "Dir", "");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
static int bookmark_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- struct FSMenu *fsmenu = ED_fsmenu_get();
- struct FileSelectParams *params = ED_fileselect_get_params(sfile);
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ struct FSMenu *fsmenu = ED_fsmenu_get();
+ struct FileSelectParams *params = ED_fileselect_get_params(sfile);
- if (params->dir[0] != '\0') {
- char name[FILE_MAX];
+ if (params->dir[0] != '\0') {
+ char name[FILE_MAX];
- fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir, NULL, FS_INSERT_SAVE);
- BLI_make_file_string("/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(fsmenu, name);
- }
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, params->dir, NULL, FS_INSERT_SAVE);
+ BLI_make_file_string(
+ "/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(fsmenu, name);
+ }
- ED_area_tag_refresh(sa);
- ED_area_tag_redraw(sa);
- return OPERATOR_FINISHED;
+ ED_area_tag_refresh(sa);
+ ED_area_tag_redraw(sa);
+ return OPERATOR_FINISHED;
}
void FILE_OT_bookmark_add(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Add Bookmark";
- ot->description = "Add a bookmark for the selected/active directory";
- ot->idname = "FILE_OT_bookmark_add";
+ /* identifiers */
+ ot->name = "Add Bookmark";
+ ot->description = "Add a bookmark for the selected/active directory";
+ ot->idname = "FILE_OT_bookmark_add";
- /* api callbacks */
- ot->exec = bookmark_add_exec;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->exec = bookmark_add_exec;
+ ot->poll = ED_operator_file_active;
}
static int bookmark_delete_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- struct FSMenu *fsmenu = ED_fsmenu_get();
- int nentries = ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
-
- PropertyRNA *prop = RNA_struct_find_property(op->ptr, "index");
-
- if (prop) {
- int index;
- if (RNA_property_is_set(op->ptr, prop)) {
- index = RNA_property_int_get(op->ptr, prop);
- }
- else { /* if index unset, use active bookmark... */
- index = sfile->bookmarknr;
- }
- if ((index > -1) && (index < nentries)) {
- char name[FILE_MAX];
-
- fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index);
- BLI_make_file_string("/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(fsmenu, name);
- ED_area_tag_refresh(sa);
- ED_area_tag_redraw(sa);
- }
- }
-
- return OPERATOR_FINISHED;
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ struct FSMenu *fsmenu = ED_fsmenu_get();
+ int nentries = ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
+
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "index");
+
+ if (prop) {
+ int index;
+ if (RNA_property_is_set(op->ptr, prop)) {
+ index = RNA_property_int_get(op->ptr, prop);
+ }
+ else { /* if index unset, use active bookmark... */
+ index = sfile->bookmarknr;
+ }
+ if ((index > -1) && (index < nentries)) {
+ char name[FILE_MAX];
+
+ fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index);
+ BLI_make_file_string("/",
+ name,
+ BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL),
+ BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(fsmenu, name);
+ ED_area_tag_refresh(sa);
+ ED_area_tag_redraw(sa);
+ }
+ }
+
+ return OPERATOR_FINISHED;
}
void FILE_OT_bookmark_delete(wmOperatorType *ot)
{
- PropertyRNA *prop;
+ PropertyRNA *prop;
- /* identifiers */
- ot->name = "Delete Bookmark";
- ot->description = "Delete selected bookmark";
- ot->idname = "FILE_OT_bookmark_delete";
+ /* identifiers */
+ ot->name = "Delete Bookmark";
+ ot->description = "Delete selected bookmark";
+ ot->idname = "FILE_OT_bookmark_delete";
- /* api callbacks */
- ot->exec = bookmark_delete_exec;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->exec = bookmark_delete_exec;
+ ot->poll = ED_operator_file_active;
- /* properties */
- prop = RNA_def_int(ot->srna, "index", -1, -1, 20000, "Index", "", -1, 20000);
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ /* properties */
+ prop = RNA_def_int(ot->srna, "index", -1, -1, 20000, "Index", "", -1, 20000);
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
static int bookmark_cleanup_exec(bContext *C, wmOperator *UNUSED(op))
{
- ScrArea *sa = CTX_wm_area(C);
- struct FSMenu *fsmenu = ED_fsmenu_get();
- struct FSMenuEntry *fsme_next, *fsme = ED_fsmenu_get_category(fsmenu, FS_CATEGORY_BOOKMARKS);
- int index;
- bool changed = false;
+ ScrArea *sa = CTX_wm_area(C);
+ struct FSMenu *fsmenu = ED_fsmenu_get();
+ struct FSMenuEntry *fsme_next, *fsme = ED_fsmenu_get_category(fsmenu, FS_CATEGORY_BOOKMARKS);
+ int index;
+ bool changed = false;
- for (index = 0; fsme; fsme = fsme_next) {
- fsme_next = fsme->next;
+ for (index = 0; fsme; fsme = fsme_next) {
+ fsme_next = fsme->next;
- if (!BLI_is_dir(fsme->path)) {
- fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index);
- changed = true;
- }
- else {
- index++;
- }
- }
+ if (!BLI_is_dir(fsme->path)) {
+ fsmenu_remove_entry(fsmenu, FS_CATEGORY_BOOKMARKS, index);
+ changed = true;
+ }
+ else {
+ index++;
+ }
+ }
- if (changed) {
- char name[FILE_MAX];
+ if (changed) {
+ char name[FILE_MAX];
- BLI_make_file_string("/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(fsmenu, name);
- fsmenu_refresh_bookmarks_status(fsmenu);
- ED_area_tag_refresh(sa);
- ED_area_tag_redraw(sa);
- }
+ BLI_make_file_string(
+ "/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(fsmenu, name);
+ fsmenu_refresh_bookmarks_status(fsmenu);
+ ED_area_tag_refresh(sa);
+ ED_area_tag_redraw(sa);
+ }
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_bookmark_cleanup(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Cleanup Bookmarks";
- ot->description = "Delete all invalid bookmarks";
- ot->idname = "FILE_OT_bookmark_cleanup";
+ /* identifiers */
+ ot->name = "Cleanup Bookmarks";
+ ot->description = "Delete all invalid bookmarks";
+ ot->idname = "FILE_OT_bookmark_cleanup";
- /* api callbacks */
- ot->exec = bookmark_cleanup_exec;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->exec = bookmark_cleanup_exec;
+ ot->poll = ED_operator_file_active;
- /* properties */
+ /* properties */
}
enum {
- FILE_BOOKMARK_MOVE_TOP = -2,
- FILE_BOOKMARK_MOVE_UP = -1,
- FILE_BOOKMARK_MOVE_DOWN = 1,
- FILE_BOOKMARK_MOVE_BOTTOM = 2,
+ FILE_BOOKMARK_MOVE_TOP = -2,
+ FILE_BOOKMARK_MOVE_UP = -1,
+ FILE_BOOKMARK_MOVE_DOWN = 1,
+ FILE_BOOKMARK_MOVE_BOTTOM = 2,
};
static int bookmark_move_exec(bContext *C, wmOperator *op)
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- struct FSMenu *fsmenu = ED_fsmenu_get();
- struct FSMenuEntry *fsmentry = ED_fsmenu_get_category(fsmenu, FS_CATEGORY_BOOKMARKS);
- const struct FSMenuEntry *fsmentry_org = fsmentry;
-
- char fname[FILE_MAX];
-
- const int direction = RNA_enum_get(op->ptr, "direction");
- const int totitems = ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
- const int act_index = sfile->bookmarknr;
- int new_index;
-
- if (totitems < 2) {
- return OPERATOR_CANCELLED;
- }
-
- switch (direction) {
- case FILE_BOOKMARK_MOVE_TOP:
- new_index = 0;
- break;
- case FILE_BOOKMARK_MOVE_BOTTOM:
- new_index = totitems - 1;
- break;
- case FILE_BOOKMARK_MOVE_UP:
- case FILE_BOOKMARK_MOVE_DOWN:
- default:
- new_index = (totitems + act_index + direction) % totitems;
- break;
- }
-
- if (new_index == act_index) {
- return OPERATOR_CANCELLED;
- }
-
- BLI_linklist_move_item((LinkNode **)&fsmentry, act_index, new_index);
- if (fsmentry != fsmentry_org) {
- ED_fsmenu_set_category(fsmenu, FS_CATEGORY_BOOKMARKS, fsmentry);
- }
-
- /* Need to update active bookmark number. */
- sfile->bookmarknr = new_index;
-
- BLI_make_file_string("/", fname, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(fsmenu, fname);
-
- ED_area_tag_redraw(sa);
- return OPERATOR_FINISHED;
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ struct FSMenu *fsmenu = ED_fsmenu_get();
+ struct FSMenuEntry *fsmentry = ED_fsmenu_get_category(fsmenu, FS_CATEGORY_BOOKMARKS);
+ const struct FSMenuEntry *fsmentry_org = fsmentry;
+
+ char fname[FILE_MAX];
+
+ const int direction = RNA_enum_get(op->ptr, "direction");
+ const int totitems = ED_fsmenu_get_nentries(fsmenu, FS_CATEGORY_BOOKMARKS);
+ const int act_index = sfile->bookmarknr;
+ int new_index;
+
+ if (totitems < 2) {
+ return OPERATOR_CANCELLED;
+ }
+
+ switch (direction) {
+ case FILE_BOOKMARK_MOVE_TOP:
+ new_index = 0;
+ break;
+ case FILE_BOOKMARK_MOVE_BOTTOM:
+ new_index = totitems - 1;
+ break;
+ case FILE_BOOKMARK_MOVE_UP:
+ case FILE_BOOKMARK_MOVE_DOWN:
+ default:
+ new_index = (totitems + act_index + direction) % totitems;
+ break;
+ }
+
+ if (new_index == act_index) {
+ return OPERATOR_CANCELLED;
+ }
+
+ BLI_linklist_move_item((LinkNode **)&fsmentry, act_index, new_index);
+ if (fsmentry != fsmentry_org) {
+ ED_fsmenu_set_category(fsmenu, FS_CATEGORY_BOOKMARKS, fsmentry);
+ }
+
+ /* Need to update active bookmark number. */
+ sfile->bookmarknr = new_index;
+
+ BLI_make_file_string(
+ "/", fname, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(fsmenu, fname);
+
+ ED_area_tag_redraw(sa);
+ return OPERATOR_FINISHED;
}
void FILE_OT_bookmark_move(wmOperatorType *ot)
{
- static const EnumPropertyItem slot_move[] = {
- {FILE_BOOKMARK_MOVE_TOP, "TOP", 0, "Top", "Top of the list"},
- {FILE_BOOKMARK_MOVE_UP, "UP", 0, "Up", ""},
- {FILE_BOOKMARK_MOVE_DOWN, "DOWN", 0, "Down", ""},
- {FILE_BOOKMARK_MOVE_BOTTOM, "BOTTOM", 0, "Bottom", "Bottom of the list"},
- { 0, NULL, 0, NULL, NULL }
- };
+ static const EnumPropertyItem slot_move[] = {
+ {FILE_BOOKMARK_MOVE_TOP, "TOP", 0, "Top", "Top of the list"},
+ {FILE_BOOKMARK_MOVE_UP, "UP", 0, "Up", ""},
+ {FILE_BOOKMARK_MOVE_DOWN, "DOWN", 0, "Down", ""},
+ {FILE_BOOKMARK_MOVE_BOTTOM, "BOTTOM", 0, "Bottom", "Bottom of the list"},
+ {0, NULL, 0, NULL, NULL}};
- /* identifiers */
- ot->name = "Move Bookmark";
- ot->idname = "FILE_OT_bookmark_move";
- ot->description = "Move the active bookmark up/down in the list";
+ /* identifiers */
+ ot->name = "Move Bookmark";
+ ot->idname = "FILE_OT_bookmark_move";
+ ot->description = "Move the active bookmark up/down in the list";
- /* api callbacks */
- ot->poll = ED_operator_file_active;
- ot->exec = bookmark_move_exec;
+ /* api callbacks */
+ ot->poll = ED_operator_file_active;
+ ot->exec = bookmark_move_exec;
- /* flags */
- ot->flag = OPTYPE_REGISTER; /* No undo! */
+ /* flags */
+ ot->flag = OPTYPE_REGISTER; /* No undo! */
- RNA_def_enum(ot->srna, "direction", slot_move, 0, "Direction",
- "Direction to move the active bookmark towards");
+ RNA_def_enum(ot->srna,
+ "direction",
+ slot_move,
+ 0,
+ "Direction",
+ "Direction to move the active bookmark towards");
}
static int reset_recent_exec(bContext *C, wmOperator *UNUSED(op))
{
- ScrArea *sa = CTX_wm_area(C);
- char name[FILE_MAX];
- struct FSMenu *fsmenu = ED_fsmenu_get();
+ ScrArea *sa = CTX_wm_area(C);
+ char name[FILE_MAX];
+ struct FSMenu *fsmenu = ED_fsmenu_get();
- while (ED_fsmenu_get_entry(fsmenu, FS_CATEGORY_RECENT, 0) != NULL) {
- fsmenu_remove_entry(fsmenu, FS_CATEGORY_RECENT, 0);
- }
- BLI_make_file_string("/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(fsmenu, name);
- ED_area_tag_redraw(sa);
+ while (ED_fsmenu_get_entry(fsmenu, FS_CATEGORY_RECENT, 0) != NULL) {
+ fsmenu_remove_entry(fsmenu, FS_CATEGORY_RECENT, 0);
+ }
+ BLI_make_file_string(
+ "/", name, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(fsmenu, name);
+ ED_area_tag_redraw(sa);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_reset_recent(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Reset Recent";
- ot->description = "Reset Recent files";
- ot->idname = "FILE_OT_reset_recent";
-
- /* api callbacks */
- ot->exec = reset_recent_exec;
- ot->poll = ED_operator_file_active;
+ /* identifiers */
+ ot->name = "Reset Recent";
+ ot->description = "Reset Recent files";
+ ot->idname = "FILE_OT_reset_recent";
+ /* api callbacks */
+ ot->exec = reset_recent_exec;
+ ot->poll = ED_operator_file_active;
}
int file_highlight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
{
- View2D *v2d = &ar->v2d;
- FileSelectParams *params;
- int numfiles, origfile;
+ View2D *v2d = &ar->v2d;
+ FileSelectParams *params;
+ int numfiles, origfile;
- if (sfile == NULL || sfile->files == NULL) return 0;
+ if (sfile == NULL || sfile->files == NULL)
+ return 0;
- numfiles = filelist_files_ensure(sfile->files);
- params = ED_fileselect_get_params(sfile);
+ numfiles = filelist_files_ensure(sfile->files);
+ params = ED_fileselect_get_params(sfile);
- origfile = params->highlight_file;
+ origfile = params->highlight_file;
- mx -= ar->winrct.xmin;
- my -= ar->winrct.ymin;
+ mx -= ar->winrct.xmin;
+ my -= ar->winrct.ymin;
- if (BLI_rcti_isect_pt(&ar->v2d.mask, mx, my)) {
- float fx, fy;
- int highlight_file;
+ if (BLI_rcti_isect_pt(&ar->v2d.mask, mx, my)) {
+ float fx, fy;
+ int highlight_file;
- UI_view2d_region_to_view(v2d, mx, my, &fx, &fy);
+ UI_view2d_region_to_view(v2d, mx, my, &fx, &fy);
- highlight_file = ED_fileselect_layout_offset(sfile->layout, (int)(v2d->tot.xmin + fx), (int)(v2d->tot.ymax - fy));
+ highlight_file = ED_fileselect_layout_offset(
+ sfile->layout, (int)(v2d->tot.xmin + fx), (int)(v2d->tot.ymax - fy));
- if ((highlight_file >= 0) && (highlight_file < numfiles))
- params->highlight_file = highlight_file;
- else
- params->highlight_file = -1;
- }
- else
- params->highlight_file = -1;
+ if ((highlight_file >= 0) && (highlight_file < numfiles))
+ params->highlight_file = highlight_file;
+ else
+ params->highlight_file = -1;
+ }
+ else
+ params->highlight_file = -1;
- return (params->highlight_file != origfile);
+ return (params->highlight_file != origfile);
}
static int file_highlight_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
- ARegion *ar = CTX_wm_region(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
+ ARegion *ar = CTX_wm_region(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- if (!file_highlight_set(sfile, ar, event->x, event->y))
- return OPERATOR_PASS_THROUGH;
+ if (!file_highlight_set(sfile, ar, event->x, event->y))
+ return OPERATOR_PASS_THROUGH;
- ED_area_tag_redraw(CTX_wm_area(C));
+ ED_area_tag_redraw(CTX_wm_area(C));
- return OPERATOR_PASS_THROUGH;
+ return OPERATOR_PASS_THROUGH;
}
void FILE_OT_highlight(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Highlight File";
- ot->description = "Highlight selected file(s)";
- ot->idname = "FILE_OT_highlight";
+ /* identifiers */
+ ot->name = "Highlight File";
+ ot->description = "Highlight selected file(s)";
+ ot->idname = "FILE_OT_highlight";
- /* api callbacks */
- ot->invoke = file_highlight_invoke;
- ot->poll = ED_operator_file_active;
+ /* api callbacks */
+ ot->invoke = file_highlight_invoke;
+ ot->poll = ED_operator_file_active;
}
int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
{
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- wmOperator *op = sfile->op;
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ wmOperator *op = sfile->op;
- sfile->op = NULL;
+ sfile->op = NULL;
- WM_event_fileselect_event(wm, op, EVT_FILESELECT_CANCEL);
+ WM_event_fileselect_event(wm, op, EVT_FILESELECT_CANCEL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
static bool file_operator_poll(bContext *C)
{
- bool poll = ED_operator_file_active(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
+ bool poll = ED_operator_file_active(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- if (!sfile || !sfile->op) poll = 0;
+ if (!sfile || !sfile->op)
+ poll = 0;
- return poll;
+ return poll;
}
void FILE_OT_cancel(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Cancel File Load";
- ot->description = "Cancel loading of selected file";
- ot->idname = "FILE_OT_cancel";
+ /* identifiers */
+ ot->name = "Cancel File Load";
+ ot->description = "Cancel loading of selected file";
+ ot->idname = "FILE_OT_cancel";
- /* api callbacks */
- ot->exec = file_cancel_exec;
- ot->poll = file_operator_poll;
+ /* api callbacks */
+ ot->exec = file_cancel_exec;
+ ot->poll = file_operator_poll;
}
-
void file_sfile_to_operator_ex(bContext *C, wmOperator *op, SpaceFile *sfile, char *filepath)
{
- Main *bmain = CTX_data_main(C);
- PropertyRNA *prop;
-
- /* XXX, not real length */
- BLI_join_dirfile(filepath, FILE_MAX, sfile->params->dir, sfile->params->file);
-
- if ((prop = RNA_struct_find_property(op->ptr, "relative_path"))) {
- if (RNA_property_boolean_get(op->ptr, prop)) {
- BLI_path_rel(filepath, BKE_main_blendfile_path(bmain));
- }
- }
-
- if ((prop = RNA_struct_find_property(op->ptr, "filename"))) {
- RNA_property_string_set(op->ptr, prop, sfile->params->file);
- }
- if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
- RNA_property_string_set(op->ptr, prop, sfile->params->dir);
- }
- if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) {
- RNA_property_string_set(op->ptr, prop, filepath);
- }
-
- /* some ops have multiple files to select */
- /* this is called on operators check() so clear collections first since
- * they may be already set. */
- {
- int i, numfiles = filelist_files_ensure(sfile->files);
-
- if ((prop = RNA_struct_find_property(op->ptr, "files"))) {
- PointerRNA itemptr;
- int num_files = 0;
- RNA_property_collection_clear(op->ptr, prop);
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
- FileDirEntry *file = filelist_file(sfile->files, i);
- RNA_property_collection_add(op->ptr, prop, &itemptr);
- RNA_string_set(&itemptr, "name", file->relpath);
- num_files++;
- }
- }
- /* make sure the file specified in the filename button is added even if no
- * files selected */
- if (0 == num_files) {
- RNA_property_collection_add(op->ptr, prop, &itemptr);
- RNA_string_set(&itemptr, "name", sfile->params->file);
- }
- }
-
- if ((prop = RNA_struct_find_property(op->ptr, "dirs"))) {
- PointerRNA itemptr;
- int num_dirs = 0;
- RNA_property_collection_clear(op->ptr, prop);
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_DIRS)) {
- FileDirEntry *file = filelist_file(sfile->files, i);
- RNA_property_collection_add(op->ptr, prop, &itemptr);
- RNA_string_set(&itemptr, "name", file->relpath);
- num_dirs++;
- }
- }
-
- /* make sure the directory specified in the button is added even if no
- * directory selected */
- if (0 == num_dirs) {
- RNA_property_collection_add(op->ptr, prop, &itemptr);
- RNA_string_set(&itemptr, "name", sfile->params->dir);
- }
- }
-
-
- }
+ Main *bmain = CTX_data_main(C);
+ PropertyRNA *prop;
+
+ /* XXX, not real length */
+ BLI_join_dirfile(filepath, FILE_MAX, sfile->params->dir, sfile->params->file);
+
+ if ((prop = RNA_struct_find_property(op->ptr, "relative_path"))) {
+ if (RNA_property_boolean_get(op->ptr, prop)) {
+ BLI_path_rel(filepath, BKE_main_blendfile_path(bmain));
+ }
+ }
+
+ if ((prop = RNA_struct_find_property(op->ptr, "filename"))) {
+ RNA_property_string_set(op->ptr, prop, sfile->params->file);
+ }
+ if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
+ RNA_property_string_set(op->ptr, prop, sfile->params->dir);
+ }
+ if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) {
+ RNA_property_string_set(op->ptr, prop, filepath);
+ }
+
+ /* some ops have multiple files to select */
+ /* this is called on operators check() so clear collections first since
+ * they may be already set. */
+ {
+ int i, numfiles = filelist_files_ensure(sfile->files);
+
+ if ((prop = RNA_struct_find_property(op->ptr, "files"))) {
+ PointerRNA itemptr;
+ int num_files = 0;
+ RNA_property_collection_clear(op->ptr, prop);
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
+ FileDirEntry *file = filelist_file(sfile->files, i);
+ RNA_property_collection_add(op->ptr, prop, &itemptr);
+ RNA_string_set(&itemptr, "name", file->relpath);
+ num_files++;
+ }
+ }
+ /* make sure the file specified in the filename button is added even if no
+ * files selected */
+ if (0 == num_files) {
+ RNA_property_collection_add(op->ptr, prop, &itemptr);
+ RNA_string_set(&itemptr, "name", sfile->params->file);
+ }
+ }
+
+ if ((prop = RNA_struct_find_property(op->ptr, "dirs"))) {
+ PointerRNA itemptr;
+ int num_dirs = 0;
+ RNA_property_collection_clear(op->ptr, prop);
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_DIRS)) {
+ FileDirEntry *file = filelist_file(sfile->files, i);
+ RNA_property_collection_add(op->ptr, prop, &itemptr);
+ RNA_string_set(&itemptr, "name", file->relpath);
+ num_dirs++;
+ }
+ }
+
+ /* make sure the directory specified in the button is added even if no
+ * directory selected */
+ if (0 == num_dirs) {
+ RNA_property_collection_add(op->ptr, prop, &itemptr);
+ RNA_string_set(&itemptr, "name", sfile->params->dir);
+ }
+ }
+ }
}
void file_sfile_to_operator(bContext *C, wmOperator *op, SpaceFile *sfile)
{
- char filepath[FILE_MAX];
+ char filepath[FILE_MAX];
- file_sfile_to_operator_ex(C, op, sfile, filepath);
+ file_sfile_to_operator_ex(C, op, sfile, filepath);
}
void file_operator_to_sfile(bContext *C, SpaceFile *sfile, wmOperator *op)
{
- Main *bmain = CTX_data_main(C);
- PropertyRNA *prop;
-
- /* If neither of the above are set, split the filepath back */
- if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) {
- char filepath[FILE_MAX];
- RNA_property_string_get(op->ptr, prop, filepath);
- BLI_split_dirfile(filepath, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file));
- }
- else {
- if ((prop = RNA_struct_find_property(op->ptr, "filename"))) {
- RNA_property_string_get(op->ptr, prop, sfile->params->file);
- }
- if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
- RNA_property_string_get(op->ptr, prop, sfile->params->dir);
- }
- }
-
- /* we could check for relative_path property which is used when converting
- * in the other direction but doesn't hurt to do this every time */
- BLI_path_abs(sfile->params->dir, BKE_main_blendfile_path(bmain));
-
- /* XXX, files and dirs updates missing, not really so important though */
+ Main *bmain = CTX_data_main(C);
+ PropertyRNA *prop;
+
+ /* If neither of the above are set, split the filepath back */
+ if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) {
+ char filepath[FILE_MAX];
+ RNA_property_string_get(op->ptr, prop, filepath);
+ BLI_split_dirfile(filepath,
+ sfile->params->dir,
+ sfile->params->file,
+ sizeof(sfile->params->dir),
+ sizeof(sfile->params->file));
+ }
+ else {
+ if ((prop = RNA_struct_find_property(op->ptr, "filename"))) {
+ RNA_property_string_get(op->ptr, prop, sfile->params->file);
+ }
+ if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
+ RNA_property_string_get(op->ptr, prop, sfile->params->dir);
+ }
+ }
+
+ /* we could check for relative_path property which is used when converting
+ * in the other direction but doesn't hurt to do this every time */
+ BLI_path_abs(sfile->params->dir, BKE_main_blendfile_path(bmain));
+
+ /* XXX, files and dirs updates missing, not really so important though */
}
/**
@@ -1316,433 +1356,439 @@ void file_operator_to_sfile(bContext *C, SpaceFile *sfile, wmOperator *op)
*/
void file_sfile_filepath_set(SpaceFile *sfile, const char *filepath)
{
- BLI_assert(BLI_exists(filepath));
-
- if (BLI_is_dir(filepath)) {
- BLI_strncpy(sfile->params->dir, filepath, sizeof(sfile->params->dir));
- }
- else {
- if ((sfile->params->flag & FILE_DIRSEL_ONLY) == 0) {
- BLI_split_dirfile(filepath, sfile->params->dir, sfile->params->file,
- sizeof(sfile->params->dir), sizeof(sfile->params->file));
- }
- else {
- BLI_split_dir_part(filepath, sfile->params->dir, sizeof(sfile->params->dir));
- }
- }
+ BLI_assert(BLI_exists(filepath));
+
+ if (BLI_is_dir(filepath)) {
+ BLI_strncpy(sfile->params->dir, filepath, sizeof(sfile->params->dir));
+ }
+ else {
+ if ((sfile->params->flag & FILE_DIRSEL_ONLY) == 0) {
+ BLI_split_dirfile(filepath,
+ sfile->params->dir,
+ sfile->params->file,
+ sizeof(sfile->params->dir),
+ sizeof(sfile->params->file));
+ }
+ else {
+ BLI_split_dir_part(filepath, sfile->params->dir, sizeof(sfile->params->dir));
+ }
+ }
}
void file_draw_check(bContext *C)
{
- SpaceFile *sfile = CTX_wm_space_file(C);
- wmOperator *op = sfile->op;
- if (op) { /* fail on reload */
- if (op->type->check) {
- file_sfile_to_operator(C, op, sfile);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ wmOperator *op = sfile->op;
+ if (op) { /* fail on reload */
+ if (op->type->check) {
+ file_sfile_to_operator(C, op, sfile);
- /* redraw */
- if (op->type->check(C, op)) {
- file_operator_to_sfile(C, sfile, op);
+ /* redraw */
+ if (op->type->check(C, op)) {
+ file_operator_to_sfile(C, sfile, op);
- /* redraw, else the changed settings wont get updated */
- ED_area_tag_redraw(CTX_wm_area(C));
- }
- }
- }
+ /* redraw, else the changed settings wont get updated */
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
+ }
+ }
}
/* for use with; UI_block_func_set */
void file_draw_check_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
- file_draw_check(C);
+ file_draw_check(C);
}
bool file_draw_check_exists(SpaceFile *sfile)
{
- if (sfile->op) { /* fails on reload */
- PropertyRNA *prop;
- if ((prop = RNA_struct_find_property(sfile->op->ptr, "check_existing"))) {
- if (RNA_property_boolean_get(sfile->op->ptr, prop)) {
- char filepath[FILE_MAX];
- BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file);
- if (BLI_is_file(filepath)) {
- return true;
- }
- }
- }
- }
+ if (sfile->op) { /* fails on reload */
+ PropertyRNA *prop;
+ if ((prop = RNA_struct_find_property(sfile->op->ptr, "check_existing"))) {
+ if (RNA_property_boolean_get(sfile->op->ptr, prop)) {
+ char filepath[FILE_MAX];
+ BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file);
+ if (BLI_is_file(filepath)) {
+ return true;
+ }
+ }
+ }
+ }
- return false;
+ return false;
}
int file_exec(bContext *C, wmOperator *exec_op)
{
- Main *bmain = CTX_data_main(C);
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- const struct FileDirEntry *file = filelist_file(sfile->files, sfile->params->active_file);
- char filepath[FILE_MAX];
-
- /* directory change */
- if (file && (file->typeflag & FILE_TYPE_DIR)) {
- if (!file->relpath) {
- return OPERATOR_CANCELLED;
- }
-
- if (FILENAME_IS_PARENT(file->relpath)) {
- BLI_parent_dir(sfile->params->dir);
- }
- else {
- BLI_cleanup_path(BKE_main_blendfile_path(bmain), sfile->params->dir);
- BLI_path_append(sfile->params->dir, sizeof(sfile->params->dir) - 1, file->relpath);
- BLI_add_slash(sfile->params->dir);
- }
-
- ED_file_change_dir(C);
- }
- /* opening file - sends events now, so things get handled on windowqueue level */
- else if (sfile->op) {
- wmOperator *op = sfile->op;
-
- /* when used as a macro, for doubleclick,
- * to prevent closing when doubleclicking on .. item */
- if (RNA_boolean_get(exec_op->ptr, "need_active")) {
- const int numfiles = filelist_files_ensure(sfile->files);
- int i, active = 0;
-
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_ALL)) {
- active = 1;
- break;
- }
- }
- if (active == 0)
- return OPERATOR_CANCELLED;
- }
-
- sfile->op = NULL;
-
- file_sfile_to_operator_ex(C, op, sfile, filepath);
-
- if (BLI_exists(sfile->params->dir)) {
- fsmenu_insert_entry(ED_fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir, NULL,
- FS_INSERT_SAVE | FS_INSERT_FIRST);
- }
-
- BLI_make_file_string(BKE_main_blendfile_path(bmain), filepath, BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL),
- BLENDER_BOOKMARK_FILE);
- fsmenu_write_file(ED_fsmenu_get(), filepath);
- WM_event_fileselect_event(wm, op, EVT_FILESELECT_EXEC);
-
- }
-
- return OPERATOR_FINISHED;
+ Main *bmain = CTX_data_main(C);
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ const struct FileDirEntry *file = filelist_file(sfile->files, sfile->params->active_file);
+ char filepath[FILE_MAX];
+
+ /* directory change */
+ if (file && (file->typeflag & FILE_TYPE_DIR)) {
+ if (!file->relpath) {
+ return OPERATOR_CANCELLED;
+ }
+
+ if (FILENAME_IS_PARENT(file->relpath)) {
+ BLI_parent_dir(sfile->params->dir);
+ }
+ else {
+ BLI_cleanup_path(BKE_main_blendfile_path(bmain), sfile->params->dir);
+ BLI_path_append(sfile->params->dir, sizeof(sfile->params->dir) - 1, file->relpath);
+ BLI_add_slash(sfile->params->dir);
+ }
+
+ ED_file_change_dir(C);
+ }
+ /* opening file - sends events now, so things get handled on windowqueue level */
+ else if (sfile->op) {
+ wmOperator *op = sfile->op;
+
+ /* when used as a macro, for doubleclick,
+ * to prevent closing when doubleclicking on .. item */
+ if (RNA_boolean_get(exec_op->ptr, "need_active")) {
+ const int numfiles = filelist_files_ensure(sfile->files);
+ int i, active = 0;
+
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_ALL)) {
+ active = 1;
+ break;
+ }
+ }
+ if (active == 0)
+ return OPERATOR_CANCELLED;
+ }
+
+ sfile->op = NULL;
+
+ file_sfile_to_operator_ex(C, op, sfile, filepath);
+
+ if (BLI_exists(sfile->params->dir)) {
+ fsmenu_insert_entry(ED_fsmenu_get(),
+ FS_CATEGORY_RECENT,
+ sfile->params->dir,
+ NULL,
+ FS_INSERT_SAVE | FS_INSERT_FIRST);
+ }
+
+ BLI_make_file_string(BKE_main_blendfile_path(bmain),
+ filepath,
+ BKE_appdir_folder_id_create(BLENDER_USER_CONFIG, NULL),
+ BLENDER_BOOKMARK_FILE);
+ fsmenu_write_file(ED_fsmenu_get(), filepath);
+ WM_event_fileselect_event(wm, op, EVT_FILESELECT_EXEC);
+ }
+
+ return OPERATOR_FINISHED;
}
void FILE_OT_execute(struct wmOperatorType *ot)
{
- PropertyRNA *prop;
+ PropertyRNA *prop;
- /* identifiers */
- ot->name = "Execute File Window";
- ot->description = "Execute selected file";
- ot->idname = "FILE_OT_execute";
+ /* identifiers */
+ ot->name = "Execute File Window";
+ ot->description = "Execute selected file";
+ ot->idname = "FILE_OT_execute";
- /* api callbacks */
- ot->exec = file_exec;
- ot->poll = file_operator_poll;
+ /* api callbacks */
+ ot->exec = file_exec;
+ ot->poll = file_operator_poll;
- /* properties */
- prop = RNA_def_boolean(ot->srna, "need_active", 0, "Need Active",
- "Only execute if there's an active selected file in the file list");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ /* properties */
+ prop = RNA_def_boolean(ot->srna,
+ "need_active",
+ 0,
+ "Need Active",
+ "Only execute if there's an active selected file in the file list");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-
int file_parent_exec(bContext *C, wmOperator *UNUSED(unused))
{
- Main *bmain = CTX_data_main(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
-
- if (sfile->params) {
- if (BLI_parent_dir(sfile->params->dir)) {
- BLI_cleanup_dir(BKE_main_blendfile_path(bmain), sfile->params->dir);
- ED_file_change_dir(C);
- if (sfile->params->recursion_level > 1) {
- /* Disable 'dirtree' recursion when going up in tree. */
- sfile->params->recursion_level = 0;
- filelist_setrecursion(sfile->files, sfile->params->recursion_level);
- }
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- }
- }
+ Main *bmain = CTX_data_main(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- return OPERATOR_FINISHED;
+ if (sfile->params) {
+ if (BLI_parent_dir(sfile->params->dir)) {
+ BLI_cleanup_dir(BKE_main_blendfile_path(bmain), sfile->params->dir);
+ ED_file_change_dir(C);
+ if (sfile->params->recursion_level > 1) {
+ /* Disable 'dirtree' recursion when going up in tree. */
+ sfile->params->recursion_level = 0;
+ filelist_setrecursion(sfile->files, sfile->params->recursion_level);
+ }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ }
+ }
+ return OPERATOR_FINISHED;
}
-
void FILE_OT_parent(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Parent File";
- ot->description = "Move to parent directory";
- ot->idname = "FILE_OT_parent";
+ /* identifiers */
+ ot->name = "Parent File";
+ ot->description = "Move to parent directory";
+ ot->idname = "FILE_OT_parent";
- /* api callbacks */
- ot->exec = file_parent_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_parent_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
-
static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused))
{
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- ScrArea *sa = CTX_wm_area(C);
- struct FSMenu *fsmenu = ED_fsmenu_get();
-
- ED_fileselect_clear(wm, sa, sfile);
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ScrArea *sa = CTX_wm_area(C);
+ struct FSMenu *fsmenu = ED_fsmenu_get();
- /* refresh system directory menu */
- fsmenu_refresh_system_category(fsmenu);
+ ED_fileselect_clear(wm, sa, sfile);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ /* refresh system directory menu */
+ fsmenu_refresh_system_category(fsmenu);
- return OPERATOR_FINISHED;
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ return OPERATOR_FINISHED;
}
void FILE_OT_previous(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Previous Folder";
- ot->description = "Move to previous folder";
- ot->idname = "FILE_OT_previous";
+ /* identifiers */
+ ot->name = "Previous Folder";
+ ot->description = "Move to previous folder";
+ ot->idname = "FILE_OT_previous";
- /* api callbacks */
- ot->exec = file_previous_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_previous_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
int file_previous_exec(bContext *C, wmOperator *UNUSED(unused))
{
- SpaceFile *sfile = CTX_wm_space_file(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- if (sfile->params) {
- if (!sfile->folders_next)
- sfile->folders_next = folderlist_new();
+ if (sfile->params) {
+ if (!sfile->folders_next)
+ sfile->folders_next = folderlist_new();
- folderlist_pushdir(sfile->folders_next, sfile->params->dir);
- folderlist_popdir(sfile->folders_prev, sfile->params->dir);
- folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+ folderlist_pushdir(sfile->folders_next, sfile->params->dir);
+ folderlist_popdir(sfile->folders_prev, sfile->params->dir);
+ folderlist_pushdir(sfile->folders_next, sfile->params->dir);
- ED_file_change_dir(C);
- }
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ ED_file_change_dir(C);
+ }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_next(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Next Folder";
- ot->description = "Move to next folder";
- ot->idname = "FILE_OT_next";
+ /* identifiers */
+ ot->name = "Next Folder";
+ ot->description = "Move to next folder";
+ ot->idname = "FILE_OT_next";
- /* api callbacks */
- ot->exec = file_next_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_next_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
int file_next_exec(bContext *C, wmOperator *UNUSED(unused))
{
- SpaceFile *sfile = CTX_wm_space_file(C);
- if (sfile->params) {
- if (!sfile->folders_next)
- sfile->folders_next = folderlist_new();
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ if (sfile->params) {
+ if (!sfile->folders_next)
+ sfile->folders_next = folderlist_new();
- folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
- folderlist_popdir(sfile->folders_next, sfile->params->dir);
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+ folderlist_popdir(sfile->folders_next, sfile->params->dir);
- // update folders_prev so we can check for it in folderlist_clear_next()
- folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
+ // update folders_prev so we can check for it in folderlist_clear_next()
+ folderlist_pushdir(sfile->folders_prev, sfile->params->dir);
- ED_file_change_dir(C);
- }
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ ED_file_change_dir(C);
+ }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
-
/* only meant for timer usage */
static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- ARegion *ar, *oldar = CTX_wm_region(C);
- int offset;
- int numfiles, numfiles_layout;
- int edit_idx = -1;
- int i;
-
- /* escape if not our timer */
- if (sfile->smoothscroll_timer == NULL || sfile->smoothscroll_timer != event->customdata)
- return OPERATOR_PASS_THROUGH;
-
- numfiles = filelist_files_ensure(sfile->files);
-
- /* Due to async nature of file listing, we may execute this code before `file_refresh()`
- * editing entry is available in our listing, so we also have to handle switching to rename mode here. */
- FileSelectParams *params = ED_fileselect_get_params(sfile);
- if ((params->rename_flag & (FILE_PARAMS_RENAME_PENDING | FILE_PARAMS_RENAME_POSTSCROLL_PENDING)) != 0) {
- file_params_renamefile_activate(sfile, params);
- }
-
- /* check if we are editing a name */
- for (i = 0; i < numfiles; ++i) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_ALL) & (FILE_SEL_EDITING | FILE_SEL_HIGHLIGHTED)) {
- edit_idx = i;
- break;
- }
- }
-
- /* if we are not editing, we are done */
- if (edit_idx == -1) {
- /* Do not invalidate timer if filerename is still pending, we might still be building the filelist
- * and yet have to find edited entry... */
- if (params->rename_flag == 0) {
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
- sfile->smoothscroll_timer = NULL;
- }
- return OPERATOR_PASS_THROUGH;
- }
-
- /* we need the correct area for scrolling */
- ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
- if (!ar || ar->regiontype != RGN_TYPE_WINDOW) {
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
- sfile->smoothscroll_timer = NULL;
- return OPERATOR_PASS_THROUGH;
- }
-
- offset = max_ii(0, ED_fileselect_layout_offset(sfile->layout, (int)ar->v2d.cur.xmin, (int)-ar->v2d.cur.ymax));
-
- /* scroll offset is the first file in the row/column we are editing in */
- if (sfile->scroll_offset == 0) {
- if (sfile->layout->flag & FILE_LAYOUT_HOR) {
- sfile->scroll_offset = (edit_idx / sfile->layout->rows) * sfile->layout->rows;
- if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->rows;
- }
- else {
- sfile->scroll_offset = (edit_idx / sfile->layout->columns) * sfile->layout->columns;
- if (sfile->scroll_offset <= offset) sfile->scroll_offset -= sfile->layout->columns;
- }
- }
-
- numfiles_layout = ED_fileselect_layout_numfiles(sfile->layout, ar);
- /* Using margins helps avoiding scrolling to stop when target item is barely visible on one side of the screen
- * (i.e. it centers a bit more the target). */
- int numfiles_layout_margin = max_ii(0, numfiles_layout / 3);
-
- /* check if we have reached our final scroll position */
- if ((sfile->scroll_offset >= offset + numfiles_layout_margin) &&
- (sfile->scroll_offset < offset + numfiles_layout - numfiles_layout_margin))
- {
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
- sfile->smoothscroll_timer = NULL;
- /* Postscroll (after rename has been validated by user) is done, rename process is totally finisehd, cleanup. */
- if ((params->rename_flag & FILE_PARAMS_RENAME_POSTSCROLL_ACTIVE) != 0) {
- params->renamefile[0] = '\0';
- params->rename_flag = 0;
- }
- return OPERATOR_FINISHED;
- }
-
- /* temporarily set context to the main window region,
- * so the scroll operators work */
- CTX_wm_region_set(C, ar);
-
- /* scroll one step in the desired direction */
- if (sfile->scroll_offset < offset) {
- if (sfile->layout->flag & FILE_LAYOUT_HOR) {
- WM_operator_name_call(C, "VIEW2D_OT_scroll_left", 0, NULL);
- }
- else {
- WM_operator_name_call(C, "VIEW2D_OT_scroll_up", 0, NULL);
- }
-
- }
- else {
- if (sfile->layout->flag & FILE_LAYOUT_HOR) {
- WM_operator_name_call(C, "VIEW2D_OT_scroll_right", 0, NULL);
- }
- else {
- WM_operator_name_call(C, "VIEW2D_OT_scroll_down", 0, NULL);
- }
- }
-
- ED_region_tag_redraw(ar);
-
- /* and restore context */
- CTX_wm_region_set(C, oldar);
-
- return OPERATOR_FINISHED;
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ARegion *ar, *oldar = CTX_wm_region(C);
+ int offset;
+ int numfiles, numfiles_layout;
+ int edit_idx = -1;
+ int i;
+
+ /* escape if not our timer */
+ if (sfile->smoothscroll_timer == NULL || sfile->smoothscroll_timer != event->customdata)
+ return OPERATOR_PASS_THROUGH;
+
+ numfiles = filelist_files_ensure(sfile->files);
+
+ /* Due to async nature of file listing, we may execute this code before `file_refresh()`
+ * editing entry is available in our listing, so we also have to handle switching to rename mode here. */
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ if ((params->rename_flag &
+ (FILE_PARAMS_RENAME_PENDING | FILE_PARAMS_RENAME_POSTSCROLL_PENDING)) != 0) {
+ file_params_renamefile_activate(sfile, params);
+ }
+
+ /* check if we are editing a name */
+ for (i = 0; i < numfiles; ++i) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_ALL) &
+ (FILE_SEL_EDITING | FILE_SEL_HIGHLIGHTED)) {
+ edit_idx = i;
+ break;
+ }
+ }
+
+ /* if we are not editing, we are done */
+ if (edit_idx == -1) {
+ /* Do not invalidate timer if filerename is still pending, we might still be building the filelist
+ * and yet have to find edited entry... */
+ if (params->rename_flag == 0) {
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
+ sfile->smoothscroll_timer = NULL;
+ }
+ return OPERATOR_PASS_THROUGH;
+ }
+
+ /* we need the correct area for scrolling */
+ ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+ if (!ar || ar->regiontype != RGN_TYPE_WINDOW) {
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
+ sfile->smoothscroll_timer = NULL;
+ return OPERATOR_PASS_THROUGH;
+ }
+
+ offset = max_ii(
+ 0,
+ ED_fileselect_layout_offset(sfile->layout, (int)ar->v2d.cur.xmin, (int)-ar->v2d.cur.ymax));
+
+ /* scroll offset is the first file in the row/column we are editing in */
+ if (sfile->scroll_offset == 0) {
+ if (sfile->layout->flag & FILE_LAYOUT_HOR) {
+ sfile->scroll_offset = (edit_idx / sfile->layout->rows) * sfile->layout->rows;
+ if (sfile->scroll_offset <= offset)
+ sfile->scroll_offset -= sfile->layout->rows;
+ }
+ else {
+ sfile->scroll_offset = (edit_idx / sfile->layout->columns) * sfile->layout->columns;
+ if (sfile->scroll_offset <= offset)
+ sfile->scroll_offset -= sfile->layout->columns;
+ }
+ }
+
+ numfiles_layout = ED_fileselect_layout_numfiles(sfile->layout, ar);
+ /* Using margins helps avoiding scrolling to stop when target item is barely visible on one side of the screen
+ * (i.e. it centers a bit more the target). */
+ int numfiles_layout_margin = max_ii(0, numfiles_layout / 3);
+
+ /* check if we have reached our final scroll position */
+ if ((sfile->scroll_offset >= offset + numfiles_layout_margin) &&
+ (sfile->scroll_offset < offset + numfiles_layout - numfiles_layout_margin)) {
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
+ sfile->smoothscroll_timer = NULL;
+ /* Postscroll (after rename has been validated by user) is done, rename process is totally finisehd, cleanup. */
+ if ((params->rename_flag & FILE_PARAMS_RENAME_POSTSCROLL_ACTIVE) != 0) {
+ params->renamefile[0] = '\0';
+ params->rename_flag = 0;
+ }
+ return OPERATOR_FINISHED;
+ }
+
+ /* temporarily set context to the main window region,
+ * so the scroll operators work */
+ CTX_wm_region_set(C, ar);
+
+ /* scroll one step in the desired direction */
+ if (sfile->scroll_offset < offset) {
+ if (sfile->layout->flag & FILE_LAYOUT_HOR) {
+ WM_operator_name_call(C, "VIEW2D_OT_scroll_left", 0, NULL);
+ }
+ else {
+ WM_operator_name_call(C, "VIEW2D_OT_scroll_up", 0, NULL);
+ }
+ }
+ else {
+ if (sfile->layout->flag & FILE_LAYOUT_HOR) {
+ WM_operator_name_call(C, "VIEW2D_OT_scroll_right", 0, NULL);
+ }
+ else {
+ WM_operator_name_call(C, "VIEW2D_OT_scroll_down", 0, NULL);
+ }
+ }
+
+ ED_region_tag_redraw(ar);
+
+ /* and restore context */
+ CTX_wm_region_set(C, oldar);
+
+ return OPERATOR_FINISHED;
}
-
void FILE_OT_smoothscroll(wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Smooth Scroll";
- ot->idname = "FILE_OT_smoothscroll";
- ot->description = "Smooth scroll to make editable file visible";
+ /* identifiers */
+ ot->name = "Smooth Scroll";
+ ot->idname = "FILE_OT_smoothscroll";
+ ot->description = "Smooth scroll to make editable file visible";
- /* api callbacks */
- ot->invoke = file_smoothscroll_invoke;
+ /* api callbacks */
+ ot->invoke = file_smoothscroll_invoke;
- ot->poll = ED_operator_file_active;
+ ot->poll = ED_operator_file_active;
}
-
static int filepath_drop_exec(bContext *C, wmOperator *op)
{
- SpaceFile *sfile = CTX_wm_space_file(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- if (sfile) {
- char filepath[FILE_MAX];
+ if (sfile) {
+ char filepath[FILE_MAX];
- RNA_string_get(op->ptr, "filepath", filepath);
- if (!BLI_exists(filepath)) {
- BKE_report(op->reports, RPT_ERROR, "File does not exist");
- return OPERATOR_CANCELLED;
- }
+ RNA_string_get(op->ptr, "filepath", filepath);
+ if (!BLI_exists(filepath)) {
+ BKE_report(op->reports, RPT_ERROR, "File does not exist");
+ return OPERATOR_CANCELLED;
+ }
- file_sfile_filepath_set(sfile, filepath);
+ file_sfile_filepath_set(sfile, filepath);
- if (sfile->op) {
- file_sfile_to_operator(C, sfile->op, sfile);
- file_draw_check(C);
- }
+ if (sfile->op) {
+ file_sfile_to_operator(C, sfile->op, sfile);
+ file_draw_check(C);
+ }
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- return OPERATOR_FINISHED;
- }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ return OPERATOR_FINISHED;
+ }
- return OPERATOR_CANCELLED;
+ return OPERATOR_CANCELLED;
}
void FILE_OT_filepath_drop(wmOperatorType *ot)
{
- ot->name = "File Selector Drop";
- ot->idname = "FILE_OT_filepath_drop";
+ ot->name = "File Selector Drop";
+ ot->idname = "FILE_OT_filepath_drop";
- ot->exec = filepath_drop_exec;
- ot->poll = WM_operator_winactive;
+ ot->exec = filepath_drop_exec;
+ ot->poll = WM_operator_winactive;
- RNA_def_string_file_path(ot->srna, "filepath", "Path", FILE_MAX, "", "");
+ RNA_def_string_file_path(ot->srna, "filepath", "Path", FILE_MAX, "", "");
}
/* create a new, non-existing folder name, returns 1 if successful, 0 if name couldn't be created.
@@ -1750,616 +1796,615 @@ void FILE_OT_filepath_drop(wmOperatorType *ot)
*/
static int new_folder_path(const char *parent, char *folder, char *name)
{
- int i = 1;
- int len = 0;
+ int i = 1;
+ int len = 0;
- BLI_strncpy(name, "New Folder", FILE_MAXFILE);
- BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
- /* check whether folder with the name already exists, in this case
- * add number to the name. Check length of generated name to avoid
- * crazy case of huge number of folders each named 'New Folder (x)' */
- while (BLI_exists(folder) && (len < FILE_MAXFILE)) {
- len = BLI_snprintf(name, FILE_MAXFILE, "New Folder(%d)", i);
- BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
- i++;
- }
+ BLI_strncpy(name, "New Folder", FILE_MAXFILE);
+ BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
+ /* check whether folder with the name already exists, in this case
+ * add number to the name. Check length of generated name to avoid
+ * crazy case of huge number of folders each named 'New Folder (x)' */
+ while (BLI_exists(folder) && (len < FILE_MAXFILE)) {
+ len = BLI_snprintf(name, FILE_MAXFILE, "New Folder(%d)", i);
+ BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
+ i++;
+ }
- return (len < FILE_MAXFILE);
+ return (len < FILE_MAXFILE);
}
int file_directory_new_exec(bContext *C, wmOperator *op)
{
- char name[FILE_MAXFILE];
- char path[FILE_MAX];
- bool generate_name = true;
- PropertyRNA *prop;
-
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- ScrArea *sa = CTX_wm_area(C);
-
- if (!sfile->params) {
- BKE_report(op->reports, RPT_WARNING, "No parent directory given");
- return OPERATOR_CANCELLED;
- }
-
- path[0] = '\0';
-
- if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
- RNA_property_string_get(op->ptr, prop, path);
- if (path[0] != '\0') {
- generate_name = false;
- }
- }
-
- if (generate_name) {
- /* create a new, non-existing folder name */
- if (!new_folder_path(sfile->params->dir, path, name)) {
- BKE_report(op->reports, RPT_ERROR, "Could not create new folder name");
- return OPERATOR_CANCELLED;
- }
- }
- else { /* We assume we are able to generate a valid name! */
- char org_path[FILE_MAX];
-
- BLI_strncpy(org_path, path, sizeof(org_path));
- if (BLI_path_make_safe(path)) {
- BKE_reportf(op->reports, RPT_WARNING, "'%s' given path is OS-invalid, creating '%s' path instead",
- org_path, path);
- }
- }
-
- /* create the file */
- errno = 0;
- if (!BLI_dir_create_recursive(path) ||
- /* Should no more be needed,
- * now that BLI_dir_create_recursive returns a success state - but kept just in case. */
- !BLI_exists(path))
- {
- BKE_reportf(op->reports, RPT_ERROR,
- "Could not create new folder: %s",
- errno ? strerror(errno) : "unknown error");
- return OPERATOR_CANCELLED;
- }
-
-
- /* now remember file to jump into editing */
- BLI_strncpy(sfile->params->renamefile, name, FILE_MAXFILE);
- sfile->params->rename_flag = FILE_PARAMS_RENAME_PENDING;
-
- /* set timer to smoothly view newly generated file */
- /* max 30 frs/sec */
- if (sfile->smoothscroll_timer != NULL) {
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
- }
- sfile->smoothscroll_timer = WM_event_add_timer(wm, CTX_wm_window(C), TIMER1, 1.0 / 1000.0);
- sfile->scroll_offset = 0;
-
- /* reload dir to make sure we're seeing what's in the directory */
- ED_fileselect_clear(wm, sa, sfile);
-
- if (RNA_boolean_get(op->ptr, "open")) {
- BLI_strncpy(sfile->params->dir, path, sizeof(sfile->params->dir));
- ED_file_change_dir(C);
- }
-
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
-
- return OPERATOR_FINISHED;
+ char name[FILE_MAXFILE];
+ char path[FILE_MAX];
+ bool generate_name = true;
+ PropertyRNA *prop;
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ScrArea *sa = CTX_wm_area(C);
+
+ if (!sfile->params) {
+ BKE_report(op->reports, RPT_WARNING, "No parent directory given");
+ return OPERATOR_CANCELLED;
+ }
+
+ path[0] = '\0';
+
+ if ((prop = RNA_struct_find_property(op->ptr, "directory"))) {
+ RNA_property_string_get(op->ptr, prop, path);
+ if (path[0] != '\0') {
+ generate_name = false;
+ }
+ }
+
+ if (generate_name) {
+ /* create a new, non-existing folder name */
+ if (!new_folder_path(sfile->params->dir, path, name)) {
+ BKE_report(op->reports, RPT_ERROR, "Could not create new folder name");
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else { /* We assume we are able to generate a valid name! */
+ char org_path[FILE_MAX];
+
+ BLI_strncpy(org_path, path, sizeof(org_path));
+ if (BLI_path_make_safe(path)) {
+ BKE_reportf(op->reports,
+ RPT_WARNING,
+ "'%s' given path is OS-invalid, creating '%s' path instead",
+ org_path,
+ path);
+ }
+ }
+
+ /* create the file */
+ errno = 0;
+ if (!BLI_dir_create_recursive(path) ||
+ /* Should no more be needed,
+ * now that BLI_dir_create_recursive returns a success state - but kept just in case. */
+ !BLI_exists(path)) {
+ BKE_reportf(op->reports,
+ RPT_ERROR,
+ "Could not create new folder: %s",
+ errno ? strerror(errno) : "unknown error");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* now remember file to jump into editing */
+ BLI_strncpy(sfile->params->renamefile, name, FILE_MAXFILE);
+ sfile->params->rename_flag = FILE_PARAMS_RENAME_PENDING;
+
+ /* set timer to smoothly view newly generated file */
+ /* max 30 frs/sec */
+ if (sfile->smoothscroll_timer != NULL) {
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), sfile->smoothscroll_timer);
+ }
+ sfile->smoothscroll_timer = WM_event_add_timer(wm, CTX_wm_window(C), TIMER1, 1.0 / 1000.0);
+ sfile->scroll_offset = 0;
+
+ /* reload dir to make sure we're seeing what's in the directory */
+ ED_fileselect_clear(wm, sa, sfile);
+
+ if (RNA_boolean_get(op->ptr, "open")) {
+ BLI_strncpy(sfile->params->dir, path, sizeof(sfile->params->dir));
+ ED_file_change_dir(C);
+ }
+
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
}
-
void FILE_OT_directory_new(struct wmOperatorType *ot)
{
- PropertyRNA *prop;
+ PropertyRNA *prop;
- /* identifiers */
- ot->name = "Create New Directory";
- ot->description = "Create a new directory";
- ot->idname = "FILE_OT_directory_new";
+ /* identifiers */
+ ot->name = "Create New Directory";
+ ot->description = "Create a new directory";
+ ot->idname = "FILE_OT_directory_new";
- /* api callbacks */
- ot->invoke = WM_operator_confirm;
- ot->exec = file_directory_new_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->invoke = WM_operator_confirm;
+ ot->exec = file_directory_new_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
- prop = RNA_def_string_dir_path(ot->srna, "directory", NULL, FILE_MAX, "Directory", "Name of new directory");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- prop = RNA_def_boolean(ot->srna, "open", false, "Open", "Open new directory");
- RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_string_dir_path(
+ ot->srna, "directory", NULL, FILE_MAX, "Directory", "Name of new directory");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+ prop = RNA_def_boolean(ot->srna, "open", false, "Open", "Open new directory");
+ RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
-
/* TODO This should go to BLI_path_utils. */
static void file_expand_directory(bContext *C)
{
- Main *bmain = CTX_data_main(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
-
- if (sfile->params) {
- if (BLI_path_is_rel(sfile->params->dir)) {
- /* Use of 'default' folder here is just to avoid an error message on '//' prefix. */
- BLI_path_abs(sfile->params->dir, G.relbase_valid ? BKE_main_blendfile_path(bmain) : BKE_appdir_folder_default());
- }
- else if (sfile->params->dir[0] == '~') {
- char tmpstr[sizeof(sfile->params->dir) - 1];
- BLI_strncpy(tmpstr, sfile->params->dir + 1, sizeof(tmpstr));
- BLI_join_dirfile(sfile->params->dir, sizeof(sfile->params->dir), BKE_appdir_folder_default(), tmpstr);
- }
-
- else if (sfile->params->dir[0] == '\0')
+ Main *bmain = CTX_data_main(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+
+ if (sfile->params) {
+ if (BLI_path_is_rel(sfile->params->dir)) {
+ /* Use of 'default' folder here is just to avoid an error message on '//' prefix. */
+ BLI_path_abs(sfile->params->dir,
+ G.relbase_valid ? BKE_main_blendfile_path(bmain) : BKE_appdir_folder_default());
+ }
+ else if (sfile->params->dir[0] == '~') {
+ char tmpstr[sizeof(sfile->params->dir) - 1];
+ BLI_strncpy(tmpstr, sfile->params->dir + 1, sizeof(tmpstr));
+ BLI_join_dirfile(
+ sfile->params->dir, sizeof(sfile->params->dir), BKE_appdir_folder_default(), tmpstr);
+ }
+
+ else if (sfile->params->dir[0] == '\0')
#ifndef WIN32
- {
- sfile->params->dir[0] = '/';
- sfile->params->dir[1] = '\0';
- }
+ {
+ sfile->params->dir[0] = '/';
+ sfile->params->dir[1] = '\0';
+ }
#else
- {
- get_default_root(sfile->params->dir);
- }
- /* change "C:" --> "C:\", [#28102] */
- else if ((isalpha(sfile->params->dir[0]) &&
- (sfile->params->dir[1] == ':')) &&
- (sfile->params->dir[2] == '\0'))
- {
- sfile->params->dir[2] = '\\';
- sfile->params->dir[3] = '\0';
- }
- else if (BLI_path_is_unc(sfile->params->dir)) {
- BLI_cleanup_unc(sfile->params->dir, FILE_MAX_LIBEXTRA);
- }
+ {
+ get_default_root(sfile->params->dir);
+ }
+ /* change "C:" --> "C:\", [#28102] */
+ else if ((isalpha(sfile->params->dir[0]) && (sfile->params->dir[1] == ':')) &&
+ (sfile->params->dir[2] == '\0')) {
+ sfile->params->dir[2] = '\\';
+ sfile->params->dir[3] = '\0';
+ }
+ else if (BLI_path_is_unc(sfile->params->dir)) {
+ BLI_cleanup_unc(sfile->params->dir, FILE_MAX_LIBEXTRA);
+ }
#endif
- }
+ }
}
/* TODO check we still need this, it's annoying to have OS-specific code here... :/ */
#if defined(WIN32)
static bool can_create_dir(const char *dir)
{
- /* for UNC paths we need to check whether the parent of the new
- * directory is a proper directory itself and not a share or the
- * UNC root (server name) itself. Calling BLI_is_dir does this
- */
- if (BLI_path_is_unc(dir)) {
- char parent[PATH_MAX];
- BLI_strncpy(parent, dir, PATH_MAX);
- BLI_parent_dir(parent);
- return BLI_is_dir(parent);
- }
- return true;
+ /* for UNC paths we need to check whether the parent of the new
+ * directory is a proper directory itself and not a share or the
+ * UNC root (server name) itself. Calling BLI_is_dir does this
+ */
+ if (BLI_path_is_unc(dir)) {
+ char parent[PATH_MAX];
+ BLI_strncpy(parent, dir, PATH_MAX);
+ BLI_parent_dir(parent);
+ return BLI_is_dir(parent);
+ }
+ return true;
}
#endif
void file_directory_enter_handle(bContext *C, void *UNUSED(arg_unused), void *UNUSED(arg_but))
{
- Main *bmain = CTX_data_main(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
-
- if (sfile->params) {
- file_expand_directory(C);
-
- /* special case, user may have pasted a filepath into the directory */
- if (!filelist_is_dir(sfile->files, sfile->params->dir)) {
- char tdir[FILE_MAX_LIBEXTRA];
- char *group, *name;
-
- if (BLI_is_file(sfile->params->dir)) {
- char path[sizeof(sfile->params->dir)];
- BLI_strncpy(path, sfile->params->dir, sizeof(path));
- BLI_split_dirfile(path, sfile->params->dir, sfile->params->file,
- sizeof(sfile->params->dir), sizeof(sfile->params->file));
- }
- else if (BLO_library_path_explode(sfile->params->dir, tdir, &group, &name)) {
- if (group) {
- BLI_path_append(tdir, sizeof(tdir), group);
- }
- BLI_strncpy(sfile->params->dir, tdir, sizeof(sfile->params->dir));
- if (name) {
- BLI_strncpy(sfile->params->file, name, sizeof(sfile->params->file));
- }
- else {
- sfile->params->file[0] = '\0';
- }
- }
- }
-
- BLI_cleanup_dir(BKE_main_blendfile_path(bmain), sfile->params->dir);
-
- if (filelist_is_dir(sfile->files, sfile->params->dir)) {
- /* if directory exists, enter it immediately */
- ED_file_change_dir(C);
-
- /* don't do for now because it selects entire text instead of
- * placing cursor at the end */
- /* UI_textbutton_activate_but(C, but); */
- }
+ Main *bmain = CTX_data_main(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+
+ if (sfile->params) {
+ file_expand_directory(C);
+
+ /* special case, user may have pasted a filepath into the directory */
+ if (!filelist_is_dir(sfile->files, sfile->params->dir)) {
+ char tdir[FILE_MAX_LIBEXTRA];
+ char *group, *name;
+
+ if (BLI_is_file(sfile->params->dir)) {
+ char path[sizeof(sfile->params->dir)];
+ BLI_strncpy(path, sfile->params->dir, sizeof(path));
+ BLI_split_dirfile(path,
+ sfile->params->dir,
+ sfile->params->file,
+ sizeof(sfile->params->dir),
+ sizeof(sfile->params->file));
+ }
+ else if (BLO_library_path_explode(sfile->params->dir, tdir, &group, &name)) {
+ if (group) {
+ BLI_path_append(tdir, sizeof(tdir), group);
+ }
+ BLI_strncpy(sfile->params->dir, tdir, sizeof(sfile->params->dir));
+ if (name) {
+ BLI_strncpy(sfile->params->file, name, sizeof(sfile->params->file));
+ }
+ else {
+ sfile->params->file[0] = '\0';
+ }
+ }
+ }
+
+ BLI_cleanup_dir(BKE_main_blendfile_path(bmain), sfile->params->dir);
+
+ if (filelist_is_dir(sfile->files, sfile->params->dir)) {
+ /* if directory exists, enter it immediately */
+ ED_file_change_dir(C);
+
+ /* don't do for now because it selects entire text instead of
+ * placing cursor at the end */
+ /* UI_textbutton_activate_but(C, but); */
+ }
#if defined(WIN32)
- else if (!can_create_dir(sfile->params->dir)) {
- const char *lastdir = folderlist_peeklastdir(sfile->folders_prev);
- if (lastdir)
- BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
- }
+ else if (!can_create_dir(sfile->params->dir)) {
+ const char *lastdir = folderlist_peeklastdir(sfile->folders_prev);
+ if (lastdir)
+ BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
+ }
#endif
- else {
- const char *lastdir = folderlist_peeklastdir(sfile->folders_prev);
- char tdir[FILE_MAX_LIBEXTRA];
-
- /* If we are 'inside' a blend library, we cannot do anything... */
- if (lastdir && BLO_library_path_explode(lastdir, tdir, NULL, NULL)) {
- BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
- }
- else {
- /* if not, ask to create it and enter if confirmed */
- wmOperatorType *ot = WM_operatortype_find("FILE_OT_directory_new", false);
- PointerRNA ptr;
- WM_operator_properties_create_ptr(&ptr, ot);
- RNA_string_set(&ptr, "directory", sfile->params->dir);
- RNA_boolean_set(&ptr, "open", true);
-
- if (lastdir)
- BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
-
- WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
- WM_operator_properties_free(&ptr);
- }
- }
-
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- }
+ else {
+ const char *lastdir = folderlist_peeklastdir(sfile->folders_prev);
+ char tdir[FILE_MAX_LIBEXTRA];
+
+ /* If we are 'inside' a blend library, we cannot do anything... */
+ if (lastdir && BLO_library_path_explode(lastdir, tdir, NULL, NULL)) {
+ BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
+ }
+ else {
+ /* if not, ask to create it and enter if confirmed */
+ wmOperatorType *ot = WM_operatortype_find("FILE_OT_directory_new", false);
+ PointerRNA ptr;
+ WM_operator_properties_create_ptr(&ptr, ot);
+ RNA_string_set(&ptr, "directory", sfile->params->dir);
+ RNA_boolean_set(&ptr, "open", true);
+
+ if (lastdir)
+ BLI_strncpy(sfile->params->dir, lastdir, sizeof(sfile->params->dir));
+
+ WM_operator_name_call_ptr(C, ot, WM_OP_INVOKE_DEFAULT, &ptr);
+ WM_operator_properties_free(&ptr);
+ }
+ }
+
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ }
}
void file_filename_enter_handle(bContext *C, void *UNUSED(arg_unused), void *arg_but)
{
- Main *bmain = CTX_data_main(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- uiBut *but = arg_but;
- char matched_file[FILE_MAX];
- char filepath[sizeof(sfile->params->dir)];
+ Main *bmain = CTX_data_main(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ uiBut *but = arg_but;
+ char matched_file[FILE_MAX];
+ char filepath[sizeof(sfile->params->dir)];
- if (sfile->params) {
- int matches;
- matched_file[0] = '\0';
- filepath[0] = '\0';
+ if (sfile->params) {
+ int matches;
+ matched_file[0] = '\0';
+ filepath[0] = '\0';
- file_expand_directory(C);
+ file_expand_directory(C);
- matches = file_select_match(sfile, sfile->params->file, matched_file);
+ matches = file_select_match(sfile, sfile->params->file, matched_file);
- /* *After* file_select_match! */
- BLI_filename_make_safe(sfile->params->file);
+ /* *After* file_select_match! */
+ BLI_filename_make_safe(sfile->params->file);
- if (matches) {
- /* replace the pattern (or filename that the user typed in,
- * with the first selected file of the match */
- BLI_strncpy(sfile->params->file, matched_file, sizeof(sfile->params->file));
+ if (matches) {
+ /* replace the pattern (or filename that the user typed in,
+ * with the first selected file of the match */
+ BLI_strncpy(sfile->params->file, matched_file, sizeof(sfile->params->file));
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- }
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ }
- if (matches == 1) {
- BLI_join_dirfile(filepath, sizeof(sfile->params->dir), sfile->params->dir, sfile->params->file);
+ if (matches == 1) {
+ BLI_join_dirfile(
+ filepath, sizeof(sfile->params->dir), sfile->params->dir, sfile->params->file);
- /* if directory, open it and empty filename field */
- if (filelist_is_dir(sfile->files, filepath)) {
- BLI_cleanup_dir(BKE_main_blendfile_path(bmain), filepath);
- BLI_strncpy(sfile->params->dir, filepath, sizeof(sfile->params->dir));
- sfile->params->file[0] = '\0';
- ED_file_change_dir(C);
- UI_textbutton_activate_but(C, but);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
- }
- }
- else if (matches > 1) {
- file_draw_check(C);
- }
- }
+ /* if directory, open it and empty filename field */
+ if (filelist_is_dir(sfile->files, filepath)) {
+ BLI_cleanup_dir(BKE_main_blendfile_path(bmain), filepath);
+ BLI_strncpy(sfile->params->dir, filepath, sizeof(sfile->params->dir));
+ sfile->params->file[0] = '\0';
+ ED_file_change_dir(C);
+ UI_textbutton_activate_but(C, but);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+ }
+ }
+ else if (matches > 1) {
+ file_draw_check(C);
+ }
+ }
}
void FILE_OT_refresh(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Refresh Filelist";
- ot->description = "Refresh the file list";
- ot->idname = "FILE_OT_refresh";
+ /* identifiers */
+ ot->name = "Refresh Filelist";
+ ot->description = "Refresh the file list";
+ ot->idname = "FILE_OT_refresh";
- /* api callbacks */
- ot->exec = file_refresh_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_refresh_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
static int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused))
{
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- ScrArea *sa = CTX_wm_area(C);
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ScrArea *sa = CTX_wm_area(C);
- if (sfile->params) {
- sfile->params->flag ^= FILE_HIDE_DOT;
- ED_fileselect_clear(wm, sa, sfile);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
- }
+ if (sfile->params) {
+ sfile->params->flag ^= FILE_HIDE_DOT;
+ ED_fileselect_clear(wm, sa, sfile);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+ }
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
-
void FILE_OT_hidedot(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Toggle Hide Dot Files";
- ot->description = "Toggle hide hidden dot files";
- ot->idname = "FILE_OT_hidedot";
+ /* identifiers */
+ ot->name = "Toggle Hide Dot Files";
+ ot->description = "Toggle hide hidden dot files";
+ ot->idname = "FILE_OT_hidedot";
- /* api callbacks */
- ot->exec = file_hidedot_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_hidedot_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
ARegion *file_tools_region(ScrArea *sa)
{
- ARegion *ar, *arnew;
+ ARegion *ar, *arnew;
- if ((ar = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS)) != NULL)
- return ar;
+ if ((ar = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS)) != NULL)
+ return ar;
- /* add subdiv level; after header */
- ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
+ /* add subdiv level; after header */
+ ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
- /* is error! */
- if (ar == NULL)
- return NULL;
+ /* is error! */
+ if (ar == NULL)
+ return NULL;
- arnew = MEM_callocN(sizeof(ARegion), "tools for file");
- BLI_insertlinkafter(&sa->regionbase, ar, arnew);
- arnew->regiontype = RGN_TYPE_TOOLS;
- arnew->alignment = RGN_ALIGN_LEFT;
+ arnew = MEM_callocN(sizeof(ARegion), "tools for file");
+ BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+ arnew->regiontype = RGN_TYPE_TOOLS;
+ arnew->alignment = RGN_ALIGN_LEFT;
- ar = MEM_callocN(sizeof(ARegion), "tool props for file");
- BLI_insertlinkafter(&sa->regionbase, arnew, ar);
- ar->regiontype = RGN_TYPE_TOOL_PROPS;
- ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
+ ar = MEM_callocN(sizeof(ARegion), "tool props for file");
+ BLI_insertlinkafter(&sa->regionbase, arnew, ar);
+ ar->regiontype = RGN_TYPE_TOOL_PROPS;
+ ar->alignment = RGN_ALIGN_BOTTOM | RGN_SPLIT_PREV;
- return arnew;
+ return arnew;
}
static int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused))
{
- ScrArea *sa = CTX_wm_area(C);
- ARegion *ar = file_tools_region(sa);
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = file_tools_region(sa);
- if (ar)
- ED_region_toggle_hidden(C, ar);
+ if (ar)
+ ED_region_toggle_hidden(C, ar);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
}
void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Toggle Bookmarks";
- ot->description = "Toggle bookmarks display";
- ot->idname = "FILE_OT_bookmark_toggle";
+ /* identifiers */
+ ot->name = "Toggle Bookmarks";
+ ot->description = "Toggle bookmarks display";
+ 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 */
+ /* api callbacks */
+ ot->exec = file_bookmark_toggle_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
}
-
/**
* Looks for a string of digits within name (using BLI_stringdec) and adjusts it by add.
*/
static void filenum_newname(char *name, size_t name_size, int add)
{
- char head[FILE_MAXFILE], tail[FILE_MAXFILE];
- char name_temp[FILE_MAXFILE];
- int pic;
- unsigned short digits;
+ char head[FILE_MAXFILE], tail[FILE_MAXFILE];
+ char name_temp[FILE_MAXFILE];
+ int pic;
+ unsigned short digits;
- pic = BLI_stringdec(name, head, tail, &digits);
+ pic = BLI_stringdec(name, head, tail, &digits);
- /* are we going from 100 -> 99 or from 10 -> 9 */
- if (add < 0 && digits > 0) {
- int i, exp;
- exp = 1;
- for (i = digits; i > 1; i--) {
- exp *= 10;
- }
- if (pic >= exp && (pic + add) < exp) {
- digits--;
- }
- }
+ /* are we going from 100 -> 99 or from 10 -> 9 */
+ if (add < 0 && digits > 0) {
+ int i, exp;
+ exp = 1;
+ for (i = digits; i > 1; i--) {
+ exp *= 10;
+ }
+ if (pic >= exp && (pic + add) < exp) {
+ digits--;
+ }
+ }
- pic += add;
- if (pic < 0)
- pic = 0;
- BLI_stringenc(name_temp, head, tail, digits, pic);
- BLI_strncpy(name, name_temp, name_size);
+ pic += add;
+ if (pic < 0)
+ pic = 0;
+ BLI_stringenc(name_temp, head, tail, digits, pic);
+ BLI_strncpy(name, name_temp, name_size);
}
static int file_filenum_exec(bContext *C, wmOperator *op)
{
- SpaceFile *sfile = CTX_wm_space_file(C);
- ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ScrArea *sa = CTX_wm_area(C);
- int inc = RNA_int_get(op->ptr, "increment");
- if (sfile->params && (inc != 0)) {
- filenum_newname(sfile->params->file, sizeof(sfile->params->file), inc);
- ED_area_tag_redraw(sa);
- file_draw_check(C);
- // WM_event_add_notifier(C, NC_WINDOW, NULL);
- }
-
- return OPERATOR_FINISHED;
+ int inc = RNA_int_get(op->ptr, "increment");
+ if (sfile->params && (inc != 0)) {
+ filenum_newname(sfile->params->file, sizeof(sfile->params->file), inc);
+ ED_area_tag_redraw(sa);
+ file_draw_check(C);
+ // WM_event_add_notifier(C, NC_WINDOW, NULL);
+ }
+ return OPERATOR_FINISHED;
}
void FILE_OT_filenum(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Increment Number in Filename";
- ot->description = "Increment number in filename";
- ot->idname = "FILE_OT_filenum";
+ /* identifiers */
+ ot->name = "Increment Number in Filename";
+ ot->description = "Increment number in filename";
+ ot->idname = "FILE_OT_filenum";
- /* api callbacks */
- ot->exec = file_filenum_exec;
- ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->exec = file_filenum_exec;
+ ot->poll = ED_operator_file_active; /* <- important, handler is on window level */
- /* props */
- RNA_def_int(ot->srna, "increment", 1, -100, 100, "Increment", "", -100, 100);
+ /* props */
+ RNA_def_int(ot->srna, "increment", 1, -100, 100, "Increment", "", -100, 100);
}
static int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
{
- ScrArea *sa = CTX_wm_area(C);
- SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
-
- if (sfile->params) {
- int idx = sfile->params->highlight_file;
- int numfiles = filelist_files_ensure(sfile->files);
- if ((0 <= idx) && (idx < numfiles)) {
- FileDirEntry *file = filelist_file(sfile->files, idx);
- filelist_entry_select_index_set(sfile->files, idx, FILE_SEL_ADD, FILE_SEL_EDITING, CHECK_ALL);
- BLI_strncpy(sfile->params->renamefile, file->relpath, FILE_MAXFILE);
- /* We can skip the pending state, as we can directly set FILE_SEL_EDITING on the expected entry here. */
- sfile->params->rename_flag = FILE_PARAMS_RENAME_ACTIVE;
- }
- ED_area_tag_redraw(sa);
- }
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
- return OPERATOR_FINISHED;
+ if (sfile->params) {
+ int idx = sfile->params->highlight_file;
+ int numfiles = filelist_files_ensure(sfile->files);
+ if ((0 <= idx) && (idx < numfiles)) {
+ FileDirEntry *file = filelist_file(sfile->files, idx);
+ filelist_entry_select_index_set(
+ sfile->files, idx, FILE_SEL_ADD, FILE_SEL_EDITING, CHECK_ALL);
+ BLI_strncpy(sfile->params->renamefile, file->relpath, FILE_MAXFILE);
+ /* We can skip the pending state, as we can directly set FILE_SEL_EDITING on the expected entry here. */
+ sfile->params->rename_flag = FILE_PARAMS_RENAME_ACTIVE;
+ }
+ ED_area_tag_redraw(sa);
+ }
+ return OPERATOR_FINISHED;
}
static bool file_rename_poll(bContext *C)
{
- bool poll = ED_operator_file_active(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
-
- if (sfile && sfile->params) {
- int idx = sfile->params->highlight_file;
- int numfiles = filelist_files_ensure(sfile->files);
-
- if ((0 <= idx) && (idx < numfiles)) {
- FileDirEntry *file = filelist_file(sfile->files, idx);
- if (FILENAME_IS_CURRPAR(file->relpath)) {
- poll = false;
- }
- }
-
- if (sfile->params->highlight_file < 0) {
- poll = false;
- }
- else {
- char dir[FILE_MAX_LIBEXTRA];
- if (filelist_islibrary(sfile->files, dir, NULL)) {
- poll = false;
- }
- }
- }
- else {
- poll = false;
- }
-
- return poll;
+ bool poll = ED_operator_file_active(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+
+ if (sfile && sfile->params) {
+ int idx = sfile->params->highlight_file;
+ int numfiles = filelist_files_ensure(sfile->files);
+
+ if ((0 <= idx) && (idx < numfiles)) {
+ FileDirEntry *file = filelist_file(sfile->files, idx);
+ if (FILENAME_IS_CURRPAR(file->relpath)) {
+ poll = false;
+ }
+ }
+
+ if (sfile->params->highlight_file < 0) {
+ poll = false;
+ }
+ else {
+ char dir[FILE_MAX_LIBEXTRA];
+ if (filelist_islibrary(sfile->files, dir, NULL)) {
+ poll = false;
+ }
+ }
+ }
+ else {
+ poll = false;
+ }
+
+ return poll;
}
void FILE_OT_rename(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Rename File or Directory";
- ot->description = "Rename file or file directory";
- ot->idname = "FILE_OT_rename";
-
- /* api callbacks */
- ot->exec = file_rename_exec;
- ot->poll = file_rename_poll;
+ /* identifiers */
+ ot->name = "Rename File or Directory";
+ ot->description = "Rename file or file directory";
+ ot->idname = "FILE_OT_rename";
+ /* api callbacks */
+ ot->exec = file_rename_exec;
+ ot->poll = file_rename_poll;
}
static bool file_delete_poll(bContext *C)
{
- bool poll = ED_operator_file_active(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
+ bool poll = ED_operator_file_active(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
- if (sfile && sfile->params) {
- char dir[FILE_MAX_LIBEXTRA];
- int numfiles = filelist_files_ensure(sfile->files);
- int i;
- int num_selected = 0;
+ if (sfile && sfile->params) {
+ char dir[FILE_MAX_LIBEXTRA];
+ int numfiles = filelist_files_ensure(sfile->files);
+ int i;
+ int num_selected = 0;
- if (filelist_islibrary(sfile->files, dir, NULL)) poll = 0;
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
- num_selected++;
- }
- }
- if (num_selected <= 0) {
- poll = 0;
- }
- }
- else
- poll = 0;
+ if (filelist_islibrary(sfile->files, dir, NULL))
+ poll = 0;
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
+ num_selected++;
+ }
+ }
+ if (num_selected <= 0) {
+ poll = 0;
+ }
+ }
+ else
+ poll = 0;
- return poll;
+ return poll;
}
int file_delete_exec(bContext *C, wmOperator *op)
{
- char str[FILE_MAX];
- Main *bmain = CTX_data_main(C);
- wmWindowManager *wm = CTX_wm_manager(C);
- SpaceFile *sfile = CTX_wm_space_file(C);
- ScrArea *sa = CTX_wm_area(C);
- FileDirEntry *file;
- int numfiles = filelist_files_ensure(sfile->files);
- int i;
-
- bool report_error = false;
- errno = 0;
- for (i = 0; i < numfiles; i++) {
- if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
- file = filelist_file(sfile->files, i);
- BLI_make_file_string(BKE_main_blendfile_path(bmain), str, sfile->params->dir, file->relpath);
- if (BLI_delete(str, false, false) != 0 ||
- BLI_exists(str))
- {
- report_error = true;
- }
- }
- }
-
- if (report_error) {
- BKE_reportf(op->reports, RPT_ERROR,
- "Could not delete file: %s",
- errno ? strerror(errno) : "unknown error");
- }
-
- ED_fileselect_clear(wm, sa, sfile);
- WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
-
- return OPERATOR_FINISHED;
-
+ char str[FILE_MAX];
+ Main *bmain = CTX_data_main(C);
+ wmWindowManager *wm = CTX_wm_manager(C);
+ SpaceFile *sfile = CTX_wm_space_file(C);
+ ScrArea *sa = CTX_wm_area(C);
+ FileDirEntry *file;
+ int numfiles = filelist_files_ensure(sfile->files);
+ int i;
+
+ bool report_error = false;
+ errno = 0;
+ for (i = 0; i < numfiles; i++) {
+ if (filelist_entry_select_index_get(sfile->files, i, CHECK_FILES)) {
+ file = filelist_file(sfile->files, i);
+ BLI_make_file_string(BKE_main_blendfile_path(bmain), str, sfile->params->dir, file->relpath);
+ if (BLI_delete(str, false, false) != 0 || BLI_exists(str)) {
+ report_error = true;
+ }
+ }
+ }
+
+ if (report_error) {
+ BKE_reportf(op->reports,
+ RPT_ERROR,
+ "Could not delete file: %s",
+ errno ? strerror(errno) : "unknown error");
+ }
+
+ ED_fileselect_clear(wm, sa, sfile);
+ WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_LIST, NULL);
+
+ return OPERATOR_FINISHED;
}
void FILE_OT_delete(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Delete Selected Files";
- ot->description = "Delete selected files";
- ot->idname = "FILE_OT_delete";
+ /* identifiers */
+ ot->name = "Delete Selected Files";
+ ot->description = "Delete selected files";
+ ot->idname = "FILE_OT_delete";
- /* api callbacks */
- ot->invoke = WM_operator_confirm;
- ot->exec = file_delete_exec;
- ot->poll = file_delete_poll; /* <- important, handler is on window level */
+ /* api callbacks */
+ ot->invoke = WM_operator_confirm;
+ ot->exec = file_delete_exec;
+ ot->poll = file_delete_poll; /* <- important, handler is on window level */
}
-
void ED_operatormacros_file(void)
{
-// wmOperatorType *ot;
-// wmOperatorTypeMacro *otmacro;
+ // wmOperatorType *ot;
+ // wmOperatorTypeMacro *otmacro;
- /* future macros */
+ /* future macros */
}