Add 'reload' function to libraries' RNA API.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 19 Jul 2016 15:49:01 +0000 (17:49 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 19 Jul 2016 15:49:33 +0000 (17:49 +0200)
source/blender/makesrna/intern/rna_ID.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_files_link.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index 332ca190a08138d6907f05df647ac2388f7d8400..b6e9844d97ad5f457c79740a2675523926ec8065 100644 (file)
@@ -1024,6 +1024,7 @@ static void rna_def_ID(BlenderRNA *brna)
 static void rna_def_library(BlenderRNA *brna)
 {
        StructRNA *srna;
+       FunctionRNA *func;
        PropertyRNA *prop;
 
        srna = RNA_def_struct(brna, "Library", "ID");
@@ -1042,6 +1043,10 @@ static void rna_def_library(BlenderRNA *brna)
        prop = RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "packedfile");
        RNA_def_property_ui_text(prop, "Packed File", "");
+
+       func = RNA_def_function(srna, "reload", "WM_lib_reload");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_CONTEXT);
+       RNA_def_function_ui_description(func, "Reload this library and all its linked datablocks");
 }
 void RNA_def_ID(BlenderRNA *brna)
 {
index 7a247d9791b534674a0ec3256ac590d8324e2259..26a1c7038d85e034e34e831a1a507b39e9e124ea 100644 (file)
@@ -114,6 +114,8 @@ void                WM_autosave_init(struct wmWindowManager *wm);
 void           WM_recover_last_session(struct bContext *C, struct ReportList *reports);
 void           WM_file_tag_modified(const struct bContext *C);
 
+void        WM_lib_reload(struct Library *lib, struct bContext *C, struct ReportList *reports);
+
                        /* mouse cursors */
 void           WM_cursor_set(struct wmWindow *win, int curs);
 void           WM_cursor_modal_set(struct wmWindow *win, int curs);
index 12ad8f91064c5070913929fded421af85af76b0a..e2ccb6fbbd7454ab4eadccdbd302df7033e9bb02 100644 (file)
@@ -551,8 +551,9 @@ static int wm_lib_relocate_invoke(bContext *C, wmOperator *op, const wmEvent *UN
        return OPERATOR_CANCELLED;
 }
 
-/* Note that IDs listed in lapp_data items *must* have been removed from bmain by caller. */
-static void lib_relocate_do(Main *bmain, WMLinkAppendData *lapp_data, ReportList *reports, const bool do_reload)
+static void lib_relocate_do(
+        Main *bmain, Scene *scene,
+        Library *library, WMLinkAppendData *lapp_data, ReportList *reports, const bool do_reload)
 {
        ListBase *lbarray[MAX_LIBARRAY];
        int lba_idx;
@@ -560,6 +561,34 @@ static void lib_relocate_do(Main *bmain, WMLinkAppendData *lapp_data, ReportList
        LinkNode *itemlink;
        int item_idx;
 
+       /* Remove all IDs to be reloaded from Main. */
+       lba_idx = set_listbasepointers(bmain, lbarray);
+       while (lba_idx--) {
+               ID *id = lbarray[lba_idx]->first;
+               const short idcode = id ? GS(id->name) : 0;
+
+               if (!id || !BKE_idcode_is_linkable(idcode)) {
+                       /* No need to reload non-linkable datatypes, those will get relinked with their 'users ID'. */
+                       continue;
+               }
+
+               for (; id; id = id->next) {
+                       if (id->lib == library) {
+                               WMLinkAppendDataItem *item;
+
+                               /* We remove it from current Main, and add it to items to link... */
+                               /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitely linked here... */
+                               BLI_remlink(lbarray[lba_idx], id);
+                               item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, id);
+                               BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries);
+
+#ifdef PRINT_DEBUG
+                               printf("\tdatablock to seek for: %s\n", id->name);
+#endif
+                       }
+               }
+       }
+
        BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
 
        /* We do not want any instanciation here! */
@@ -698,6 +727,43 @@ static void lib_relocate_do(Main *bmain, WMLinkAppendData *lapp_data, ReportList
                        }
                }
        }
+
+       BKE_main_lib_objects_recalc_all(bmain);
+       IMB_colormanagement_check_file_config(bmain);
+
+       /* important we unset, otherwise these object wont
+        * link into other scenes from this blend file */
+       BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false);
+
+       /* recreate dependency graph to include new objects */
+       DAG_scene_relations_rebuild(bmain, scene);
+
+       /* free gpu materials, some materials depend on existing objects, such as lamps so freeing correctly refreshes */
+       GPU_materials_free();
+}
+
+void WM_lib_reload(Library *lib, bContext *C, ReportList *reports)
+{
+       if (!BLO_has_bfile_extension(lib->filepath)) {
+               BKE_reportf(reports, RPT_ERROR, "'%s' is not a valid library filepath", lib->filepath);
+               return;
+       }
+
+       if (!BLI_exists(lib->filepath)) {
+               BKE_reportf(reports, RPT_ERROR,
+                           "Trying to reload library '%s' from invalid path '%s'", lib->id.name, lib->filepath);
+               return;
+       }
+
+       WMLinkAppendData *lapp_data = wm_link_append_data_new(0);
+
+       wm_link_append_data_library_add(lapp_data, lib->filepath);
+
+       lib_relocate_do(CTX_data_main(C), CTX_data_scene(C), lib, lapp_data, reports, true);
+
+       wm_link_append_data_free(lapp_data);
+
+       WM_event_add_notifier(C, NC_WINDOW, NULL);
 }
 
 static int wm_lib_relocate_exec_do(bContext *C, wmOperator *op, bool do_reload)
@@ -714,9 +780,6 @@ static int wm_lib_relocate_exec_do(bContext *C, wmOperator *op, bool do_reload)
                PropertyRNA *prop;
                WMLinkAppendData *lapp_data;
 
-               ListBase *lbarray[MAX_LIBARRAY];
-               int lba_idx;
-
                char path[FILE_MAX], root[FILE_MAXDIR], libname[FILE_MAX], relname[FILE_MAX];
                short flag = 0;
 
@@ -803,50 +866,10 @@ static int wm_lib_relocate_exec_do(bContext *C, wmOperator *op, bool do_reload)
                        }
                }
 
-               lba_idx = set_listbasepointers(bmain, lbarray);
-               while (lba_idx--) {
-                       ID *id = lbarray[lba_idx]->first;
-                       const short idcode = id ? GS(id->name) : 0;
-
-                       if (!id || !BKE_idcode_is_linkable(idcode)) {
-                               /* No need to reload non-linkable datatypes, those will get relinked with their 'users ID'. */
-                               continue;
-                       }
-
-                       for (; id; id = id->next) {
-                               if (id->lib == lib) {
-                                       WMLinkAppendDataItem *item;
-
-                                       /* We remove it from current Main, and add it to items to link... */
-                                       /* Note that non-linkable IDs (like e.g. shapekeys) are also explicitely linked here... */
-                                       BLI_remlink(lbarray[lba_idx], id);
-                                       item = wm_link_append_data_item_add(lapp_data, id->name + 2, idcode, id);
-                                       BLI_BITMAP_SET_ALL(item->libraries, true, lapp_data->num_libraries);
-
-#ifdef PRINT_DEBUG
-                                       printf("\tdatablock to seek for: %s\n", id->name);
-#endif
-                               }
-                       }
-               }
-
-               lib_relocate_do(bmain, lapp_data, op->reports, do_reload);
+               lib_relocate_do(bmain, scene, lib, lapp_data, op->reports, do_reload);
 
                wm_link_append_data_free(lapp_data);
 
-               BKE_main_lib_objects_recalc_all(bmain);
-               IMB_colormanagement_check_file_config(bmain);
-
-               /* important we unset, otherwise these object wont
-                * link into other scenes from this blend file */
-               BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false);
-
-               /* recreate dependency graph to include new objects */
-               DAG_scene_relations_rebuild(bmain, scene);
-
-               /* free gpu materials, some materials depend on existing objects, such as lamps so freeing correctly refreshes */
-               GPU_materials_free();
-
                /* XXX TODO: align G.lib with other directory storage (like last opened image etc...) */
                BLI_strncpy(G.lib, root, FILE_MAX);
 
index 5c5f0909edb5b930c257d82cbc14c792bbc88a62..8de70d87f0015446a11f0d6f671aeea365ad1820 100644 (file)
@@ -308,6 +308,8 @@ void WM_operator_handlers_clear(wmWindowManager *wm, struct wmOperatorType *ot)
 void WM_autosave_init(wmWindowManager *wm) RET_NONE
 void WM_jobs_kill_all_except(struct wmWindowManager *wm, void *owner) RET_NONE
 
+void WM_lib_reload(struct Library *lib, struct bContext *C, struct ReportList *reports) RET_NONE
+
 char *WM_clipboard_text_get(bool selection, int *r_len) RET_NULL
 char *WM_clipboard_text_get_firstline(bool selection, int *r_len) RET_NULL
 void WM_clipboard_text_set(const char *buf, bool selection) RET_NONE