[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34287] trunk/blender/source/blender: Bugfix #25570

Ton Roosendaal ton at blender.org
Wed Jan 12 19:00:24 CET 2011


Revision: 34287
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34287
Author:   ton
Date:     2011-01-12 18:00:23 +0000 (Wed, 12 Jan 2011)
Log Message:
-----------
Bugfix #25570

The tool-redo depends on a working undo system, so it can rewind
a step and then redo operator with new settings. When a user
disables undo, this won't work.

Now the properties for redo operator (toolbar, F6) will grey out
when a redo isn't possible.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/blender.c
    trunk/blender/source/blender/editors/include/ED_particle.h
    trunk/blender/source/blender/editors/include/ED_sculpt.h
    trunk/blender/source/blender/editors/include/ED_util.h
    trunk/blender/source/blender/editors/physics/particle_edit.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c
    trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
    trunk/blender/source/blender/editors/util/editmode_undo.c
    trunk/blender/source/blender/editors/util/undo.c
    trunk/blender/source/blender/editors/util/util_intern.h
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2011-01-12 18:00:23 UTC (rev 34287)
@@ -73,6 +73,7 @@
 extern void BKE_write_undo(struct bContext *C, const char *name);
 extern void BKE_undo_step(struct bContext *C, int step);
 extern void BKE_undo_name(struct bContext *C, const char *name);
+extern int BKE_undo_valid(const char *name);
 extern void BKE_reset_undo(void);
 extern char *BKE_undo_menu_string(void);
 extern void BKE_undo_number(struct bContext *C, int nr);

Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -638,7 +638,23 @@
 	}
 }
 
+/* name optional */
+int BKE_undo_valid(const char *name)
+{
+	if(name) {
+		UndoElem *uel;
+		
+		for(uel= undobase.last; uel; uel= uel->prev)
+			if(strcmp(name, uel->name)==0)
+				break;
+		
+		return uel && uel->prev;
+	}
+	
+	return undobase.last != undobase.first;
+}
 
+
 char *BKE_undo_menu_string(void)
 {
 	UndoElem *uel;

Modified: trunk/blender/source/blender/editors/include/ED_particle.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_particle.h	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/include/ED_particle.h	2011-01-12 18:00:23 UTC (rev 34287)
@@ -68,6 +68,7 @@
 void PE_undo(struct Scene *scene);
 void PE_redo(struct Scene *scene);
 void PE_undo_menu(struct Scene *scene, struct Object *ob);
+int PE_undo_valid(struct Scene *scene);
 
 #endif /* ED_PARTICLE_H */
 

Modified: trunk/blender/source/blender/editors/include/ED_sculpt.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_sculpt.h	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/include/ED_sculpt.h	2011-01-12 18:00:23 UTC (rev 34287)
@@ -51,5 +51,6 @@
 
 int ED_undo_paint_step(struct bContext *C, int type, int step, const char *name);
 void ED_undo_paint_free(void);
+int ED_undo_paint_valid(int type, const char *name);
 
 #endif

Modified: trunk/blender/source/blender/editors/include/ED_util.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_util.h	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/include/ED_util.h	2011-01-12 18:00:23 UTC (rev 34287)
@@ -56,6 +56,8 @@
 void	ED_undo_operator_repeat_cb(struct bContext *C, void *arg_op, void *arg_unused);
 void	ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg_unused);
 
+int		ED_undo_valid			(const struct bContext *C, const char *undoname);
+
 /* undo_editmode.c */
 void undo_editmode_push(struct bContext *C, const char *name, 
 						void * (*getdata)(struct bContext *C),

Modified: trunk/blender/source/blender/editors/physics/particle_edit.c
===================================================================
--- trunk/blender/source/blender/editors/physics/particle_edit.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/physics/particle_edit.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -3884,6 +3884,16 @@
 	DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
 }
 
+int PE_undo_valid(Scene *scene)
+{
+	PTCacheEdit *edit= PE_get_current(scene, OBACT);
+	
+	if(edit) {
+		return (edit->undo.last != edit->undo.first);
+	}
+	return 0;
+}
+
 static void PTCacheUndo_number(Scene *scene, PTCacheEdit *edit, int nr)
 {
 	PTCacheUndo *undo;

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -239,6 +239,27 @@
 	return 0;
 }
 
+int ED_undo_paint_valid(int type, const char *name)
+{
+	UndoStack *stack;
+	
+	if(type == UNDO_PAINT_IMAGE)
+		stack= &ImageUndoStack;
+	else if(type == UNDO_PAINT_MESH)
+		stack= &MeshUndoStack;
+	else 
+		return 0;
+	
+	if(stack->current==NULL);
+	else {
+		if(name && strcmp(stack->current->name, name) == 0)
+			return 1;
+		else
+			return stack->elems.first != stack->elems.last;
+	}
+	return 0;
+}
+
 void ED_undo_paint_free(void)
 {
 	undo_stack_free(&ImageUndoStack);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -114,6 +114,9 @@
 		return;
 	
 	block= uiLayoutGetBlock(pa->layout);
+	
+	if(ED_undo_valid(C, op->type->name)==0)
+		uiLayoutSetEnabled(pa->layout, 0);
 
 	uiBlockSetFunc(block, ED_undo_operator_repeat_cb, op, NULL);
 	

Modified: trunk/blender/source/blender/editors/util/editmode_undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/editmode_undo.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/util/editmode_undo.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -314,6 +314,20 @@
 	}
 }
 
+/* undoname optionally, if NULL it just checks for existing undo steps */
+int undo_editmode_valid(const char *undoname)
+{
+	if(undoname) {
+		UndoElem *uel;
+		
+		for(uel= undobase.last; uel; uel= uel->prev) {
+			if(strcmp(undoname, uel->name)==0)
+				break;
+		}
+		return uel != NULL;
+	}
+	return undobase.last != undobase.first;
+}
 
 /* ************** for interaction with menu/pullown */
 

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/util/undo.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -199,6 +199,52 @@
 	ed_undo_step(C, 0, op->type->name);
 }
 
+/* name optionally, function used to check for operator redo panel */
+int ED_undo_valid(const bContext *C, const char *undoname)
+{
+	Object *obedit= CTX_data_edit_object(C);
+	Object *obact= CTX_data_active_object(C);
+	ScrArea *sa= CTX_wm_area(C);
+	
+	if(sa && sa->spacetype==SPACE_IMAGE) {
+		SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
+		
+		if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) || sima->flag & SI_DRAWTOOL) {
+			return 1;
+		}
+	}
+	
+	if(sa && sa->spacetype==SPACE_TEXT) {
+		return 1;
+	}
+	else if(obedit) {
+		if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
+			return undo_editmode_valid(undoname);
+		}
+	}
+	else {
+		
+		/* if below tests fail, global undo gets executed */
+		
+		if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) {
+			if( ED_undo_paint_valid(UNDO_PAINT_IMAGE, undoname) )
+				return 1;
+		}
+		else if(obact && obact->mode & OB_MODE_SCULPT) {
+			if( ED_undo_paint_valid(UNDO_PAINT_MESH, undoname) )
+				return 1;
+		}
+		else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
+			return PE_undo_valid(CTX_data_scene(C));
+		}
+		
+		if(U.uiflag & USER_GLOBALUNDO) {
+			return BKE_undo_valid(undoname);
+		}
+	}
+	return 0;
+}
+
 static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op))
 {
 	/* "last operator" should disappear, later we can tie ths with undo stack nicer */

Modified: trunk/blender/source/blender/editors/util/util_intern.h
===================================================================
--- trunk/blender/source/blender/editors/util/util_intern.h	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/editors/util/util_intern.h	2011-01-12 18:00:23 UTC (rev 34287)
@@ -34,6 +34,7 @@
 /* editmode_undo.c */
 void undo_editmode_clear(void);
 void undo_editmode_name(bContext *C, const char *undoname);
+int undo_editmode_valid(const char *undoname);
 
 #endif /* ED_UTIL_INTERN_H */
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-01-12 17:57:00 UTC (rev 34286)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2011-01-12 18:00:23 UTC (rev 34287)
@@ -892,6 +892,9 @@
 	uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
 	layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, 20, style);
 
+	if(ED_undo_valid(C, op->type->name)==0)
+		uiLayoutSetEnabled(layout, 0);
+
 	uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
 
 	uiPopupBoundsBlock(block, 4.0f, 0, 0);




More information about the Bf-blender-cvs mailing list