[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24974] trunk/blender/source/blender: experemental UI introspection added for mindrones,

Campbell Barton ideasman42 at gmail.com
Sat Nov 28 18:45:23 CET 2009


Revision: 24974
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24974
Author:   campbellbarton
Date:     2009-11-28 18:45:23 +0100 (Sat, 28 Nov 2009)

Log Message:
-----------
experemental UI introspection added for mindrones,
in python this gives a map of the ui...
 ui_dict = eval(layout.introspect())

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_layout.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2009-11-28 17:30:56 UTC (rev 24973)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2009-11-28 17:45:23 UTC (rev 24974)
@@ -600,6 +600,7 @@
 
 void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
 void uiLayoutSetContextPointer(uiLayout *layout, char *name, struct PointerRNA *ptr);
+char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
 
 void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
 void uiLayoutSetActive(uiLayout *layout, int active);

Modified: trunk/blender/source/blender/editors/interface/interface_layout.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_layout.c	2009-11-28 17:30:56 UTC (rev 24973)
+++ trunk/blender/source/blender/editors/interface/interface_layout.c	2009-11-28 17:45:23 UTC (rev 24974)
@@ -2454,3 +2454,89 @@
 	layout->context= CTX_store_add(&block->contexts, name, ptr);
 }
 
+
+/* introspect funcs */
+#include "BLI_dynstr.h"
+
+static void ui_intro_button(DynStr *ds, uiButtonItem *bitem)
+{
+	uiBut *but = bitem->but;
+	BLI_dynstr_appendf(ds, "'type':%d, ", but->type); /* see ~ UI_interface.h:200 */
+	BLI_dynstr_appendf(ds, "'draw_string':'''%s''', ", but->drawstr);
+	BLI_dynstr_appendf(ds, "'tip':'''%s''', ", but->tip ? but->tip : ""); // not exactly needed, rna has this
+
+	if(but->optype) {
+		char *opstr = WM_operator_pystring(but->block->evil_C, but->optype, but->opptr, 0);
+		BLI_dynstr_appendf(ds, "'operator':'''%s''', ", opstr ? opstr : "");
+		MEM_freeN(opstr);
+	}
+
+	if(but->rnaprop) {
+		BLI_dynstr_appendf(ds, "'rna':'%s.%s[%d]', ", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop), but->rnaindex);
+	}
+
+}
+
+static void ui_intro_items(DynStr *ds, ListBase *lb)
+{
+	uiItem *item;
+
+	BLI_dynstr_append(ds, "[");
+
+	for(item=lb->first; item; item=item->next) {
+
+		BLI_dynstr_append(ds, "{");
+
+		/* could also use the INT but this is nicer*/
+		switch(item->type) {
+		case ITEM_BUTTON:			BLI_dynstr_append(ds, "'type':'BUTTON', ");break;
+		case ITEM_LAYOUT_ROW:		BLI_dynstr_append(ds, "'type':'ROW', "); break;
+		case ITEM_LAYOUT_COLUMN:	BLI_dynstr_append(ds, "'type':'COLUMN', "); break;
+		case ITEM_LAYOUT_COLUMN_FLOW:BLI_dynstr_append(ds, "'type':'COLUMN_FLOW', "); break;
+		case ITEM_LAYOUT_ROW_FLOW:	BLI_dynstr_append(ds, "'type':'ROW_FLOW', "); break;
+		case ITEM_LAYOUT_BOX:		BLI_dynstr_append(ds, "'type':'BOX', "); break;
+		case ITEM_LAYOUT_ABSOLUTE:	BLI_dynstr_append(ds, "'type':'ABSOLUTE', "); break;
+		case ITEM_LAYOUT_SPLIT:		BLI_dynstr_append(ds, "'type':'SPLIT', "); break;
+		case ITEM_LAYOUT_OVERLAP:	BLI_dynstr_append(ds, "'type':'OVERLAP', "); break;
+		case ITEM_LAYOUT_ROOT:		BLI_dynstr_append(ds, "'type':'ROOT', "); break;
+		default:					BLI_dynstr_append(ds, "'type':'UNKNOWN', "); break;
+		}
+
+		switch(item->type) {
+		case ITEM_BUTTON:
+			ui_intro_button(ds, (uiButtonItem *)item);
+			break;
+		default:
+			BLI_dynstr_append(ds, "'items':");
+			ui_intro_items(ds, &((uiLayout*)item)->items);
+			break;
+		}
+
+		BLI_dynstr_append(ds, "}");
+
+		if(item != lb->last)
+			BLI_dynstr_append(ds, ", ");
+	}
+	BLI_dynstr_append(ds, "], ");
+}
+
+static void ui_intro_uiLayout(DynStr *ds, uiLayout *layout)
+{
+	ui_intro_items(ds, &layout->items);
+}
+
+static char *str = NULL; // XXX, constant re-freeing, far from ideal.
+char *uiLayoutIntrospect(uiLayout *layout)
+{
+	DynStr *ds= BLI_dynstr_new();
+
+	if(str)
+		MEM_freeN(str);
+
+	ui_intro_uiLayout(ds, layout);
+
+	str = BLI_dynstr_get_cstring(ds);
+	BLI_dynstr_free(ds);
+
+	return str;
+}

Modified: trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ui_api.c	2009-11-28 17:30:56 UTC (rev 24973)
+++ trunk/blender/source/blender/makesrna/intern/rna_ui_api.c	2009-11-28 17:45:23 UTC (rev 24974)
@@ -348,6 +348,12 @@
 
 	func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
 	RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+
+
+
+	func= RNA_def_function(srna, "introspect", "uiLayoutIntrospect");
+	parm= RNA_def_string(func, "string", "", 1024*1024, "Descr", "DESCR");
+	RNA_def_function_return(func, parm);
 }
 #endif
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2009-11-28 17:30:56 UTC (rev 24973)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2009-11-28 17:45:23 UTC (rev 24974)
@@ -465,8 +465,11 @@
 	PointerRNA opptr_default;
 	PropertyRNA *prop_default;
 	char *buf_default;
-	if(!all_args) {
+	if(all_args==0 || opptr==NULL) {
 		WM_operator_properties_create_ptr(&opptr_default, ot);
+
+		if(opptr==NULL)
+			opptr = &opptr_default;
 	}
 
 
@@ -510,7 +513,7 @@
 	}
 	RNA_PROP_END;
 
-	if(all_args==0)
+	if(all_args==0 || opptr==&opptr_default )
 		WM_operator_properties_free(&opptr_default);
 
 	BLI_dynstr_append(dynstr, ")");





More information about the Bf-blender-cvs mailing list