Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-08-14 15:38:17 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-08-14 15:38:17 +0400
commitcad6ed9bc600e9162cdad2410e405fc7ad716e2e (patch)
tree2bbcdc8436273e34f29c4068a6d6b74096ba9fae /source/blender/editors/interface
parent540f0c64b5d42186119a1e1ccdd9aac7edd13960 (diff)
fix for fix r39388, this added checkboxes to buttons which are not supposed to have them.
now only add checkboxes when the background is not emboss - which works for menus but will work in more general cases too.
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r--source/blender/editors/interface/interface_intern.h5
-rw-r--r--source/blender/editors/interface/interface_layout.c130
2 files changed, 64 insertions, 71 deletions
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 8475090b468..242210e01bb 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -213,7 +213,7 @@ struct uiBut {
BIFIconID icon;
char lock;
- char dt;
+ char dt; /* drawtype: UI_EMBOSS, UI_EMBOSSN ... etc, copied from the block */
char changed; /* could be made into a single flag */
unsigned char unit_type; /* so buttons can support unit systems which are not RNA */
short modifier_key;
@@ -306,7 +306,8 @@ struct uiBlock {
void *drawextra_arg2;
int flag;
- char direction, dt;
+ char direction;
+ char dt; /* drawtype: UI_EMBOSS, UI_EMBOSSN ... etc, copied to buttons */
short auto_open;
double auto_open_last;
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index e6df6a07d52..4810b3fdf54 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -355,65 +355,46 @@ 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) {
- 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;
- }
+ 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;
}
- 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<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);
- }
+ for(a=0; a<colbuts; a++) {
+ if(layer_used & (1<<(a+b*colbuts))) icon= ICON_LAYER_USED;
+ else icon= ICON_BLANK1;
- MEM_freeN(tmparray);
+ 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 if(subtype == PROP_MATRIX) {
@@ -441,35 +422,46 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, in
uiDefButR_prop(block, BUT_NORMAL, 0, name, x, y, UI_UNIT_X*3, UI_UNIT_Y*3, ptr, prop, 0, 0, 0, -1, -1, NULL);
}
else {
- if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand)
+ /* note, this block of code is a bit arbitrary and has just been made
+ * to work with common cases, but may need to be re-worked */
+
+ /* special case, boolean array in a menu, this could be used in a more generic way too */
+ if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand) {
uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, 0, 0, w, UI_UNIT_Y);
+ }
+ else {
+ int *boolarr= NULL;
- if(!ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) || expand) {
- /* layout for known array subtypes */
- char str[3];
+ /* even if 'expand' is fale, expanding anyway */
- for(a=0; a<len; a++) {
- str[0]= RNA_property_array_item_char(prop, a);
+ /* layout for known array subtypes */
+ char str[3]= {'\0'};
- if(str[0]) {
- if (icon_only) {
- str[0] = '\0';
- }
- else if(type == PROP_BOOLEAN) {
- str[1]= '\0';
- }
- else {
- str[1]= ':';
- str[2]= '\0';
- }
+ if(!icon_only) {
+ if(type != PROP_BOOLEAN) {
+ str[1]= ':';
}
+ }
+
+ /* show checkboxes for rna on a non-emboss block (menu for eg) */
+ if(type == PROP_BOOLEAN && ELEM(layout->root->block->dt, UI_EMBOSSN, UI_EMBOSSP)) {
+ boolarr= MEM_callocN(sizeof(int)*len, "ui_item_array");
+ RNA_property_boolean_get_array(ptr, prop, boolarr);
+ }
+ for(a=0; a<len; a++) {
+ if(!icon_only) str[0]= RNA_property_array_item_char(prop, a);
+ if(boolarr) icon= boolarr[a] ? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
but= uiDefAutoButR(block, ptr, prop, a, str, icon, 0, 0, w, UI_UNIT_Y);
if(slider && but->type==NUM)
but->type= NUMSLI;
if(toggle && but->type==OPTION)
but->type= TOG;
}
+
+ if(boolarr) {
+ MEM_freeN(boolarr);
+ }
}
}