[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