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
This commit is contained in:
Colin Basnett 2022-09-16 00:22:16 -07:00
parent 8bf0714d50
commit 48d7ff68f0
3 changed files with 39 additions and 15 deletions

View File

@ -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);
/**

View File

@ -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);
}

View File

@ -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);
}
}
}