[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19034] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Wed Feb 18 19:08:37 CET 2009


Revision: 19034
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19034
Author:   ton
Date:     2009-02-18 19:08:33 +0100 (Wed, 18 Feb 2009)

Log Message:
-----------
2.5

Cleanup of saving code for Image window.

Little extra: added poll() check for buttons, greying out inactive
menu items or buttons. You can see it work in Image menu.
(Item 'save image' is grey when it wasn't saved, then you have to
use the 'save as' item).

Carefully designing poll checks is worth a trial once. :)
Do note that cpu time for polls should be totally minimal.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/image.c
    branches/blender2.5/blender/source/blender/editors/interface/interface.c
    branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/image.c	2009-02-18 14:13:06 UTC (rev 19033)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/image.c	2009-02-18 18:08:33 UTC (rev 19034)
@@ -443,7 +443,7 @@
 		rect= (unsigned char*)ibuf->rect;
 	}
 	
-	strcpy(ibuf->name, "Untitled");
+	strcpy(ibuf->name, "//Untitled");
 	ibuf->userflags |= IB_BITMAPDIRTY;
 	
 	if (uvtestgrid) {

Modified: branches/blender2.5/blender/source/blender/editors/interface/interface.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-02-18 14:13:06 UTC (rev 19033)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface.c	2009-02-18 18:08:33 UTC (rev 19034)
@@ -593,9 +593,19 @@
 	 * on matching buttons, we need this to make button event handling non
 	 * blocking, while still alowing buttons to be remade each redraw as it
 	 * is expected by blender code */
-	for(but=block->buttons.first; but; but=but->next)
+	for(but=block->buttons.first; but; but=but->next) {
 		if(ui_but_update_from_old_block(C, block, but))
 			ui_check_but(but);
+		
+		/* temp? Proper check for greying out */
+		if(but->opname) {
+			wmOperatorType *ot= WM_operatortype_find(but->opname);
+			if(ot==NULL || ot->poll((bContext *)C)==0) {
+				but->flag |= UI_BUT_DISABLED;
+				but->lock = 1;
+			}
+		}
+	}
 
 	if(block->oldblock) {
 		block->auto_open= block->oldblock->auto_open;
@@ -607,7 +617,7 @@
 
 	/* handle pending stuff */
 	if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block);
-
+	
 	/* after keymaps! */
 	if(block->dobounds == 1) ui_bounds_block(block);
 	else if(block->dobounds == 2) ui_text_bounds_block(block, 0.0f);

Modified: branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c	2009-02-18 14:13:06 UTC (rev 19033)
+++ branches/blender2.5/blender/source/blender/editors/space_image/image_ops.c	2009-02-18 18:08:33 UTC (rev 19034)
@@ -107,13 +107,28 @@
 	sima_zoom_set(sima, ar, sima->zoom*zoomfac);
 }
 
-int space_image_poll(bContext *C)
+static int space_image_poll(bContext *C)
 {
-	SpaceLink *slink= CTX_wm_space_data(C);
+	SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+	if(sima && sima->spacetype==SPACE_IMAGE)
+		if(ED_space_image_buffer(sima))
+			return 1;
+	return 0;
+}
 
-	return (slink && (slink->spacetype == SPACE_IMAGE));
+static int space_image_file_exists_poll(bContext *C)
+{
+	if(space_image_poll(C)) {
+		SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
+		ImBuf *ibuf= ED_space_image_buffer(sima);
+		
+		if(ibuf && BLI_exists(ibuf->name) && BLI_is_writable(ibuf->name))
+			return 1;
+	}
+	return 0;
 }
 
+
 int space_image_main_area_poll(bContext *C)
 {
 	SpaceLink *slink= CTX_wm_space_data(C);
@@ -602,9 +617,9 @@
 	Scene *scene= CTX_data_scene(C);
 	Object *obedit= CTX_data_edit_object(C);
 	Image *ima= NULL;
-	char *str;
+	char str[FILE_MAX];
 
-	str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
+	RNA_string_get(op->ptr, "filename", str);
 	ima= BKE_add_image_file(str, scene->r.cfra);
 	MEM_freeN(str);
 
@@ -639,13 +654,13 @@
 	/* api callbacks */
 	ot->exec= open_exec;
 	ot->invoke= open_invoke;
-	ot->poll= space_image_poll;
+	ot->poll= ED_operator_image_active;
 
 	/* flags */
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
 	/* properties */
-	RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to open.");
+	RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to open.");
 }
 
 /******************** replace image operator ********************/
@@ -653,14 +668,13 @@
 static int replace_exec(bContext *C, wmOperator *op)
 {
 	SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
-	char *str;
+	char str[FILE_MAX];
 
 	if(!sima->image)
 		return OPERATOR_CANCELLED;
 	
-	str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
+	RNA_string_get(op->ptr, "filename", str);
 	BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */
-	MEM_freeN(str);
 
 	BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD);
 	WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -699,82 +713,77 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
 	/* properties */
-	RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path of image to replace current image with.");
+	RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path of image to replace current image with.");
 }
 
 /******************** save image as operator ********************/
 
+/* assumes name is FILE_MAX */
+/* ima->name and ibuf->name should end up the same */
 static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *name)
 {
 	Image *ima= ED_space_image(sima);
 	ImBuf *ibuf= ED_space_image_buffer(sima);
 	int len;
-	char str[FILE_MAXDIR+FILE_MAXFILE];
 
-	if (ibuf) {
-		BLI_strncpy(str, name, sizeof(str));
-
-		BLI_convertstringcode(str, G.sce);
-		BLI_convertstringframe(str, scene->r.cfra);
+	if (ibuf) {	
+		BLI_convertstringcode(name, G.sce);
+		BLI_convertstringframe(name, scene->r.cfra);
 		
-		
 		if(scene->r.scemode & R_EXTENSION)  {
-			BKE_add_image_extension(scene, str, sima->imtypenr);
 			BKE_add_image_extension(scene, name, sima->imtypenr);
+			BKE_add_image_extension(scene, name, sima->imtypenr);
 		}
 		
-		if(1) { // XXX saveover(str)) {
-			
-			/* enforce user setting for RGB or RGBA, but skip BW */
-			if(scene->r.planes==32)
-				ibuf->depth= 32;
-			else if(scene->r.planes==24)
-				ibuf->depth= 24;
-			
-			WM_cursor_wait(1);
+		/* enforce user setting for RGB or RGBA, but skip BW */
+		if(scene->r.planes==32)
+			ibuf->depth= 32;
+		else if(scene->r.planes==24)
+			ibuf->depth= 24;
+		
+		WM_cursor_wait(1);
 
-			if(sima->imtypenr==R_MULTILAYER) {
-				RenderResult *rr= BKE_image_get_renderresult(scene, ima);
-				if(rr) {
-					RE_WriteRenderResult(rr, str, scene->r.quality);
-					
-					BLI_strncpy(ima->name, name, sizeof(ima->name));
-					BLI_strncpy(ibuf->name, str, sizeof(ibuf->name));
-					
-					/* should be function? nevertheless, saving only happens here */
-					for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next)
-						ibuf->userflags &= ~IB_BITMAPDIRTY;
-					
-				}
-				else
-					BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image");
-			}
-			else if (BKE_write_ibuf(scene, ibuf, str, sima->imtypenr, scene->r.subimtype, scene->r.quality)) {
+		if(sima->imtypenr==R_MULTILAYER) {
+			RenderResult *rr= BKE_image_get_renderresult(scene, ima);
+			if(rr) {
+				RE_WriteRenderResult(rr, name, scene->r.quality);
+				
 				BLI_strncpy(ima->name, name, sizeof(ima->name));
-				BLI_strncpy(ibuf->name, str, sizeof(ibuf->name));
+				BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
 				
-				ibuf->userflags &= ~IB_BITMAPDIRTY;
+				/* should be function? nevertheless, saving only happens here */
+				for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next)
+					ibuf->userflags &= ~IB_BITMAPDIRTY;
 				
-				/* change type? */
-				if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) {
-					ima->source= IMA_SRC_FILE;
-					ima->type= IMA_TYPE_IMAGE;
-				}
-				if(ima->type==IMA_TYPE_R_RESULT)
-					ima->type= IMA_TYPE_IMAGE;
-				
-				/* name image as how we saved it */
-				len= strlen(str);
-				while (len > 0 && str[len - 1] != '/' && str[len - 1] != '\\') len--;
-				rename_id(&ima->id, str+len);
-			} 
+			}
 			else
-				BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", str);
+				BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image");
+		}
+		else if (BKE_write_ibuf(scene, ibuf, name, sima->imtypenr, scene->r.subimtype, scene->r.quality)) {
+			BLI_strncpy(ima->name, name, sizeof(ima->name));
+			BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
+			
+			ibuf->userflags &= ~IB_BITMAPDIRTY;
+			
+			/* change type? */
+			if( ELEM(ima->source, IMA_SRC_GENERATED, IMA_SRC_VIEWER)) {
+				ima->source= IMA_SRC_FILE;
+				ima->type= IMA_TYPE_IMAGE;
+			}
+			if(ima->type==IMA_TYPE_R_RESULT)
+				ima->type= IMA_TYPE_IMAGE;
+			
+			/* name image as how we saved it */
+			len= strlen(name);
+			while (len > 0 && name[len - 1] != '/' && name[len - 1] != '\\') len--;
+			rename_id(&ima->id, name+len);
+		} 
+		else
+			BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", name);
 
-			WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
+		WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
 
-			WM_cursor_wait(0);
-		}
+		WM_cursor_wait(0);
 	}
 }
 
@@ -783,14 +792,13 @@
 	SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
 	Scene *scene= CTX_data_scene(C);
 	Image *ima = ED_space_image(sima);
-	char *str;
+	char str[FILE_MAX];
 
 	if(!ima)
 		return OPERATOR_CANCELLED;
 
-	str= RNA_string_get_alloc(op->ptr, "filename", NULL, 0);
+	RNA_string_get(op->ptr, "filename", str);
 	save_image_doit(C, sima, scene, op, str);
-	MEM_freeN(str);
 
 	return OPERATOR_FINISHED;
 }
@@ -812,7 +820,7 @@
 	if(ibuf) {
 		char *strp;
 		
-		strp= filesel_imagetype_string(ima);
+		strp= filesel_imagetype_string(ima); // XXX unused still
 		
 		/* cant save multilayer sequence, ima->rr isn't valid for a specific frame */
 		if(ima->rr && !(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER))
@@ -822,11 +830,14 @@
 		else
 			sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype);
 		
-		// XXX activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &sima->imtypenr, save_image_doit);
+		if(ibuf->name[0]==0)
+			BLI_strncpy(ibuf->name, G.ima, FILE_MAX);
+		
 		// XXX note: we can give default menu enums to operator for this 
+		image_filesel(C, op, ibuf->name);
+
+		MEM_freeN(strp);
 		
-		image_filesel(C, op, ima->name);
-
 		return OPERATOR_RUNNING_MODAL;
 	}
 
@@ -848,7 +859,7 @@
 	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
 	/* properties */
-	RNA_def_string_file_path(ot->srna, "filename", "", 0, "Filename", "File path to save image to.");
+	RNA_def_string_file_path(ot->srna, "filename", "", FILE_MAX, "Filename", "File path to save image to.");
 }
 
 /******************** save image operator ********************/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list