diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-06-07 17:20:41 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-06-07 17:20:41 +0400 |
commit | 1c9079d6e1ea8912a5b5901026e6f4446dea0527 (patch) | |
tree | 0a9fe3be6b9854f88b1a4ec9e69f3eb58e4a4460 | |
parent | c1135d489bf7c41b2e081b593bac08e62bf980a3 (diff) |
UI:
* layout.split() now takes a percentage argument to control
the split position.
* ID template now works for more than just the Text ID type,
includes and icon, and some other fixes.
-rw-r--r-- | release/ui/space_text.py | 2 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 4 | ||||
-rw-r--r-- | source/blender/editors/include/UI_resources.h | 4 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_api.c | 3 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 45 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_templates.c | 107 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_utils.c | 2 |
7 files changed, 97 insertions, 70 deletions
diff --git a/release/ui/space_text.py b/release/ui/space_text.py index d4187c10b69..5c6c5c0d21b 100644 --- a/release/ui/space_text.py +++ b/release/ui/space_text.py @@ -38,7 +38,7 @@ class TEXT_HT_header(bpy.types.Header): row.itemR(st, "syntax_highlight", text="", icon=ICON_SYNTAX_OFF) # row.itemR(st, "do_python_plugins", text="", icon=ICON_SCRIPTPLUGINS) - layout.template_header_ID(context, st, "text", new="TEXT_OT_new", open="TEXT_OT_open", unlink="TEXT_OT_unlink") + layout.template_ID(context, st, "text", new="TEXT_OT_new", open="TEXT_OT_open", unlink="TEXT_OT_unlink") if text: row = layout.row() diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 53fcf581f7e..cb105f2ea3e 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -594,13 +594,13 @@ uiLayout *uiLayoutColumn(uiLayout *layout, int align); uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align); uiLayout *uiLayoutBox(uiLayout *layout); uiLayout *uiLayoutFree(uiLayout *layout, int align); -uiLayout *uiLayoutSplit(uiLayout *layout); +uiLayout *uiLayoutSplit(uiLayout *layout, float percentage); uiBlock *uiLayoutFreeBlock(uiLayout *layout); /* templates */ void uiTemplateHeader(uiLayout *layout, struct bContext *C); -void uiTemplateHeaderID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, +void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop); uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr); uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr); diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index 5339a255dbc..6fa0eb90c5f 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -83,8 +83,8 @@ typedef enum { ICON_CHECKBOX_HLT, ICON_UNLOCKED, ICON_LOCKED, - ICON_BLANK013, - ICON_BLANK014, + ICON_PINNED, + ICON_UNPINNED, ICON_BLANK015, ICON_RIGHTARROW, ICON_DOWNARROW_HLT, diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c index 5aff0c0ad82..6aed1bc0b52 100644 --- a/source/blender/editors/interface/interface_api.c +++ b/source/blender/editors/interface/interface_api.c @@ -86,6 +86,7 @@ void RNA_api_ui_layout(StructRNA *srna) func= RNA_def_function(srna, "split", "uiLayoutSplit"); parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); RNA_def_function_return(func, parm); + RNA_def_float(func, "percentage", 0.5f, 0.0f, 1.0f, "Percentage", "Percentage of width to split at.", 0.0f, 1.0f); /* items */ func= RNA_def_function(srna, "itemR", "uiItemR"); @@ -193,7 +194,7 @@ void RNA_api_ui_layout(StructRNA *srna) parm= RNA_def_pointer(func, "context", "Context", "", "Current context."); RNA_def_property_flag(parm, PROP_REQUIRED); - func= RNA_def_function(srna, "template_header_ID", "uiTemplateHeaderID"); + func= RNA_def_function(srna, "template_ID", "uiTemplateID"); parm= RNA_def_pointer(func, "context", "Context", "", "Current context."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property."); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 8ef1cd32f22..ea576ad7263 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -147,17 +147,16 @@ typedef struct uiLayoutItemFlow { int totcol; } uiLayoutItemFlow; -typedef struct uiLayoutItemSplt { - uiLayout litem; - int number; - int lr; -} uiLayoutItemSplt; - typedef struct uiLayoutItemBx { uiLayout litem; uiBut *roundbox; } uiLayoutItemBx; +typedef struct uiLayoutItemSplt { + uiLayout litem; + float percentage; +} uiLayoutItemSplt; + typedef struct uiLayoutItemRoot { uiLayout litem; } uiLayoutItemRoot; @@ -1084,7 +1083,7 @@ static void ui_litem_layout_row(uiLayout *litem) x += neww; - if(neww < minw && w != 0) { + if((neww < minw || itemw == minw) && w != 0) { /* fixed size */ item->flag= 1; fixedw += minw; @@ -1450,12 +1449,12 @@ static void ui_litem_estimate_split(uiLayout *litem) static void ui_litem_layout_split(uiLayout *litem) { + uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem; uiItem *item; int itemh, x, y, w, tot=0, colw=0; x= litem->x; y= litem->y; - w= litem->w; for(item=litem->items.first; item; item=item->next) tot++; @@ -1463,7 +1462,8 @@ static void ui_litem_layout_split(uiLayout *litem) if(tot == 0) return; - colw= (litem->w - (tot-1)*litem->space)/tot; + w= (litem->w - (tot-1)*litem->space); + colw= w*split->percentage; colw= MAX2(colw, 0); for(item=litem->items.first; item; item=item->next) { @@ -1472,8 +1472,12 @@ static void ui_litem_layout_split(uiLayout *litem) ui_item_position(item, x, y-itemh, colw, itemh); x += colw; - if(item->next) + if(item->next) { + colw= (w - (w*split->percentage))/(tot-1); + colw= MAX2(colw, 0); + x += litem->space; + } } litem->w= x - litem->x; @@ -1589,18 +1593,23 @@ uiBlock *uiLayoutFreeBlock(uiLayout *layout) return block; } -uiLayout *uiLayoutSplit(uiLayout *layout) +uiLayout *uiLayoutSplit(uiLayout *layout, float percentage) { - uiLayout *litem; + uiLayoutItemSplt *split; - litem= uiLayoutRow(layout, 0); - litem->item.type = ITEM_LAYOUT_SPLIT; - litem->root= layout->root; - litem->space= layout->root->style->columnspace; + split= MEM_callocN(sizeof(uiLayoutItemSplt), "uiLayoutItemSplt"); + split->litem.item.type= ITEM_LAYOUT_SPLIT; + split->litem.root= layout->root; + split->litem.active= 1; + split->litem.enabled= 1; + split->litem.context= layout->context; + split->litem.space= layout->root->style->columnspace; + split->percentage= (percentage == 0.0f)? 0.5f: percentage; + BLI_addtail(&layout->items, split); - uiBlockSetCurLayout(layout->root->block, litem); + uiBlockSetCurLayout(layout->root->block, &split->litem); - return litem; + return &split->litem; } void uiLayoutSetActive(uiLayout *layout, int active) diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index d5b48c3da6d..1d44fc90ce9 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -23,6 +23,7 @@ */ #include <stdlib.h> +#include <string.h> #include "MEM_guardedalloc.h" @@ -59,7 +60,7 @@ void uiTemplateHeader(uiLayout *layout, bContext *C) /******************* Header ID Template ************************/ -typedef struct TemplateHeaderID { +typedef struct TemplateID { PointerRNA ptr; PropertyRNA *prop; @@ -69,14 +70,16 @@ typedef struct TemplateHeaderID { char newop[256]; char openop[256]; char unlinkop[256]; -} TemplateHeaderID; + + short idtype; +} TemplateID; -static void template_header_id_cb(bContext *C, void *arg_litem, void *arg_event) +static void template_id_cb(bContext *C, void *arg_litem, void *arg_event) { - TemplateHeaderID *template= (TemplateHeaderID*)arg_litem; + TemplateID *template= (TemplateID*)arg_litem; PointerRNA idptr= RNA_property_pointer_get(&template->ptr, template->prop); ID *idtest, *id= idptr.data; - ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); + ListBase *lb= wich_libbase(CTX_data_main(C), template->idtype); int nr, event= GET_INT_FROM_POINTER(arg_event); if(event == UI_ID_BROWSE && template->browse == 32767) @@ -110,9 +113,10 @@ static void template_header_id_cb(bContext *C, void *arg_litem, void *arg_event) } break; } -#if 0 case UI_ID_DELETE: - id= NULL; + memset(&idptr, 0, sizeof(idptr)); + RNA_property_pointer_set(&template->ptr, template->prop, idptr); + RNA_property_update(C, &template->ptr, template->prop); break; case UI_ID_FAKE_USER: if(id) { @@ -121,7 +125,6 @@ static void template_header_id_cb(bContext *C, void *arg_litem, void *arg_event) } else return; break; -#endif case UI_ID_PIN: break; case UI_ID_ADD_NEW: @@ -145,22 +148,26 @@ static void template_header_id_cb(bContext *C, void *arg_litem, void *arg_event) } } -static void template_header_ID(bContext *C, uiBlock *block, TemplateHeaderID *template) +static void template_header_ID(bContext *C, uiBlock *block, TemplateID *template, StructRNA *type) { uiBut *but; - TemplateHeaderID *duptemplate; + TemplateID *duptemplate; PointerRNA idptr; ListBase *lb; - int x= 0, y= 0; idptr= RNA_property_pointer_get(&template->ptr, template->prop); - lb= wich_libbase(CTX_data_main(C), ID_TXT); + lb= wich_libbase(CTX_data_main(C), template->idtype); + + if(idptr.type) + type= idptr.type; + if(type) + uiDefIconBut(block, LABEL, 0, RNA_struct_ui_icon(type), 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); uiBlockBeginAlign(block); if(template->flag & UI_ID_BROWSE) { char *extrastr, *str; - if((template->flag & UI_ID_ADD_NEW) && (template->flag && UI_ID_OPEN)) + if((template->flag & UI_ID_ADD_NEW) && (template->flag & UI_ID_OPEN)) extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767"; else if(template->flag & UI_ID_ADD_NEW) extrastr= "ADD NEW %x 32767"; @@ -172,9 +179,8 @@ static void template_header_ID(bContext *C, uiBlock *block, TemplateHeaderID *te duptemplate= MEM_dupallocN(template); IDnames_to_pupstring(&str, NULL, extrastr, lb, idptr.data, &duptemplate->browse); - but= uiDefButS(block, MENU, 0, str, x, y, UI_UNIT_X, UI_UNIT_Y, &duptemplate->browse, 0, 0, 0, 0, "Browse existing choices, or add new"); - uiButSetNFunc(but, template_header_id_cb, duptemplate, SET_INT_IN_POINTER(UI_ID_BROWSE)); - x+= UI_UNIT_X; + but= uiDefButS(block, MENU, 0, str, 0, 0, UI_UNIT_X, UI_UNIT_Y, &duptemplate->browse, 0, 0, 0, 0, "Browse existing choices, or add new"); + uiButSetNFunc(but, template_id_cb, duptemplate, SET_INT_IN_POINTER(UI_ID_BROWSE)); MEM_freeN(str); } @@ -183,40 +189,46 @@ static void template_header_ID(bContext *C, uiBlock *block, TemplateHeaderID *te if(idptr.data) { char name[64]; - text_idbutton(idptr.data, name); - but= uiDefButR(block, TEX, 0, name, x, y, UI_UNIT_X*6, UI_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL); - uiButSetNFunc(but, template_header_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME)); - x += UI_UNIT_X*6; + //text_idbutton(idptr.data, name); + name[0]= '\0'; + but= uiDefButR(block, TEX, 0, name, 0, 0, UI_UNIT_X*6, UI_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL); + uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME)); /* delete button */ if(template->flag & UI_ID_DELETE) { - but= uiDefIconButO(block, BUT, template->unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, x, y, UI_UNIT_X, UI_UNIT_Y, NULL); - x += UI_UNIT_X; + if(template->unlinkop[0]) { + but= uiDefIconButO(block, BUT, template->unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL); + } + else { + but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, NULL); + uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_DELETE)); + } } } uiBlockEndAlign(block); } -void uiTemplateHeaderID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) +void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) { - TemplateHeaderID *template; + TemplateID *template; uiBlock *block; PropertyRNA *prop; + StructRNA *type; if(!ptr->data) return; prop= RNA_struct_find_property(ptr, propname); - if(!prop) { - printf("uiTemplateHeaderID: property not found: %s\n", propname); + if(!prop || RNA_property_type(prop) != PROP_POINTER) { + printf("uiTemplateID: pointer property not found: %s\n", propname); return; } - template= MEM_callocN(sizeof(TemplateHeaderID), "TemplateHeaderID"); + template= MEM_callocN(sizeof(TemplateID), "TemplateID"); template->ptr= *ptr; template->prop= prop; - template->flag= UI_ID_BROWSE|UI_ID_RENAME; + template->flag= UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE; if(newop) { template->flag |= UI_ID_ADD_NEW; @@ -226,13 +238,17 @@ void uiTemplateHeaderID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *pr template->flag |= UI_ID_OPEN; BLI_strncpy(template->openop, openop, sizeof(template->openop)); } - if(unlinkop) { - template->flag |= UI_ID_DELETE; + if(unlinkop) BLI_strncpy(template->unlinkop, unlinkop, sizeof(template->unlinkop)); - } - block= uiLayoutFreeBlock(layout); - template_header_ID(C, block, template); + type= RNA_property_pointer_type(ptr, prop); + template->idtype = RNA_type_to_ID_code(type); + + if(template->idtype) { + uiLayoutRow(layout, 1); + block= uiLayoutGetBlock(layout); + template_header_ID(C, block, template, type); + } MEM_freeN(template); } @@ -1311,19 +1327,20 @@ void uiTemplatePreview(uiLayout *layout, ID *id) uiBlockSetHandleFunc(block, do_preview_buttons, NULL); - if(GS(id->name) == ID_MA) { - ma= (Material*)id; - - uiLayoutColumn(row, 1); - - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATPLANE, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_FLAT, 0, 0, "Preview type: Flat XY plane"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE, 0, 0, "Preview type: Sphere"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATCUBE, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_CUBE, 0, 0, "Preview type: Cube"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MONKEY, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_MONKEY, 0, 0, "Preview type: Monkey"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_HAIR, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_HAIR, 0, 0, "Preview type: Hair strands"); - uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky"); + if(id) { + if(GS(id->name) == ID_MA) { + ma= (Material*)id; + + uiLayoutColumn(row, 1); + + uiDefIconButC(block, ROW, B_MATPRV, ICON_MATPLANE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_FLAT, 0, 0, "Preview type: Flat XY plane"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE, 0, 0, "Preview type: Sphere"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_MATCUBE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_CUBE, 0, 0, "Preview type: Cube"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_MONKEY, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_MONKEY, 0, 0, "Preview type: Monkey"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_HAIR, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_HAIR, 0, 0, "Preview type: Hair strands"); + uiDefIconButC(block, ROW, B_MATPRV, ICON_MATSPHERE, 0, 0,UI_UNIT_X*1.5,UI_UNIT_Y, &(ma->pr_type), 10, MA_SPHERE_A, 0, 0, "Preview type: Large sphere with sky"); + } } - } /********************** ColorRamp Template **************************/ diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index 97ae2c01c55..fa7de1151a3 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -155,7 +155,7 @@ void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr) if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) continue; - split = uiLayoutSplit(layout); + split = uiLayoutSplit(layout, 0.5f); name= (char*)RNA_property_ui_name(prop); |