From 874c9e8c587c9787d7754bb982a72f3caba6be0b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 15 Apr 2009 15:09:36 +0000 Subject: [PATCH] UI: * Added simple row template to layout buttons in a horizontal row, so you don't need to use columns for it. --- source/blender/editors/include/UI_interface.h | 23 ++-- .../blender/editors/interface/interface_api.c | 1 + .../editors/interface/interface_layout.c | 111 +++++++++++++----- 3 files changed, 92 insertions(+), 43 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index d6e451eaf41..52041666679 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -573,6 +573,7 @@ void uiLayoutEnd(const struct bContext *C, uiBlock *block, uiLayout *layout, int #define UI_TSLOT_LR_RIGHT 1 void uiTemplateLeftRight(uiLayout *layout); +void uiTemplateRow(uiLayout *layout); void uiTemplateColumn(uiLayout *layout); void uiTemplateColumnFlow(uiLayout *layout, int columns); uiLayout *uiTemplateStack(uiLayout *layout); @@ -588,21 +589,21 @@ void uiTemplateSetColor(uiLayout *layout, int color); void uiTemplateSlot(uiLayout *layout, int slot); /* items */ -void uiItemO(uiLayout *layout, const char *name, int icon, char *opname); -void uiItemEnumO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value); +void uiItemO(uiLayout *layout, char *name, int icon, char *opname); +void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); void uiItemsEnumO(uiLayout *layout, char *opname, char *propname); -void uiItemBooleanO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value); -void uiItemIntO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value); -void uiItemFloatO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, float value); -void uiItemStringO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, char *value); -void uiItemFullO(uiLayout *layout, const char *name, int icon, char *idname, struct IDProperty *properties, int context); +void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); +void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value); +void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value); +void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value); +void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, struct IDProperty *properties, int context); -void uiItemR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, char *propname); -void uiItemFullR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, char *propname, int index); +void uiItemR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname); +void uiItemFullR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, struct PropertyRNA *prop, int index); -void uiItemL(uiLayout *layout, const char *name, int icon); +void uiItemL(uiLayout *layout, char *name, int icon); -void uiItemM(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func); +void uiItemM(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func); /* utilities */ #define UI_PANEL_WIDTH 340 diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c index 796077eca7c..95793c0c149 100644 --- a/source/blender/editors/interface/interface_api.c +++ b/source/blender/editors/interface/interface_api.c @@ -58,6 +58,7 @@ void RNA_api_ui_layout(StructRNA *srna) }; /* templates */ + func= RNA_def_function(srna, "template_row", "uiTemplateRow"); func= RNA_def_function(srna, "template_column", "uiTemplateColumn"); func= RNA_def_function(srna, "template_left_right", "uiTemplateLeftRight"); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 786d819674c..e6d55e37cfe 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -65,7 +65,7 @@ typedef struct uiItem { uiItemType type; int slot; - const char *name; + char *name; int icon; } uiItem; @@ -94,6 +94,7 @@ typedef struct uiItemLMenu { /* Template */ typedef enum uiTemplateType { + TEMPLATE_ROW, TEMPLATE_COLUMN, TEMPLATE_COLUMN_FLOW, TEMPLATE_LR, @@ -254,11 +255,10 @@ static void ui_item_array(uiBlock *block, uiItemRNA *rnaitem, int len, int x, in uiBlockEndAlign(block); } -/* create lable + button for RNA property */ +/* create label + button for RNA property */ static void ui_item_with_label(uiBlock *block, uiItemRNA *rnaitem, int x, int y, int w, int h) { char *name; - int butw; if(rnaitem->item.name) name= (char*)rnaitem->item.name; @@ -266,11 +266,9 @@ static void ui_item_with_label(uiBlock *block, uiItemRNA *rnaitem, int x, int y, name= (char*)RNA_property_ui_name(&rnaitem->ptr, rnaitem->prop); if(strcmp(name, "") != 0) { - butw= GetButStringLength(name); - uiDefBut(block, LABEL, 0, name, x, y, butw, h, NULL, 0.0, 0.0, 0, 0, ""); - - x += butw; - w -= butw; + w= w/2; + uiDefBut(block, LABEL, 0, name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); + x += w; } uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, rnaitem->index, "", rnaitem->item.icon, x, y, w, h); @@ -342,7 +340,7 @@ static void ui_item_buts(uiBlock *block, uiItem *item, int x, int y, int w, int } /* estimated size of text + icon */ -static int ui_text_icon_width(const char *name, int icon) +static int ui_text_icon_width(char *name, int icon) { if(icon && name && strcmp(name, "") == 0) return XIC; /* icon only */ @@ -357,7 +355,7 @@ static int ui_text_icon_width(const char *name, int icon) /* estimated size of an item */ static void ui_item_size(uiItem *item, int *r_w, int *r_h) { - const char *name; + char *name; int w, h; if(item->type == ITEM_RNA_PROPERTY) { @@ -369,7 +367,7 @@ static void ui_item_size(uiItem *item, int *r_w, int *r_h) name= item->name; if(!name) - name= RNA_property_ui_name(&rnaitem->ptr, rnaitem->prop); + name= (char*)RNA_property_ui_name(&rnaitem->ptr, rnaitem->prop); w= ui_text_icon_width(name, item->icon); h= YIC; @@ -433,7 +431,7 @@ static void ui_item_free(uiItem *item) } /* operator items */ -void uiItemFullO(uiLayout *layout, const char *name, int icon, char *idname, IDProperty *properties, int context) +void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context) { uiTemplate *template= layout->templates.last; wmOperatorType *ot= WM_operatortype_find(idname); @@ -458,7 +456,7 @@ void uiItemFullO(uiLayout *layout, const char *name, int icon, char *idname, IDP BLI_addtail(&template->items, opitem); } -void uiItemEnumO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value) +void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) { PointerRNA ptr; @@ -491,7 +489,7 @@ void uiItemsEnumO(uiLayout *layout, char *opname, char *propname) } } -void uiItemBooleanO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value) +void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) { PointerRNA ptr; @@ -501,7 +499,7 @@ void uiItemBooleanO(uiLayout *layout, const char *name, int icon, char *opname, uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); } -void uiItemIntO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, int value) +void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) { PointerRNA ptr; @@ -511,7 +509,7 @@ void uiItemIntO(uiLayout *layout, const char *name, int icon, char *opname, char uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); } -void uiItemFloatO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, float value) +void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value) { PointerRNA ptr; @@ -521,7 +519,7 @@ void uiItemFloatO(uiLayout *layout, const char *name, int icon, char *opname, ch uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); } -void uiItemStringO(uiLayout *layout, const char *name, int icon, char *opname, char *propname, char *value) +void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value) { PointerRNA ptr; @@ -531,29 +529,22 @@ void uiItemStringO(uiLayout *layout, const char *name, int icon, char *opname, c uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); } -void uiItemO(uiLayout *layout, const char *name, int icon, char *opname) +void uiItemO(uiLayout *layout, char *name, int icon, char *opname) { uiItemFullO(layout, name, icon, opname, NULL, layout->opcontext); } /* RNA property items */ -void uiItemFullR(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, char *propname, int index) +void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index) { uiTemplate *template= layout->templates.last; - PropertyRNA *prop; uiItemRNA *rnaitem; - if(!ptr->data) + if(!ptr->data || !prop) return; if(!template) return; - - prop= RNA_struct_find_property(ptr, propname); - if(!prop){ - printf("uiItemR: property not found: %s\n",propname); - return; - } - + rnaitem= MEM_callocN(sizeof(uiItemRNA), "uiItemRNA"); rnaitem->item.name= name; @@ -568,13 +559,24 @@ void uiItemFullR(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, BLI_addtail(&template->items, rnaitem); } -void uiItemR(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, char *propname) +void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname) { - uiItemFullR(layout, name, icon, ptr, propname, RNA_NO_INDEX); + PropertyRNA *prop; + + prop= RNA_struct_find_property(ptr, propname); + + if(!ptr->data) + return; + if(!prop) { + printf("uiItemR: property not found: %s\n",propname); + return; + } + + uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX); } /* menu item */ -void uiItemM(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func) +void uiItemM(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func) { uiTemplate *template= layout->templates.last; uiItemLMenu *menuitem; @@ -595,7 +597,7 @@ void uiItemM(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func } /* label item */ -void uiItemL(uiLayout *layout, const char *name, int icon) +void uiItemL(uiLayout *layout, char *name, int icon) { uiTemplate *template= layout->templates.last; uiItem *item; @@ -653,6 +655,38 @@ static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *templ *y= miny; } +/* single row layout */ +static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template, int *x, int *y, int w, int h) +{ + uiItem *item; + int totw= 0, maxh= 0, itemw, itemh, leftx; + + /* estimate total width of buttons */ + for(item=template->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + totw += itemw; + maxh= MAX2(maxh, itemh); + } + + if(totw == 0) + return; + + /* create buttons starting from left */ + leftx= *x; + + for(item=template->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + if(totw < w) + itemw= (itemw*w)/totw; + itemw= ui_item_fit(itemw, MAX2(totw, w), w); + + ui_item_buts(block, item, leftx, *y-itemh, itemw, itemh); + leftx += itemw+BUTTON_SPACE_X; + } + + *y -= maxh; +} + /* multi-column layout, automatically flowing to the next */ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *template, int *x, int *y, int w, int h) { @@ -825,6 +859,16 @@ void ui_template_free(uiTemplate *template) } /* template create functions */ +void uiTemplateRow(uiLayout *layout) +{ + uiTemplate *template; + + template= MEM_callocN(sizeof(uiTemplate), "uiTemplate"); + template->type= TEMPLATE_ROW; + + BLI_addtail(&layout->templates, template); +} + void uiTemplateColumn(uiLayout *layout) { uiTemplate *template; @@ -930,6 +974,9 @@ static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *lay } switch(template->type) { + case TEMPLATE_ROW: + ui_layout_row(layout, block, template, &layout->x, &layout->y, layout->w, layout->h); + break; case TEMPLATE_COLUMN: ui_layout_column(layout, block, template, &layout->x, &layout->y, layout->w, layout->h); break;