[Bf-blender-cvs] [48d7ff68f0d] master: Make File Select dialog update operator's file & path properties

Colin Basnett noreply at git.blender.org
Fri Sep 16 09:28:35 CEST 2022


Commit: 48d7ff68f0df209c77bbb081ab46fbc109fd825a
Author: Colin Basnett
Date:   Fri Sep 16 00:22:16 2022 -0700
Branches: master
https://developer.blender.org/rB48d7ff68f0df209c77bbb081ab46fbc109fd825a

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

===================================================================

M	source/blender/editors/space_file/file_intern.h
M	source/blender/editors/space_file/file_ops.c
M	source/blender/editors/space_file/filesel.c

===================================================================

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



More information about the Bf-blender-cvs mailing list