[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31978] trunk/blender: New optional operator function, check(), it takes the same arguments as execute().

Campbell Barton ideasman42 at gmail.com
Fri Sep 17 11:27:31 CEST 2010


Revision: 31978
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31978
Author:   campbellbarton
Date:     2010-09-17 11:27:31 +0200 (Fri, 17 Sep 2010)

Log Message:
-----------
New optional operator function, check(), it takes the same arguments as execute().
 This runs after changing a property and allows correcting incompatible options.
 Returning True will redraw the UI.

Currently this is used for setting the write extension when saving files, so changing the image format also corrects the extension.
The same is accessible from python where its used when saving SVG/EPS/PNG files.

This fixes: [#23828] obj export problems, [#23760] Exporting OBJ and filetype ending
also fixed document submission operator.


Now the filename in the file selector is the one used for writing this means we remove the "Save Over" popup which could be overlooked too easily.
Instead display the filename field with red tint, and a note in the tooltip.

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/io_utils.py
    trunk/blender/release/scripts/op/uv.py
    trunk/blender/release/scripts/op/wm.py
    trunk/blender/source/blender/blenkernel/intern/exotic.c
    trunk/blender/source/blender/editors/space_file/file_draw.c
    trunk/blender/source/blender/editors/space_file/file_intern.h
    trunk/blender/source/blender/editors/space_file/file_ops.c
    trunk/blender/source/blender/editors/space_file/file_panels.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/makesrna/intern/rna_wm_api.c
    trunk/blender/source/blender/windowmanager/WM_types.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/release/scripts/modules/io_utils.py
===================================================================
--- trunk/blender/release/scripts/modules/io_utils.py	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/release/scripts/modules/io_utils.py	2010-09-17 09:27:31 UTC (rev 31978)
@@ -34,7 +34,15 @@
         context.window_manager.add_fileselect(self)
         return {'RUNNING_MODAL'}
 
+    def check(self, context):
+        filepath = bpy.path.ensure_ext(self.filepath, self.filename_ext)
+        if filepath != self.filepath:
+            self.filepath = filepath
+            return True
+        else:
+            return False
 
+
 class ImportHelper:
     filepath = StringProperty(name="File Path", description="Filepath used for importing the file", maxlen=1024, default="", subtype='FILE_PATH')
 

Modified: trunk/blender/release/scripts/op/uv.py
===================================================================
--- trunk/blender/release/scripts/op/uv.py	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/release/scripts/op/uv.py	2010-09-17 09:27:31 UTC (rev 31978)
@@ -343,6 +343,15 @@
 
         return {'FINISHED'}
 
+    def check(self, context):
+        filepath = bpy.path.ensure_ext(self.filepath, "." + self.mode.lower())
+        if filepath != self.filepath:
+            self.filepath = filepath
+            return True
+        else:
+            return False
+
+
     def invoke(self, context, event):
         self.size = self._image_size(context)
         wm = context.window_manager

Modified: trunk/blender/release/scripts/op/wm.py
===================================================================
--- trunk/blender/release/scripts/op/wm.py	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/release/scripts/op/wm.py	2010-09-17 09:27:31 UTC (rev 31978)
@@ -632,7 +632,7 @@
 
     def draw(self, context):
         layout = self.layout
-        props = self
+        props = self.properties # XXX, this should not be needed, api problem!
         layout.label(text="Descriptor ID: '%s'" % props.doc_id)
         layout.prop(props, "doc_new", text="")
 
@@ -641,6 +641,7 @@
         return wm.invoke_props_dialog(self, width=600)
 
 
+
 from bpy.props import *
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/exotic.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/exotic.c	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/source/blender/blenkernel/intern/exotic.c	2010-09-17 09:27:31 UTC (rev 31978)
@@ -577,15 +577,8 @@
 	FILE   *fpSTL;
 	int    numfacets = 0;
 	ReportList *reports= NULL; /* XXX */
-	
-	if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
-	if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
-	if(BLI_testextensie(str,".stl")==0) strcat(str, ".stl");
 
-	if (BLI_exists(str)) {
-		; //XXX if(saveover(str)==0)
-		//XXX   return;
-	}
+	/* XXX, operator needs to manage filename extension */
 
 	fpSTL= fopen(str, "wb");
 	
@@ -872,16 +865,8 @@
 	Base *base;
 	FILE *fp;
 	
-	if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
-	if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
-	if(BLI_testextensie(str,".dxf")==0) strcat(str, ".dxf");
+	/* XXX, operator needs to handle overwrite & rename */
 
-	
-	if (BLI_exists(str)) {
-		; //XXX if(saveover(str)==0)
-		//	return;
-	}
-
 	fp= fopen(str, "w");
 	
 	if(fp==NULL) {

Modified: trunk/blender/source/blender/editors/space_file/file_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_draw.c	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/source/blender/editors/space_file/file_draw.c	2010-09-17 09:27:31 UTC (rev 31978)
@@ -172,6 +172,10 @@
 	
 	/* Text input fields for directory and file. */
 	if (available_w > 0) {
+		int overwrite_alert= file_draw_check_exists(sfile);
+		/* callbacks for operator check functions */
+		uiBlockSetFunc(block, file_draw_check_cb, NULL, NULL);
+
 		but = uiDefBut(block, TEX, B_FS_DIRNAME, "",
 				 min_x, line1_y, line1_w-chan_offs, btn_h, 
 				 params->dir, 0.0, (float)FILE_MAX-1, 0, 0, 
@@ -182,9 +186,17 @@
 		but = uiDefBut(block, TEX, B_FS_FILENAME, "",
 				 min_x, line2_y, line2_w-chan_offs, btn_h,
 				 params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, 
-				 "File name.");
+				 overwrite_alert ?"File name, overwrite existing." : "File name.");
 		uiButSetCompleteFunc(but, autocomplete_file, NULL);
 		uiButSetFlag(but, UI_BUT_NO_UTF8);
+		
+		/* check if this overrides a file and if the operator option is used */
+		if(overwrite_alert) {
+			uiButSetFlag(but, UI_BUT_REDALERT);
+		}
+		
+		/* clear func */
+		uiBlockSetFunc(block, NULL, NULL, NULL);
 	}
 	
 	/* Filename number increment / decrement buttons. */

Modified: trunk/blender/source/blender/editors/space_file/file_intern.h
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_intern.h	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/source/blender/editors/space_file/file_intern.h	2010-09-17 09:27:31 UTC (rev 31978)
@@ -46,6 +46,9 @@
 void file_draw_previews(const bContext *C, ARegion *ar);
 void file_draw_list(const bContext *C, ARegion *ar);
 
+void file_draw_check_cb(bContext *C, void *arg1, void *arg2);
+int file_draw_check_exists(SpaceFile *sfile);
+
 /* file_ops.h */
 struct wmOperatorType;
 struct wmOperator;
@@ -84,7 +87,10 @@
 
 int file_hilight_set(struct SpaceFile *sfile, struct ARegion *ar, int mx, int my);
 
+void file_sfile_to_operator(struct wmOperator *op, struct SpaceFile *sfile, char *filepath);
+void file_operator_to_sfile(struct SpaceFile *sfile, struct wmOperator *op);
 
+
 /* filesel.c */
 float file_string_width(const char* str);
 float file_font_pointsize();

Modified: trunk/blender/source/blender/editors/space_file/file_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_file/file_ops.c	2010-09-17 08:53:39 UTC (rev 31977)
+++ trunk/blender/source/blender/editors/space_file/file_ops.c	2010-09-17 09:27:31 UTC (rev 31978)
@@ -206,7 +206,11 @@
 			}
 			
 		}	
-	} 
+	}
+	
+	/* update operator for name change event */
+	file_draw_check_cb(C, NULL, NULL);
+	
 	return retval;
 }
 
@@ -541,6 +545,114 @@
 	ot->poll= file_operator_poll;
 }
 
+
+void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath)
+{
+	BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file);
+	if(RNA_struct_find_property(op->ptr, "relative_path")) {
+		if(RNA_boolean_get(op->ptr, "relative_path")) {
+			BLI_path_rel(filepath, G.sce);
+		}
+	}
+
+	if(RNA_struct_find_property(op->ptr, "filename")) {
+		RNA_string_set(op->ptr, "filename", sfile->params->file);
+	}
+	if(RNA_struct_find_property(op->ptr, "directory")) {
+		RNA_string_set(op->ptr, "directory", sfile->params->dir);
+	}
+	if(RNA_struct_find_property(op->ptr, "filepath")) {
+		RNA_string_set(op->ptr, "filepath", filepath);
+	}
+	
+	/* some ops have multiple files to select */
+	{
+		PointerRNA itemptr;
+		int i, numfiles = filelist_numfiles(sfile->files);
+		struct direntry *file;
+		if(RNA_struct_find_property(op->ptr, "files")) {
+			for (i=0; i<numfiles; i++) {
+				file = filelist_file(sfile->files, i);
+				if(file->flags & ACTIVEFILE) {
+					if ((file->type & S_IFDIR)==0) {
+						RNA_collection_add(op->ptr, "files", &itemptr);
+						RNA_string_set(&itemptr, "name", file->relname);
+					}
+				}
+			}
+		}
+		
+		if(RNA_struct_find_property(op->ptr, "dirs")) {
+			for (i=0; i<numfiles; i++) {
+				file = filelist_file(sfile->files, i);
+				if(file->flags & ACTIVEFILE) {
+					if ((file->type & S_IFDIR)) {
+						RNA_collection_add(op->ptr, "dirs", &itemptr);
+						RNA_string_set(&itemptr, "name", file->relname);
+					}
+				}
+			}
+		}
+	}
+}
+
+void file_operator_to_sfile(SpaceFile *sfile, wmOperator *op)
+{
+	int change= FALSE;
+	if(RNA_struct_find_property(op->ptr, "filename")) {
+		RNA_string_get(op->ptr, "filename", sfile->params->file);
+		change= TRUE;
+	}
+	if(RNA_struct_find_property(op->ptr, "directory")) {
+		RNA_string_get(op->ptr, "directory", sfile->params->dir);
+		change= TRUE;
+	}
+	
+	/* If neither of the above are set, split the filepath back */
+	if(RNA_struct_find_property(op->ptr, "filepath")) {
+		if(change==FALSE) {
+			char filepath[FILE_MAX];
+			RNA_string_get(op->ptr, "filepath", filepath);
+			BLI_split_dirfile(filepath, sfile->params->dir, sfile->params->file);
+		}
+	}
+	
+	/* XXX, files and dirs updates missing, not really so important though */
+}
+
+void file_draw_check_cb(bContext *C, void *dummy1, void *dummy2)
+{
+	SpaceFile *sfile= CTX_wm_space_file(C);
+	wmOperator *op= sfile->op;
+	if(op->type->check) {
+		char filepath[FILE_MAX];
+		file_sfile_to_operator(op, sfile, filepath);
+		
+		/* redraw */
+		if(op->type->check(C, op)) {
+			file_operator_to_sfile(sfile, op);
+
+			/* redraw, else the changed settings wont get updated */
+			ED_area_tag_redraw(CTX_wm_area(C));
+		}
+	}
+}
+
+int file_draw_check_exists(SpaceFile *sfile)
+{
+	if(RNA_struct_find_property(sfile->op->ptr, "check_existing")) {
+		if(RNA_boolean_get(sfile->op->ptr, "check_existing")) {
+			char filepath[FILE_MAX];
+			BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file);
+			if(BLI_exists(filepath) && !BLI_is_dir(filepath)) {
+				return TRUE;
+			}
+		}
+	}
+
+	return FALSE;
+}
+
 /* sends events now, so things get handled on windowqueue level */
 int file_exec(bContext *C, wmOperator *exec_op)
 {
@@ -568,53 +680,8 @@
 		
 		sfile->op = NULL;
 
-		BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file);
-		if(RNA_struct_find_property(op->ptr, "relative_path")) {
-			if(RNA_boolean_get(op->ptr, "relative_path")) {
-				BLI_path_rel(filepath, G.sce);
-			}
-		}
+		file_sfile_to_operator(op, sfile, filepath);
 
-		if(RNA_struct_find_property(op->ptr, "filename")) {
-			RNA_string_set(op->ptr, "filename", sfile->params->file);
-		}
-		if(RNA_struct_find_property(op->ptr, "directory")) {
-			RNA_string_set(op->ptr, "directory", sfile->params->dir);
-		}
-		if(RNA_struct_find_property(op->ptr, "filepath")) {
-			RNA_string_set(op->ptr, "filepath", filepath);
-		}
-		
-		/* some ops have multiple files to select */
-		{
-			PointerRNA itemptr;
-			int i, numfiles = filelist_numfiles(sfile->files);
-			struct direntry *file;
-			if(RNA_struct_find_property(op->ptr, "files")) {
-				for (i=0; i<numfiles; i++) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list