From 48d7ff68f0df209c77bbb081ab46fbc109fd825a Mon Sep 17 00:00:00 2001 From: Colin Basnett Date: Fri, 16 Sep 2022 00:22:16 -0700 Subject: Make File Select dialog update operator's file & path properties When an operator is attached to a file select dialog, the update callback function for the operator's directory, filename and filepath properties will be called as the user navigates through the dialog. This will allow add-on authors to make more interactive import operators. Differential Revision: https://developer.blender.org/D15543 --- source/blender/editors/space_file/file_intern.h | 10 +++++-- source/blender/editors/space_file/file_ops.c | 37 +++++++++++++++++-------- source/blender/editors/space_file/filesel.c | 7 ++++- 3 files changed, 39 insertions(+), 15 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h index 655a7983e2b..788bafe8089 100644 --- a/source/blender/editors/space_file/file_intern.h +++ b/source/blender/editors/space_file/file_intern.h @@ -95,11 +95,15 @@ int file_highlight_set(struct SpaceFile *sfile, struct ARegion *region, int mx, * Use to set the file selector path from some arbitrary source. */ void file_sfile_filepath_set(struct SpaceFile *sfile, const char *filepath); -void file_sfile_to_operator_ex(struct Main *bmain, +void file_sfile_to_operator_ex(struct bContext *C, + struct Main *bmain, struct wmOperator *op, struct SpaceFile *sfile, char *filepath); -void file_sfile_to_operator(struct Main *bmain, struct wmOperator *op, struct SpaceFile *sfile); +void file_sfile_to_operator(struct bContext *C, + struct Main *bmain, + struct wmOperator *op, + struct SpaceFile *sfile); void file_operator_to_sfile(struct Main *bmain, struct SpaceFile *sfile, struct wmOperator *op); @@ -113,7 +117,7 @@ void fileselect_refresh_params(struct SpaceFile *sfile); /** * Sets #FileSelectParams.file (name of selected file) */ -void fileselect_file_set(SpaceFile *sfile, int index); +void fileselect_file_set(struct bContext *C, SpaceFile *sfile, int index); bool file_attribute_column_type_enabled(const FileSelectParams *params, FileAttributeColumnType column); /** diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 721c58fc34e..26fb85ca2af 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -213,7 +213,7 @@ static FileSelect file_select_do(bContext *C, int selected_idx, bool do_diropen) else { retval = FILE_SELECT_FILE; } - fileselect_file_set(sfile, selected_idx); + fileselect_file_set(C, sfile, selected_idx); } return retval; } @@ -484,7 +484,7 @@ static int file_box_select_modal(bContext *C, wmOperator *op, const wmEvent *eve else { params->highlight_file = -1; params->sel_first = params->sel_last = -1; - fileselect_file_set(sfile, params->active_file); + fileselect_file_set(C, sfile, params->active_file); file_select_deselect_all(sfile, FILE_SEL_HIGHLIGHTED); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL); } @@ -702,7 +702,8 @@ void FILE_OT_select(wmOperatorType *ot) /** * \returns true if selection has changed */ -static bool file_walk_select_selection_set(wmWindow *win, +static bool file_walk_select_selection_set(struct bContext* C, + wmWindow *win, ARegion *region, SpaceFile *sfile, const int direction, @@ -808,7 +809,7 @@ static bool file_walk_select_selection_set(wmWindow *win, } BLI_assert(IN_RANGE(active, -1, numfiles)); - fileselect_file_set(sfile, params->active_file); + fileselect_file_set(C, sfile, params->active_file); /* ensure newly selected file is inside viewbounds */ file_ensure_inside_viewbounds(region, sfile, params->active_file); @@ -889,7 +890,8 @@ static bool file_walk_select_do(bContext *C, } } - return file_walk_select_selection_set(win, + return file_walk_select_selection_set(C, + win, region, sfile, direction, @@ -1555,7 +1557,7 @@ void FILE_OT_cancel(struct wmOperatorType *ot) /** \name Operator Utilities * \{ */ -void file_sfile_to_operator_ex(Main *bmain, wmOperator *op, SpaceFile *sfile, char *filepath) +void file_sfile_to_operator_ex(bContext* C, Main *bmain, wmOperator *op, SpaceFile *sfile, char *filepath) { FileSelectParams *params = ED_fileselect_get_active_params(sfile); PropertyRNA *prop; @@ -1569,14 +1571,27 @@ void file_sfile_to_operator_ex(Main *bmain, wmOperator *op, SpaceFile *sfile, ch } } + char value[FILE_MAX]; if ((prop = RNA_struct_find_property(op->ptr, "filename"))) { + RNA_property_string_get(op->ptr, prop, value); RNA_property_string_set(op->ptr, prop, params->file); + if (RNA_property_update_check(prop) && !STREQ(params->file, value)) { + RNA_property_update(C, op->ptr, prop); + } } if ((prop = RNA_struct_find_property(op->ptr, "directory"))) { + RNA_property_string_get(op->ptr, prop, value); RNA_property_string_set(op->ptr, prop, params->dir); + if (RNA_property_update_check(prop) && !STREQ(params->dir, value)) { + RNA_property_update(C, op->ptr, prop); + } } if ((prop = RNA_struct_find_property(op->ptr, "filepath"))) { + RNA_property_string_get(op->ptr, prop, value); RNA_property_string_set(op->ptr, prop, filepath); + if (RNA_property_update_check(prop) && !STREQ(filepath, value)) { + RNA_property_update(C, op->ptr, prop); + } } /* some ops have multiple files to select */ @@ -1630,11 +1645,11 @@ void file_sfile_to_operator_ex(Main *bmain, wmOperator *op, SpaceFile *sfile, ch } } } -void file_sfile_to_operator(Main *bmain, wmOperator *op, SpaceFile *sfile) +void file_sfile_to_operator(bContext *C, Main *bmain, wmOperator *op, SpaceFile *sfile) { char filepath_dummy[FILE_MAX]; - file_sfile_to_operator_ex(bmain, op, sfile, filepath_dummy); + file_sfile_to_operator_ex(C, bmain, op, sfile, filepath_dummy); } void file_operator_to_sfile(Main *bmain, SpaceFile *sfile, wmOperator *op) @@ -1695,7 +1710,7 @@ void file_draw_check_ex(bContext *C, ScrArea *area) if (op) { /* fail on reload */ if (op->type->check) { Main *bmain = CTX_data_main(C); - file_sfile_to_operator(bmain, op, sfile); + file_sfile_to_operator(C, bmain, op, sfile); /* redraw */ if (op->type->check(C, op)) { @@ -1789,7 +1804,7 @@ static bool file_execute(bContext *C, SpaceFile *sfile) sfile->op = NULL; - file_sfile_to_operator_ex(bmain, op, sfile, filepath); + file_sfile_to_operator_ex(C, bmain, op, sfile, filepath); if (BLI_exists(params->dir)) { fsmenu_insert_entry(fsmenu, @@ -2254,7 +2269,7 @@ static int filepath_drop_exec(bContext *C, wmOperator *op) file_sfile_filepath_set(sfile, filepath); if (sfile->op) { - file_sfile_to_operator(bmain, sfile->op, sfile); + file_sfile_to_operator(C, bmain, sfile->op, sfile); file_draw_check(C); } diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index c569a2b57a6..18a885e24c2 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -665,12 +665,17 @@ void ED_fileselect_params_to_userdef(SpaceFile *sfile, } } -void fileselect_file_set(SpaceFile *sfile, const int index) +void fileselect_file_set(struct bContext *C, SpaceFile *sfile, const int index) { const struct FileDirEntry *file = filelist_file(sfile->files, index); if (file && file->relpath && file->relpath[0] && !(file->typeflag & FILE_TYPE_DIR)) { FileSelectParams *params = ED_fileselect_get_active_params(sfile); BLI_strncpy(params->file, file->relpath, FILE_MAXFILE); + if (sfile->op) { + /* Update the filepath properties of the operator. */ + Main *bmain = CTX_data_main(C); + file_sfile_to_operator(C, bmain, sfile->op, sfile); + } } } -- cgit v1.2.3