[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 19:23:16 CET 2009


This script lets you intercept each draw call and introspect the UI
after its been created.

just run it and then see the console when your panels & headers redraw
http://www.pasteall.org/9501/python

On Sat, Nov 28, 2009 at 6:45 PM, Campbell Barton <ideasman42 at gmail.com> wrote:
> 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, ")");
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>



-- 
- Campbell



More information about the Bf-blender-cvs mailing list