[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41235] trunk/blender/source/blender: added function BKE_library_filepath_set which sync' s the libraries absolute path when setting to a relative value, before this you could never be sure if a libraries absolute path was valid or not because the user might have changed the relative library path in the outliner , now setting from the outliner and py/rna syncs the absolute path.

Campbell Barton ideasman42 at gmail.com
Mon Oct 24 06:52:44 CEST 2011


Revision: 41235
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41235
Author:   campbellbarton
Date:     2011-10-24 04:52:43 +0000 (Mon, 24 Oct 2011)
Log Message:
-----------
added function BKE_library_filepath_set which sync's the libraries absolute path when setting to a relative value, before this you could never be sure if a libraries absolute path was valid or not because the user might have changed the relative library path in the outliner, now setting from the outliner and py/rna syncs the absolute path.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_library.h
    trunk/blender/source/blender/blenkernel/intern/library.c
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/makesdna/DNA_ID.h
    trunk/blender/source/blender/makesrna/intern/rna_ID.c

Modified: trunk/blender/source/blender/blenkernel/BKE_library.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_library.h	2011-10-24 04:18:28 UTC (rev 41234)
+++ trunk/blender/source/blender/blenkernel/BKE_library.h	2011-10-24 04:52:43 UTC (rev 41235)
@@ -50,6 +50,7 @@
 void copy_libblock_data(struct ID *id, const struct ID *id_from, const short do_action);
 
 void id_lib_extern(struct ID *id);
+void BKE_library_filepath_set(struct Library *lib, const char *filepath);
 void id_us_plus(struct ID *id);
 void id_us_min(struct ID *id);
 int id_make_local(struct ID *id, int test);

Modified: trunk/blender/source/blender/blenkernel/intern/library.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/library.c	2011-10-24 04:18:28 UTC (rev 41234)
+++ trunk/blender/source/blender/blenkernel/intern/library.c	2011-10-24 04:52:43 UTC (rev 41235)
@@ -1461,3 +1461,21 @@
 
 	strcpy(name+3, id->name+2);
 }
+
+void BKE_library_filepath_set(Library *lib, const char *filepath)
+{
+	BLI_strncpy(lib->name, filepath, sizeof(lib->name));
+	BLI_strncpy(lib->filepath, filepath, sizeof(lib->filepath));
+
+	/* not essential but set filepath is an absolute copy of value which
+	 * is more useful if its kept in sync */
+	if (strncmp(lib->filepath, "//", 2) == 0) {
+		/* note that the file may be unsaved, in this case, setting the
+		 * filepath on an indirectly linked path is not allowed from the
+		 * outliner, and its not really supported but allow from here for now
+		 * since making local could cause this to be directly linked - campbell
+		 */
+		const char *basepath= lib->parent ? lib->parent->filepath : G.main->name;
+		BLI_path_abs(lib->filepath, basepath);
+	}
+}

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-10-24 04:18:28 UTC (rev 41234)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2011-10-24 04:52:43 UTC (rev 41235)
@@ -310,11 +310,19 @@
 			}					
 			/* Check the library target exists */
 			if (te->idcode == ID_LI) {
-				char expanded[FILE_MAXDIR + FILE_MAXFILE];
-				BLI_strncpy(expanded, ((Library *)tselem->id)->name, FILE_MAXDIR + FILE_MAXFILE);
+				Library *lib= (Library *)tselem->id;
+				char expanded[FILE_MAX];
+
+				BLI_strncpy(expanded, lib->name, sizeof(expanded));
+
+				/* even though we already set the name this syncs the absolute
+				 * path, this is intentionally not already expanded yet to
+				 * avoid copying lib->name to its self. */
+				BKE_library_filepath_set(lib, expanded);
+
 				BLI_path_abs(expanded, G.main->name);
 				if (!BLI_exists(expanded)) {
-					BKE_report(CTX_wm_reports(C), RPT_ERROR, "This path does not exist, correct this before saving");
+					BKE_reportf(CTX_wm_reports(C), RPT_ERROR, "Library path '%s' does not exist, correct this before saving", expanded);
 				}
 			}
 		}

Modified: trunk/blender/source/blender/makesdna/DNA_ID.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_ID.h	2011-10-24 04:18:28 UTC (rev 41234)
+++ trunk/blender/source/blender/makesdna/DNA_ID.h	2011-10-24 04:52:43 UTC (rev 41235)
@@ -116,7 +116,13 @@
 	ID *idblock;
 	struct FileData *filedata;
 	char name[240];			/* path name used for reading, can be relative and edited in the outliner */
-	char filepath[240];		/* temp. absolute filepath, only used while reading */
+	char filepath[240];		/* absolute filepath, this is only for convenience,
+							 * 'name' is the real path used on file read but in
+							 * some cases its useful to access the absolute one,
+							 * This is set on file read.
+							 * Use BKE_library_filepath_set() rather than
+							 * setting 'name' directly and it will be kepk in
+							 * sync - campbell */
 	int tot, pad;			/* tot, idblock and filedata are only fo read and write */
 	struct Library *parent;	/* set for indirectly linked libs, used in the outliner and while reading */
 } Library;

Modified: trunk/blender/source/blender/makesrna/intern/rna_ID.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-10-24 04:18:28 UTC (rev 41234)
+++ trunk/blender/source/blender/makesrna/intern/rna_ID.c	2011-10-24 04:52:43 UTC (rev 41235)
@@ -326,6 +326,12 @@
 	}
 }
 
+void rna_Library_filepath_set(PointerRNA *ptr, const char *value)
+{
+	Library *lib= (Library*)ptr->data;
+	BKE_library_filepath_set(lib, value);
+}
+
 #else
 
 static void rna_def_ID_properties(BlenderRNA *brna)
@@ -521,7 +527,7 @@
 	prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
 	RNA_def_property_string_sdna(prop, NULL, "name");
 	RNA_def_property_ui_text(prop, "File Path", "Path to the library .blend file");
-	/* TODO - lib->filename isnt updated, however the outliner also skips this, probably only needed on read. */
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Library_filepath_set");
 	
 	prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
 	RNA_def_property_struct_type(prop, "Library");




More information about the Bf-blender-cvs mailing list