[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19755] branches/blender2.5/blender/source /blender: Drivers: UI working + bugfixes

Joshua Leung aligorith at gmail.com
Thu Apr 16 14:38:44 CEST 2009


Revision: 19755
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19755
Author:   aligorith
Date:     2009-04-16 14:38:44 +0200 (Thu, 16 Apr 2009)

Log Message:
-----------
Drivers: UI working + bugfixes

* The UI for adding and modifying drivers is now functional, and reflects the new way they work. It has also been tidied up a bit (from the previous incarnation), with RNA buttons starting to be used (currently limited to the 'Path' settings).
* Fixed errors in RNA wrapping for drivers

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_action.c

Modified: branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c	2009-04-16 12:17:58 UTC (rev 19754)
+++ branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c	2009-04-16 12:38:44 UTC (rev 19755)
@@ -157,8 +157,7 @@
 	//WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
 }
 
-#if 0
-
+#if 0 // XXX replace this for RNA
 /* callback to copy over RNA-Paths accordingly */
 static void driver_rnapath_copy_cb (bContext *C, void *driver_v, void *strbuf_v)
 {
@@ -170,6 +169,7 @@
 		MEM_freeN(driver->rna_path);
 	driver->rna_path= BLI_strdupn(stringBuf, strlen(stringBuf));
 }
+#endif
 
 /* callback to remove the active driver */
 static void driver_remove_cb (bContext *C, void *ale_v, void *dummy_v)
@@ -186,6 +186,25 @@
 	ANIM_remove_driver(id, fcu->rna_path, fcu->array_index, 0);
 }
 
+/* callback to add a target variable to the active driver */
+static void driver_add_var_cb (bContext *C, void *driver_v, void *dummy_v)
+{
+	ChannelDriver *driver= (ChannelDriver *)driver_v;
+	
+	/* add a new var */
+	driver_add_new_target(driver);
+}
+
+/* callback to remove target variable from active driver */
+static void driver_delete_var_cb (bContext *C, void *driver_v, void *dtar_v)
+{
+	ChannelDriver *driver= (ChannelDriver *)driver_v;
+	DriverTarget *dtar= (DriverTarget *)dtar_v;
+	
+	/* add a new var */
+	driver_free_target(driver, dtar);
+}
+
 /* callback to reset the driver's flags */
 static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v)
 {
@@ -196,14 +215,17 @@
 	driver->flag &= ~DRIVER_FLAG_INVALID;
 }
 
-#endif
 
 static void graph_panel_drivers(const bContext *C, ARegion *ar, short cntrl, bAnimListElem *ale)	
 {
 	FCurve *fcu= (FCurve *)ale->data;
 	ChannelDriver *driver= fcu->driver;
+	DriverTarget *dtar;
+	
+	PointerRNA rna_ptr;
 	uiBlock *block;
 	uiBut *but;
+	int yco=85, i=0;
 
 	block= uiBeginBlock(C, ar, "graph_panel_drivers", UI_EMBOSS);
 	if (uiNewPanel(C, ar, block, "Drivers", "Graph", 340, 30, 318, 254)==0) return;
@@ -212,7 +234,6 @@
 	/* to force height */
 	uiNewPanelHeight(block, 204);
 	
-#if 0
 	/* general actions */
 	but= uiDefBut(block, BUT, B_IPO_DEPCHANGE, "Update Dependencies", 10, 200, 180, 22, NULL, 0.0, 0.0, 0, 0, "Force updates of dependencies");
 	uiButSetFunc(but, driver_update_flags_cb, fcu, NULL);
@@ -223,56 +244,73 @@
 	/* type */
 	uiDefBut(block, LABEL, 1, "Type:",					10, 170, 60, 20, NULL, 0.0, 0.0, 0, 0, "");
 	uiDefButI(block, MENU, B_IPO_DEPCHANGE,
-					"Driver Type%t|Transform Channel%x0|Scripted Expression%x1|Rotational Difference%x2", 
-					70,170,230,20, &driver->type, 0, 0, 0, 0, "Driver type");
-					
-	/* buttons to draw depends on type of driver */
-	if (driver->type == DRIVER_TYPE_PYTHON) { /* PyDriver */
-		uiDefBut(block, TEX, B_REDR, "Expr: ", 10,130,300,20, driver->expression, 0, 255, 0, 0, "One-liner Python Expression to use as Scripted Expression");
+					"Driver Type%t|Normal%x0|Scripted Expression%x1|Rotational Difference%x2", 
+					70,170,240,20, &driver->type, 0, 0, 0, 0, "Driver type");
+	
+	/* show expression box if doing scripted drivers */
+	if (driver->type == DRIVER_TYPE_PYTHON) {
+		uiDefBut(block, TEX, B_REDR, "Expr: ", 10,150,300,20, driver->expression, 0, 255, 0, 0, "One-liner Python Expression to use as Scripted Expression");
 		
 		/* errors */
 		if (driver->flag & DRIVER_FLAG_INVALID) {
-			uiDefIconBut(block, LABEL, 1, ICON_ERROR, 10, 110, 32, 32, NULL, 0, 0, 0, 0, ""); // a bit larger
+			uiDefIconBut(block, LABEL, 1, ICON_ERROR, 10, 130, 48, 48, NULL, 0, 0, 0, 0, ""); // a bit larger
 			uiDefBut(block, LABEL, 0, "Error: invalid Python expression",
-					30,110,230,19, NULL, 0, 0, 0, 0, "");
+					50,110,230,19, NULL, 0, 0, 0, 0, "");
 		}
 	}
-	else { /* Channel or RotDiff - RotDiff just has extra settings */
-		/* Driver Object */
-		uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR,
-			               "Ob: ", 10, 130, 150, 20, &driver->id, "Object to use as Driver target");
+	else {
+		/* errors */
+		if (driver->flag & DRIVER_FLAG_INVALID) {
+			uiDefIconBut(block, LABEL, 1, ICON_ERROR, 10, 130, 48, 48, NULL, 0, 0, 0, 0, ""); // a bit larger
+			uiDefBut(block, LABEL, 0, "Error: invalid target channel(s)",
+					50,130,230,19, NULL, 0, 0, 0, 0, "");
+		}
+	}
+	
+	but= uiDefBut(block, BUT, B_IPO_DEPCHANGE, "Add Variable", 10, 110, 300, 20, NULL, 0.0, 0.0, 0, 0, "Add a new target variable for this Driver");
+	uiButSetFunc(but, driver_add_var_cb, driver, NULL);
+	
+	/* loop over targets, drawing them */
+	for (dtar= driver->targets.first; dtar; dtar= dtar->next) {
+		short height = 60;
 		
+		/* variable name */
+		uiDefButC(block, TEX, B_REDR, "Name: ", 10,yco,280,20, dtar->name, 0, 63, 0, 0, "Name of target variable.");
+		
+		/* remove button */
+		but= uiDefIconBut(block, BUT, B_REDR, ICON_X, 290, yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete target variable.");
+		uiButSetFunc(but, driver_delete_var_cb, driver, dtar);
+		
+		
+		/* Target Object */
+		uiDefBut(block, LABEL, 1, "Value:",	10, yco-30, 60, 20, NULL, 0.0, 0.0, 0, 0, "");
+		uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_REDR, "Ob: ", 70, yco-30, 240, 20, &dtar->id, "Object to use as Driver target");
+		
 		// XXX should we hide these technical details?
-		if (driver->id) {
-			static char pathBuf[512]; 	/* bad... evil... */
-		
-			/* Array Index */
-			// XXX ideally this is grouped with the path, but that can get quite long...
-			uiDefButI(block, NUM, B_REDR, "Index: ", 170,130,140,20, &driver->array_index, 0, INT_MAX, 0, 0, "Index to the specific property used as Driver if applicable.");
+		if (dtar->id) {
+			/* increase height by one row */
+			height += 20;
 			
-			/* RNA Path */
-			if (driver->rna_path == NULL)
-				pathBuf[0]= '\0';
-			else
-				BLI_snprintf(pathBuf, 512, driver->rna_path);
-			
-			but= uiDefButC(block, TEX, B_REDR, "Path: ", 10,100,300,20, pathBuf, 0, 511, 0, 0, "RNA Path (from Driver Object) to property used as Driver.");
-			uiButSetFunc(but, driver_rnapath_copy_cb, driver, pathBuf);
+			uiBlockBeginAlign(block);
+				/* RNA Path */
+				RNA_pointer_create(ale->id, &RNA_DriverTarget, dtar, &rna_ptr);
+				uiDefButR(block, TEX, 0, "Path: ", 10, yco-50, 250, 20, &rna_ptr, "rna_path", 0, 0, 0, -1, -1, "RNA Path (from Driver Object) to property used as Driver.");
+					
+				/* Array Index */
+				uiDefButI(block, NUM, B_REDR, "", 260,yco-50,50,20, &dtar->array_index, 0, INT_MAX, 0, 0, "Index to the specific property used as Driver if applicable.");
+			uiBlockEndAlign(block);
 		}
 		
-		/* for rotational difference, show second target... */
-		if (driver->type == DRIVER_TYPE_ROTDIFF) {
-			// TODO...
-		}
-		
-		/* errors */
-		if (driver->flag & DRIVER_FLAG_INVALID) {
-			uiDefIconBut(block, LABEL, 1, ICON_ERROR, 10, 70, 32, 32, NULL, 0, 0, 0, 0, ""); // a bit larger
-			uiDefBut(block, LABEL, 0, "Error: invalid target channel",
-					30,70,230,19, NULL, 0, 0, 0, 0, "");
-		}
+		/* adjust y-coordinate for next target */
+		yco -= height;
+		i++;
 	}
-#endif
+	
+	/* since these buttons can have variable height */
+	if (yco < 0)
+		uiNewPanelHeight(block, (204 - yco));
+	else
+		uiNewPanelHeight(block, 204);
 }
 
 /* ******************* f-modifiers ******************************** */

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_action.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_action.c	2009-04-16 12:17:58 UTC (rev 19754)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_action.c	2009-04-16 12:38:44 UTC (rev 19755)
@@ -145,7 +145,8 @@
 		{DRIVER_TYPE_ROTDIFF, "ROTDIFF", "Rotational Difference", ""},
 		{0, NULL, NULL, NULL}};
 
-	srna= RNA_def_struct(brna, "ChannelDriver", NULL);
+	srna= RNA_def_struct(brna, "Driver", NULL);
+	RNA_def_struct_sdna(srna, "ChannelDriver");
 	RNA_def_struct_ui_text(srna, "Driver", "Driver for the value of a setting based on an external value.");
 
 	/* Enums */





More information about the Bf-blender-cvs mailing list