diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-08-14 14:17:41 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-08-14 14:17:41 +0400 |
commit | 62fdee3d8ae7ea37ed42fc655058c2bf03b38be8 (patch) | |
tree | 8d2a4c95b58a02eba9d479f75e5f75f20d33b4eb /source/blender/editors/interface | |
parent | 8490d646b7ac47fd5f0ed8c28cfc864f5286aa7a (diff) |
fix [#28245] Checkboxes in menu items fail for boolean arrays.
2 bugs with displaying boolean arrays.
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 102 |
1 files changed, 62 insertions, 40 deletions
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index df654cf3645..a8e0ca39c58 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -355,46 +355,65 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, in uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); /* create buttons */ - if(type == PROP_BOOLEAN && ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER)) { - /* special check for layer layout */ - 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; + if(type == PROP_BOOLEAN) { + if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER)) { + /* special check for layer layout */ + 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++) { + 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++) { + 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)); + } + uiBlockEndAlign(block); + + x += colbuts*butw + style->buttonspacex; + } } + else { + /* not common, but good to support non layer boolean arrays */ + int *tmparray= MEM_callocN(sizeof(int)*len, "ui_item_array"); + RNA_property_boolean_get_array(ptr, prop, tmparray); - for(b=0; b<cols; b++) { uiBlockBeginAlign(block); - for(a=0; a<colbuts; a++) { - 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++) { - 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)); + for(a=0; a<len; a++) { + /* always override the icon for boolean arrays */ + icon= tmparray[a] ? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + uiDefAutoButR(block, ptr, prop, a, NULL, icon, 0, 0, w, UI_UNIT_Y); } - uiBlockEndAlign(block); - x += colbuts*butw + style->buttonspacex; + MEM_freeN(tmparray); + + uiBlockEndAlign(block); } } else if(subtype == PROP_MATRIX) { @@ -951,13 +970,14 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index uiBut *but; PropertyType type; char namestr[UI_MAX_NAME_STR]; - int len, w, h, slider, toggle, expand, icon_only, no_bg; + int len, is_array, w, h, slider, toggle, expand, icon_only, no_bg; uiBlockSetCurLayout(block, layout); /* retrieve info */ type= RNA_property_type(prop); - len= RNA_property_array_length(ptr, prop); + is_array= RNA_property_array_check(ptr, prop); + len= (is_array) ? RNA_property_array_length(ptr, prop) : 0; /* set name and icon */ if(!name) @@ -967,14 +987,16 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_POINTER)) name= ui_item_name_add_colon(name, namestr); - else if(type == PROP_BOOLEAN && len && index == RNA_NO_INDEX) + else if(type == PROP_BOOLEAN && is_array && index == RNA_NO_INDEX) name= ui_item_name_add_colon(name, namestr); else if(type == PROP_ENUM && index != RNA_ENUM_VALUE) name= ui_item_name_add_colon(name, namestr); if(layout->root->type == UI_LAYOUT_MENU) { - if(type == PROP_BOOLEAN) - icon= (RNA_property_boolean_get(ptr, prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + if(type == PROP_BOOLEAN && ((is_array == FALSE) || (index != RNA_NO_INDEX))) { + if(is_array) icon= (RNA_property_boolean_get_index(ptr, prop, index)) ? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + else icon= (RNA_property_boolean_get(ptr, prop)) ? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + } else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) { int enum_value= RNA_property_enum_get(ptr, prop); if(RNA_property_flag(prop) & PROP_ENUM_FLAG) { @@ -999,7 +1021,7 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index uiBlockSetEmboss(block, UI_EMBOSSN); /* array property */ - if(index == RNA_NO_INDEX && len > 0) + if(index == RNA_NO_INDEX && is_array) 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) { |