diff options
Diffstat (limited to 'source/blender/editors/interface/interface_layout.c')
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 287 |
1 files changed, 193 insertions, 94 deletions
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index e268120fa07..18bee084f40 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -26,14 +26,17 @@ #include <math.h> #include <stdlib.h> #include <string.h> +#include <assert.h> #include "MEM_guardedalloc.h" #include "DNA_screen_types.h" +#include "DNA_armature_types.h" #include "DNA_userdef_types.h" #include "BLI_listbase.h" #include "BLI_string.h" +#include "BLI_utildefines.h" #include "BKE_context.h" #include "BKE_global.h" @@ -152,7 +155,7 @@ typedef struct uiLayoutItemRoot { /************************** Item ***************************/ -static char *ui_item_name_add_colon(char *name, char namestr[UI_MAX_NAME_STR]) +static const char *ui_item_name_add_colon(const char *name, char namestr[UI_MAX_NAME_STR]) { int len= strlen(name); @@ -205,7 +208,7 @@ static int ui_layout_vary_direction(uiLayout *layout) } /* estimated size of text + icon */ -static int ui_text_icon_width(uiLayout *layout, char *name, int icon, int compact) +static int ui_text_icon_width(uiLayout *layout, const char *name, int icon, int compact) { int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X; @@ -326,7 +329,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index) } /* create buttons for an item with an RNA array */ -static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only) +static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only) { uiStyle *style= layout->root->style; uiBut *but; @@ -343,7 +346,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon uiBlockSetCurLayout(block, sub); /* create label */ - if(strcmp(name, "") != 0) + if(name[0]) uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); /* create buttons */ @@ -352,23 +355,35 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon int butw, buth, unit; int cols= (len >= 20)? 2: 1; int colbuts= len/(2*cols); + int layer_used= 0; uiBlockSetCurLayout(block, uiLayoutAbsolute(layout, 0)); unit= UI_UNIT_X*0.75; butw= unit; buth= unit; + + if(ptr->type == &RNA_Armature) { + bArmature *arm= (bArmature *)ptr->data; + layer_used= arm->layer_used; + } for(b=0; b<cols; b++) { uiBlockBeginAlign(block); for(a=0; a<colbuts; a++) { - but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth); + if(layer_used & (1<<(a+b*colbuts))) icon= ICON_LAYER_USED; + else icon= ICON_BLANK1; + + but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", icon, x + butw*a, y+buth, butw, buth); if(subtype == PROP_LAYER_MEMBER) uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+b*colbuts)); } for(a=0; a<colbuts; a++) { - but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", ICON_BLANK1, x + butw*a, y, butw, buth); + if(layer_used & (1<<(a+len/2+b*colbuts))) icon= ICON_LAYER_USED; + else icon= ICON_BLANK1; + + but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", icon, x + butw*a, y, butw, buth); if(subtype == PROP_LAYER_MEMBER) uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+len/2+b*colbuts)); } @@ -393,14 +408,14 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon col= a % dim_size[0]; row= a / dim_size[0]; - but= uiDefAutoButR(block, ptr, prop, a, "", 0, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y); + but= uiDefAutoButR(block, ptr, prop, a, "", ICON_NULL, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y); if(slider && but->type==NUM) but->type= NUMSLI; } } else { if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand) - uiDefAutoButR(block, ptr, prop, -1, "", 0, 0, 0, w, UI_UNIT_Y); + uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, 0, 0, w, UI_UNIT_Y); if(!ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) || expand) { /* layout for known array subtypes */ @@ -434,12 +449,12 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon uiBlockSetCurLayout(block, layout); } -static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only) +static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, const char *uiname, int h, int icon_only) { uiBut *but; EnumPropertyItem *item; const char *identifier; - char *name; + const char *name; int a, totitem, itemw, icon, value, free; identifier= RNA_property_identifier(prop); @@ -450,12 +465,12 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt if(!item[a].identifier[0]) continue; - name= (!uiname || uiname[0])? (char*)item[a].name: ""; + name= (!uiname || uiname[0])? item[a].name: ""; icon= item[a].icon; value= item[a].value; itemw= ui_text_icon_width(block->curlayout, name, icon, 0); - if(icon && strcmp(name, "") != 0 && !icon_only) + if(icon && name[0] && !icon_only) but= uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); else if(icon) but= uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL); @@ -472,7 +487,7 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt } /* callback for keymap item change button */ -static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v) +static void ui_keymap_but_cb(bContext *UNUSED(C), void *but_v, void *UNUSED(key_v)) { uiBut *but= but_v; @@ -483,7 +498,7 @@ static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v) } /* create label + button for RNA property */ -static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag) +static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag) { uiLayout *sub; uiBut *but=NULL; @@ -494,7 +509,7 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i sub= uiLayoutRow(layout, 0); uiBlockSetCurLayout(block, sub); - if(strcmp(name, "") != 0) { + if(name[0]) { /* XXX UI_GetStringWidth is not accurate labelw= UI_GetStringWidth(name); CLAMP(labelw, w/4, 3*w/4);*/ @@ -569,7 +584,7 @@ void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA /********************* Button Items *************************/ /* disabled item */ -static void ui_item_disabled(uiLayout *layout, char *name) +static void ui_item_disabled(uiLayout *layout, const char *name) { uiBlock *block= layout->root->block; uiBut *but; @@ -582,14 +597,14 @@ static void ui_item_disabled(uiLayout *layout, char *name) w= ui_text_icon_width(layout, name, 0, 0); - but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); but->flag |= UI_BUT_DISABLED; but->lock = 1; but->lockstr = ""; } /* operator items */ -PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDProperty *properties, int context, int flag) +PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, IDProperty *properties, int context, int flag) { uiBlock *block= layout->root->block; wmOperatorType *ot= WM_operatortype_find(idname, 0); @@ -614,13 +629,15 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP if (flag & UI_ITEM_R_NO_BG) uiBlockSetEmboss(block, UI_EMBOSSN); - if(icon && strcmp(name, "") != 0) - but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL); + if(icon && name[0]) + but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, name, 0, 0, w, UI_UNIT_Y, NULL); else if(icon) but= uiDefIconButO(block, BUT, ot->idname, context, icon, 0, 0, w, UI_UNIT_Y, NULL); else - but= uiDefButO(block, BUT, ot->idname, context, (char*)name, 0, 0, w, UI_UNIT_Y, NULL); - + but= uiDefButO(block, BUT, ot->idname, context, name, 0, 0, w, UI_UNIT_Y, NULL); + + assert(but->optype != NULL); + /* text alignment for toolbar buttons */ if((layout->root->type == UI_LAYOUT_TOOLBAR) && !icon) but->flag |= UI_TEXT_LEFT; @@ -646,7 +663,7 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP return PointerRNA_NULL; } -static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval) +static const char *ui_menu_enumpropname(uiLayout *layout, const char *opname, const char *propname, int retval) { wmOperatorType *ot= WM_operatortype_find(opname, 0); PointerRNA ptr; @@ -666,7 +683,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free); if(RNA_enum_name(item, retval, &name)) { if(free) MEM_freeN(item); - return (char*)name; + return name; } if(free) @@ -676,7 +693,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname return ""; } -void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value) +void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value) { PointerRNA ptr; @@ -689,7 +706,7 @@ void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *pro uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty *properties, int context, int flag) +void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, IDProperty *properties, int context, int flag) { wmOperatorType *ot= WM_operatortype_find(opname, 0); PointerRNA ptr; @@ -716,20 +733,20 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty for(i=0; i<totitem; i++) { if(item[i].identifier[0]) { if(properties) { - PointerRNA ptr; + PointerRNA tptr; - WM_operator_properties_create(&ptr, opname); - if(ptr.data) { - IDP_FreeProperty(ptr.data); - MEM_freeN(ptr.data); + WM_operator_properties_create(&tptr, opname); + if(tptr.data) { + IDP_FreeProperty(tptr.data); + MEM_freeN(tptr.data); } - ptr.data= IDP_CopyProperty(properties); - RNA_enum_set(&ptr, propname, item[i].value); + tptr.data= IDP_CopyProperty(properties); + RNA_enum_set(&tptr, propname, item[i].value); - uiItemFullO(column, opname, (char*)item[i].name, item[i].icon, ptr.data, context, flag); + uiItemFullO(column, opname, item[i].name, item[i].icon, tptr.data, context, flag); } else - uiItemEnumO(column, opname, (char*)item[i].name, item[i].icon, propname, item[i].value); + uiItemEnumO(column, opname, item[i].name, item[i].icon, propname, item[i].value); } else { if(item[i].name) { @@ -739,11 +756,11 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty block->flag |= UI_BLOCK_NO_FLIP; } - uiItemL(column, (char*)item[i].name, 0); + uiItemL(column, item[i].name, ICON_NULL); bt= block->buttons.last; bt->flag= UI_TEXT_LEFT; } - else + else /* XXX bug here, collums draw bottom item badly */ uiItemS(column); } } @@ -753,13 +770,13 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty } } -void uiItemsEnumO(uiLayout *layout, char *opname, char *propname) +void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname) { uiItemsFullEnumO(layout, opname, propname, NULL, layout->root->opcontext, 0); } /* for use in cases where we have */ -void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str) +void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str) { PointerRNA ptr; @@ -796,7 +813,7 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) +void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value) { PointerRNA ptr; @@ -806,7 +823,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char * uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) +void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value) { PointerRNA ptr; @@ -816,7 +833,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value) +void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value) { PointerRNA ptr; @@ -826,7 +843,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value) +void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value) { PointerRNA ptr; @@ -836,14 +853,14 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0); } -void uiItemO(uiLayout *layout, char *name, int icon, char *opname) +void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname) { uiItemFullO(layout, opname, name, icon, NULL, layout->root->opcontext, 0); } /* RNA property items */ -static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h) +static void ui_item_rna_size(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h) { PropertyType type; PropertySubType subtype; @@ -864,7 +881,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA /* increase height for arrays */ if(index == RNA_NO_INDEX && len > 0) { - if(!name[0] && icon == 0) + if(!name[0] && icon == ICON_NULL) h= 0; if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER)) @@ -875,7 +892,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA h += len*UI_UNIT_Y; } else if(ui_layout_vary_direction(layout) == UI_ITEM_VARY_X) { - if(type == PROP_BOOLEAN && strcmp(name, "") != 0) + if(type == PROP_BOOLEAN && name[0]) w += UI_UNIT_X/5; else if(type == PROP_ENUM) w += UI_UNIT_X/4; @@ -887,7 +904,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA *r_h= h; } -void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, char *name, int icon) +void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, const char *name, int icon) { uiBlock *block= layout->root->block; uiBut *but; @@ -903,8 +920,8 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index /* set name and icon */ if(!name) - name= (char*)RNA_property_ui_name(prop); - if(!icon) + name= RNA_property_ui_name(prop); + if(icon == ICON_NULL) icon= RNA_property_ui_icon(prop); if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_POINTER)) @@ -945,9 +962,9 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index ui_item_array(layout, block, name, icon, ptr, prop, len, 0, 0, w, h, expand, slider, toggle, icon_only); /* enum item */ else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) { - char *identifier= (char*)RNA_property_identifier(prop); + const char *identifier= RNA_property_identifier(prop); - if(icon && strcmp(name, "") != 0 && !icon_only) + if(icon && name[0] && !icon_only) uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL); else if(icon) uiDefIconButR(block, ROW, 0, icon, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL); @@ -956,28 +973,34 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index } /* expanded enum */ else if(type == PROP_ENUM && (expand || RNA_property_flag(prop) & PROP_ENUM_FLAG)) - ui_item_enum_expand(layout, block, ptr, prop, name, 0, 0, w, h, icon_only); + ui_item_enum_expand(layout, block, ptr, prop, name, h, icon_only); /* property with separate label */ else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) { but= ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h, flag); ui_but_add_search(but, ptr, prop, NULL, NULL); + + if(layout->redalert) + uiButSetFlag(but, UI_BUT_REDALERT); } /* single button */ else { - but= uiDefAutoButR(block, ptr, prop, index, (char*)name, icon, 0, 0, w, h); + but= uiDefAutoButR(block, ptr, prop, index, name, icon, 0, 0, w, h); if(slider && but->type==NUM) but->type= NUMSLI; if(toggle && but->type==OPTION) but->type= TOG; + + if(layout->redalert) + uiButSetFlag(but, UI_BUT_REDALERT); } if (no_bg) uiBlockSetEmboss(block, UI_EMBOSS); } -void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *name, int icon) +void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag, const char *name, int icon) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); @@ -990,7 +1013,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char * uiItemFullR(layout, ptr, prop, RNA_NO_INDEX, 0, flag, name, icon); } -void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value) +void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); @@ -1003,7 +1026,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, value, 0, name, icon); } -void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon) +void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon) { PropertyRNA *prop= RNA_struct_find_property(ptr, propname); EnumPropertyItem *item; @@ -1026,7 +1049,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname for(a=0; item[a].identifier; a++) { if(item[a].value == ivalue) { - uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, (char*)item[a].name, item[a].icon); + uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, name ? name : item[a].name, icon ? icon : item[a].icon); break; } } @@ -1035,7 +1058,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname MEM_freeN(item); } -void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname) +void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname) { PropertyRNA *prop; uiBlock *block= layout->root->block; @@ -1058,7 +1081,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname) for(i=0; i<totitem; i++) { if(item[i].identifier[0]) { - uiItemEnumR(column, (char*)item[i].name, 0, ptr, propname, item[i].value); + uiItemEnumR(column, item[i].name, ICON_NULL, ptr, propname, item[i].value); } else { if(item[i].name) { @@ -1068,7 +1091,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname) block->flag |= UI_BLOCK_NO_FLIP; } - uiItemL(column, (char*)item[i].name, 0); + uiItemL(column, item[i].name, ICON_NULL); bt= block->buttons.last; bt->flag= UI_TEXT_LEFT; } @@ -1102,13 +1125,14 @@ int sort_search_items_list(void *a, void *b) return 0; } -static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, uiSearchItems *items) +static void rna_search_cb(const struct bContext *C, void *arg_but, const char *str, uiSearchItems *items) { uiBut *but= arg_but; char *name; int i=0, iconid=0, flag= RNA_property_flag(but->rnaprop); ListBase *items_list= MEM_callocN(sizeof(ListBase), "items_list"); CollItemSearch *cis; + const int skip_filter= !but->changed; /* build a temporary list of relevant items first */ RNA_PROP_BEGIN(&but->rnasearchpoin, itemptr, but->rnasearchprop) { @@ -1140,7 +1164,7 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, ui } if(name) { - if(BLI_strcasestr(name, str)) { + if(skip_filter || BLI_strcasestr(name, str)) { cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch"); cis->name = MEM_dupallocN(name); cis->index = i; @@ -1213,13 +1237,13 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN but->hardmax= MAX2(but->hardmax, 256); but->rnasearchpoin= *searchptr; but->rnasearchprop= searchprop; - but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT|UI_BUT_UNDO; + but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT; uiButSetSearchFunc(but, rna_search_cb, but, NULL, NULL); } } -void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon) +void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon) { PropertyRNA *prop, *searchprop; PropertyType type; @@ -1244,13 +1268,18 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st searchprop= RNA_struct_find_property(searchptr, searchpropname); - if(!searchprop || RNA_property_type(searchprop) != PROP_COLLECTION) { + + if(!searchprop) { printf("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname); return; } + else if (RNA_property_type(searchprop) != PROP_COLLECTION) { + printf("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname); + return; + } /* get icon & name */ - if(!icon) { + if(icon==ICON_NULL) { if(type == PROP_POINTER) icontype= RNA_property_pointer_type(ptr, prop); else @@ -1259,7 +1288,7 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st icon= RNA_struct_ui_icon(icontype); } if(!name) - name= (char*)RNA_property_ui_name(prop); + name= RNA_property_ui_name(prop); /* create button */ block= uiLayoutGetBlock(layout); @@ -1281,7 +1310,7 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt) mt->draw(C, &menu); } -static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN) +static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN) { uiBlock *block= layout->root->block; uiBut *but; @@ -1304,11 +1333,11 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun w -= 10; if(name[0] && icon) - but= uiDefIconTextMenuBut(block, func, arg, icon, (char*)name, 0, 0, w, h, ""); + but= uiDefIconTextMenuBut(block, func, arg, icon, name, 0, 0, w, h, ""); else if(icon) but= uiDefIconMenuBut(block, func, arg, icon, 0, 0, w, h, ""); else - but= uiDefMenuBut(block, func, arg, (char*)name, 0, 0, w, h, ""); + but= uiDefMenuBut(block, func, arg, name, 0, 0, w, h, ""); if(argN) { /* ugly .. */ but->poin= (char*)but; @@ -1323,7 +1352,7 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun } } -void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon) +void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const char *name, int icon) { MenuType *mt; @@ -1343,7 +1372,7 @@ void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon } /* label item */ -static uiBut *uiItemL_(uiLayout *layout, char *name, int icon) +static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon) { uiBlock *block= layout->root->block; uiBut *but; @@ -1358,22 +1387,22 @@ static uiBut *uiItemL_(uiLayout *layout, char *name, int icon) w= ui_text_icon_width(layout, name, icon, 0); - if(icon && strcmp(name, "") != 0) - but= uiDefIconTextBut(block, LABEL, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + if(icon && name[0]) + but= uiDefIconTextBut(block, LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); else if(icon) but= uiDefIconBut(block, LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); else - but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); return but; } -void uiItemL(uiLayout *layout, char *name, int icon) +void uiItemL(uiLayout *layout, const char *name, int icon) { uiItemL_(layout, name, icon); } -void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon) +void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, const char *name, int icon) { uiBut *but= uiItemL_(layout, name, icon); @@ -1384,7 +1413,7 @@ void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon) /* value item */ -void uiItemV(uiLayout *layout, char *name, int icon, int argval) +void uiItemV(uiLayout *layout, const char *name, int icon, int argval) { /* label */ uiBlock *block= layout->root->block; @@ -1400,12 +1429,12 @@ void uiItemV(uiLayout *layout, char *name, int icon, int argval) w= ui_text_icon_width(layout, name, icon, 0); - if(icon && strcmp(name, "") != 0) - uiDefIconTextButF(block, BUTM, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); + if(icon && name[0]) + uiDefIconTextButF(block, BUTM, 0, icon, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); else if(icon) uiDefIconButF(block, BUTM, 0, icon, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); else - uiDefButF(block, BUTM, 0, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); + uiDefButF(block, BUTM, 0, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); } /* separator item */ @@ -1418,7 +1447,7 @@ void uiItemS(uiLayout *layout) } /* level items */ -void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg) +void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg) { if(!func) return; @@ -1428,12 +1457,12 @@ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, typedef struct MenuItemLevel { int opcontext; - char *opname; - char *propname; + const char *opname; + const char *propname; PointerRNA rnapoin; } MenuItemLevel; -static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg) +static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, void *arg) { MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN); @@ -1441,7 +1470,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg) uiItemsEnumO(layout, lvl->opname, lvl->propname); } -void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon) +void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon) { wmOperatorType *ot= WM_operatortype_find(opname, 0); MenuItemLevel *lvl; @@ -1464,7 +1493,7 @@ void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, ui_item_menu(layout, name, icon, menu_item_enum_opname_menu, NULL, lvl); } -static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) +static void menu_item_enum_rna_menu(bContext *UNUSED(C), uiLayout *layout, void *arg) { MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN); @@ -1472,7 +1501,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname); } -void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon) +void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon) { MenuItemLevel *lvl; PropertyRNA *prop; @@ -1484,7 +1513,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, c } if(!name) - name= (char*)RNA_property_ui_name(prop); + name= RNA_property_ui_name(prop); if(layout->root->type == UI_LAYOUT_MENU && !icon) icon= ICON_BLANK1; @@ -1673,7 +1702,7 @@ static void ui_litem_layout_column(uiLayout *litem) } /* root layout */ -static void ui_litem_estimate_root(uiLayout *litem) +static void ui_litem_estimate_root(uiLayout *UNUSED(litem)) { /* nothing to do */ } @@ -2168,6 +2197,7 @@ uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align) split->litem.enabled= 1; split->litem.context= layout->context; split->litem.space= layout->root->style->columnspace; + split->litem.w= layout->w; split->percentage= percentage; BLI_addtail(&layout->items, split); @@ -2546,12 +2576,12 @@ void uiBlockLayoutResolve(uiBlock *block, int *x, int *y) /* XXX silly trick, interface_templates.c doesn't get linked * because it's not used by other files in this module? */ { - void ui_template_fix_linking(); + void ui_template_fix_linking(void); ui_template_fix_linking(); } } -void uiLayoutSetContextPointer(uiLayout *layout, char *name, PointerRNA *ptr) +void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr) { uiBlock *block= layout->root->block; layout->context= CTX_store_add(&block->contexts, name, ptr); @@ -2629,7 +2659,7 @@ static void ui_intro_uiLayout(DynStr *ds, uiLayout *layout) } static char *str = NULL; // XXX, constant re-freeing, far from ideal. -char *uiLayoutIntrospect(uiLayout *layout) +const char *uiLayoutIntrospect(uiLayout *layout) { DynStr *ds= BLI_dynstr_new(); @@ -2643,3 +2673,72 @@ char *uiLayoutIntrospect(uiLayout *layout) return str; } + +/* this function does not initialize the layout, functions can be called on the layout before and after */ +void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag) +{ + if(!op->properties) { + IDPropertyTemplate val = {0}; + op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties"); + } + + if(flag & UI_LAYOUT_OP_SHOW_TITLE) { + uiItemL(layout, op->type->name, ICON_NULL); + } + + /* poll() on this operator may still fail, at the moment there is no nice feedback when this happens + * just fails silently */ + if(!WM_operator_repeat_check(C, op)) { + uiBlockSetButLock(uiLayoutGetBlock(layout), TRUE, "Operator cannot redo"); + uiItemL(layout, "* Redo Unsupported *", ICON_NULL); // XXX, could give some nicer feedback or not show redo panel at all? + } + + if(op->type->ui) { + op->layout= layout; + op->type->ui((bContext*)C, op); + op->layout= NULL; + + /* UI_LAYOUT_OP_SHOW_EMPTY ignored */ + } + else { + wmWindowManager *wm= CTX_wm_manager(C); + PointerRNA ptr; + int empty; + + RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr); + + /* menu */ + if(op->type->flag & OPTYPE_PRESET) { + /* XXX, no simple way to get WM_MT_operator_presets.bl_label from python! Label remains the same always! */ + PointerRNA op_ptr; + uiLayout *row; + + row= uiLayoutRow(layout, TRUE); + uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NULL); + + WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add"); + RNA_string_set(&op_ptr, "operator", op->type->idname); + op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMIN, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0); + + WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add"); + RNA_string_set(&op_ptr, "operator", op->type->idname); + RNA_boolean_set(&op_ptr, "remove_active", 1); + op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0); + } + + /* main draw call */ + empty= uiDefAutoButsRNA(layout, &ptr, check_prop, label_align) == 0; + + if(empty && (flag & UI_LAYOUT_OP_SHOW_EMPTY)) { + uiItemL(layout, "No Properties.", ICON_NULL); + } + } + + /* no undo for buttons for operator redo panels */ + { + uiBut *but; + + for(but= uiLayoutGetBlock(layout)->buttons.first; but; but= but->next) + uiButClearFlag(but, UI_BUT_UNDO); + } +} |