[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40671] trunk/blender/source/blender: fix 2 bugs with reset-default failing on operators redo panel.

Campbell Barton ideasman42 at gmail.com
Wed Sep 28 20:45:18 CEST 2011


Revision: 40671
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40671
Author:   campbellbarton
Date:     2011-09-28 18:45:17 +0000 (Wed, 28 Sep 2011)
Log Message:
-----------
fix 2 bugs with reset-default failing on operators redo panel.
- The operator its self was registered so resetting the defaults would unhelpfully replace the toolbar with the reset to defaults operator panel.
- The callback for the operator wasnt being used so the settings were changed but the operator didnt re-run.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_ops.c
    trunk/blender/source/blender/makesdna/DNA_ID.h

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2011-09-28 17:57:12 UTC (rev 40670)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2011-09-28 18:45:17 UTC (rev 40671)
@@ -787,6 +787,7 @@
 
 /* Helpers for Operators */
 void uiContextActiveProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
+void uiContextActivePropertyHandle(struct bContext *C);
 void uiContextAnimUpdate(const struct bContext *C);
 void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
 void uiIDContextProperty(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-09-28 17:57:12 UTC (rev 40670)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-09-28 18:45:17 UTC (rev 40671)
@@ -746,7 +746,7 @@
 		 * unforseen conciquences, so best check for ID's we _know_ are not
 		 * handled by undo - campbell */
 		ID *id= but->rnapoin.id.data;
-		if(ELEM(GS(id->name), ID_SCR, ID_WM)) {
+		if(ID_CHECK_UNDO(id) == FALSE) {
 			return FALSE;
 		}
 		else {

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-09-28 17:57:12 UTC (rev 40670)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2011-09-28 18:45:17 UTC (rev 40671)
@@ -5089,19 +5089,16 @@
 	}
 }
 
-/* helper function for insert keyframe, reset to default, etc operators */
-void uiContextActiveProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
+static uiBut *ui_context_rna_button_active(const bContext *C)
 {
+	uiBut *rnabut= NULL;
+
 	ARegion *ar= CTX_wm_region(C);
 
-	memset(ptr, 0, sizeof(*ptr));
-	*prop= NULL;
-	*index= 0;
-
 	while(ar) {
 		uiBlock *block;
 		uiBut *but, *activebut= NULL;
-	
+
 		/* find active button */
 		for(block=ar->uiblocks.first; block; block=block->next) {
 			for(but=block->buttons.first; but; but= but->next) {
@@ -5115,27 +5112,56 @@
 		if(activebut && activebut->rnapoin.data) {
 			uiHandleButtonData *data= activebut->active;
 
-			/* found RNA button */
-			*ptr= activebut->rnapoin;
-			*prop= activebut->rnaprop;
-			*index= activebut->rnaindex;
+			rnabut= activebut;
 
 			/* recurse into opened menu, like colorpicker case */
 			if(data && data->menu && (ar != data->menu->region)) {
 				ar = data->menu->region;
 			}
 			else {
-				return;
+				return rnabut;
 			}
 		}
 		else {
 			/* no active button */
-			return;
+			return rnabut;
 		}
 	}
+
+	return rnabut;
 }
 
 /* helper function for insert keyframe, reset to default, etc operators */
+void uiContextActiveProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
+{
+	uiBut *activebut= ui_context_rna_button_active(C);
+
+	memset(ptr, 0, sizeof(*ptr));
+
+	if(activebut && activebut->rnapoin.data) {
+		*ptr= activebut->rnapoin;
+		*prop= activebut->rnaprop;
+		*index= activebut->rnaindex;
+	}
+	else {
+		*prop= NULL;
+		*index= 0;
+	}
+}
+
+void uiContextActivePropertyHandle(bContext *C)
+{
+	uiBut *activebut= ui_context_rna_button_active(C);
+	if(activebut) {
+		/* TODO, look into a better way to handle the button change
+		 * currently this is mainly so reset defaults works for the
+		 * operator redo panel - campbell */
+		uiBlock *block= activebut->block;
+		block->handle_func(C, block->handle_func_arg, 0);
+	}
+}
+
+/* helper function for insert keyframe, reset to default, etc operators */
 void uiContextAnimUpdate(const bContext *C)
 {
 	Scene *scene= CTX_data_scene(C);

Modified: trunk/blender/source/blender/editors/interface/interface_ops.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_ops.c	2011-09-28 17:57:12 UTC (rev 40670)
+++ trunk/blender/source/blender/editors/interface/interface_ops.c	2011-09-28 18:45:17 UTC (rev 40671)
@@ -295,10 +295,31 @@
 		if(RNA_property_reset(&ptr, prop, (all)? -1: index)) {
 			/* perform updates required for this property */
 			RNA_property_update(C, &ptr, prop);
+
+			/* as if we pressed the button */
+			uiContextActivePropertyHandle(C);
+
 			success= 1;
 		}
 	}
-	
+
+	/* Since we dont want to undo _all_ edits to settings, eg window
+	 * edits on the screen or on operator settings.
+	 * it might be better to move undo's inline - campbell */
+	/* Note that buttons already account for this, it might be better to
+	 * have a way to edit the buttons rather than set the rna since block
+	 * callbacks also fail to run. */
+	if(success) {
+		ID *id= ptr.id.data;
+		if(id && ID_CHECK_UNDO(id)) {
+			/* do nothing, go ahead with undo */
+		}
+		else {
+			return OPERATOR_CANCELLED;
+		}
+	}
+	/* end hack */
+
 	return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
 }
 
@@ -314,7 +335,7 @@
 	ot->exec= reset_default_button_exec;
 
 	/* flags */
-	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+	ot->flag= OPTYPE_UNDO;
 	
 	/* properties */
 	RNA_def_boolean(ot->srna, "all", 1, "All", "Reset to default values all elements of the array");

Modified: trunk/blender/source/blender/makesdna/DNA_ID.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_ID.h	2011-09-28 17:57:12 UTC (rev 40670)
+++ trunk/blender/source/blender/makesdna/DNA_ID.h	2011-09-28 18:45:17 UTC (rev 40671)
@@ -204,6 +204,8 @@
 
 #define ID_REAL_USERS(id) (((ID *)id)->us - ((((ID *)id)->flag & LIB_FAKEUSER) ? 1:0))
 
+#define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM))
+
 #ifdef GS
 #undef GS
 #endif




More information about the Bf-blender-cvs mailing list