diff options
Diffstat (limited to 'source/blender/editors/interface/interface_layout.c')
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 154 |
1 files changed, 134 insertions, 20 deletions
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 3fa0a8849fe..2e123c28339 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -126,11 +126,18 @@ struct uiLayout { uiItem item; uiLayoutRoot *root; + bContextStore *context; ListBase items; int x, y, w, h; - int space; - int align; + float scale; + short space; + char align; + char active; + char enabled; + char redalert; + char keepaspect; + char alignment; }; typedef struct uiLayoutItemFlow { @@ -648,7 +655,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA subtype= RNA_property_subtype(prop); len= RNA_property_array_length(prop); - if(type == PROP_STRING) + if(ELEM(type, PROP_STRING, PROP_ENUM)) w += 10*UI_UNIT_X; /* increase height for arrays */ @@ -672,7 +679,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA *r_h= h; } -void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int expand, int slider) +void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int expand, int slider, int toggle) { uiBlock *block= layout->root->block; uiBut *but; @@ -734,10 +741,13 @@ void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, Proper if(slider && but->type==NUM) but->type= NUMSLI; + + if(toggle && but->type==OPTION) + but->type= TOG; } } -void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider) +void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider, int toggle) { PropertyRNA *prop; @@ -752,7 +762,7 @@ void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *prop return; } - uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, expand, slider); + uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, expand, slider, toggle); } void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value) @@ -770,7 +780,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, return; } - uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0, 0); + uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0, 0, 0); } void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname) @@ -942,7 +952,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg) { MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN); - uiLayoutContext(layout, WM_OP_EXEC_REGION_WIN); + uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN); uiItemsEnumO(layout, lvl->opname, lvl->propname); } @@ -973,7 +983,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) { MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN); - uiLayoutContext(layout, lvl->opcontext); + uiLayoutSetOperatorContext(layout, lvl->opcontext); uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname); } @@ -1431,6 +1441,9 @@ uiLayout *uiLayoutRow(uiLayout *layout, int align) litem->item.type= ITEM_LAYOUT_ROW; litem->root= layout->root; litem->align= align; + litem->active= 1; + litem->enabled= 1; + litem->context= layout->context; litem->space= (align)? 0: layout->root->style->buttonspacex; BLI_addtail(&layout->items, litem); @@ -1447,6 +1460,9 @@ uiLayout *uiLayoutColumn(uiLayout *layout, int align) litem->item.type= ITEM_LAYOUT_COLUMN; litem->root= layout->root; litem->align= align; + litem->active= 1; + litem->enabled= 1; + litem->context= layout->context; litem->space= (litem->align)? 0: layout->root->style->buttonspacey; BLI_addtail(&layout->items, litem); @@ -1463,6 +1479,9 @@ uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align) flow->litem.item.type= ITEM_LAYOUT_COLUMN_FLOW; flow->litem.root= layout->root; flow->litem.align= align; + flow->litem.active= 1; + flow->litem.enabled= 1; + flow->litem.context= layout->context; flow->litem.space= (flow->litem.align)? 0: layout->root->style->columnspace; flow->number= number; BLI_addtail(&layout->items, flow); @@ -1479,6 +1498,9 @@ uiLayout *uiLayoutBox(uiLayout *layout) box= MEM_callocN(sizeof(uiLayoutItemBx), "uiLayoutItemBx"); box->litem.item.type= ITEM_LAYOUT_BOX; box->litem.root= layout->root; + box->litem.active= 1; + box->litem.enabled= 1; + box->litem.context= layout->context; box->litem.space= layout->root->style->columnspace; BLI_addtail(&layout->items, box); @@ -1497,6 +1519,9 @@ uiLayout *uiLayoutFree(uiLayout *layout, int align) litem->item.type= ITEM_LAYOUT_FREE; litem->root= layout->root; litem->align= align; + litem->active= 1; + litem->enabled= 1; + litem->context= layout->context; BLI_addtail(&layout->items, litem); uiBlockSetCurLayout(layout->root->block, litem); @@ -1508,7 +1533,7 @@ uiBlock *uiLayoutFreeBlock(uiLayout *layout) { uiBlock *block; - block= uiLayoutBlock(layout); + block= uiLayoutGetBlock(layout); uiLayoutFree(layout, 0); return block; @@ -1528,6 +1553,66 @@ uiLayout *uiLayoutSplit(uiLayout *layout) return litem; } +void uiLayoutSetActive(uiLayout *layout, int active) +{ + layout->active= active; +} + +void uiLayoutSetEnabled(uiLayout *layout, int enabled) +{ + layout->enabled= enabled; +} + +void uiLayoutSetRedAlert(uiLayout *layout, int redalert) +{ + layout->redalert= redalert; +} + +void uiLayoutSetKeepAspect(uiLayout *layout, int keepaspect) +{ + layout->keepaspect= keepaspect; +} + +void uiLayoutSetAlignment(uiLayout *layout, int alignment) +{ + layout->alignment= alignment; +} + +void uiLayoutSetScale(uiLayout *layout, float scale) +{ + layout->scale= scale; +} + +int uiLayoutGetActive(uiLayout *layout) +{ + return layout->active; +} + +int uiLayoutGetEnabled(uiLayout *layout) +{ + return layout->enabled; +} + +int uiLayoutGetRedAlert(uiLayout *layout) +{ + return layout->redalert; +} + +int uiLayoutGetKeepAspect(uiLayout *layout) +{ + return layout->keepaspect; +} + +int uiLayoutGetAlignment(uiLayout *layout) +{ + return layout->alignment; +} + +float uiLayoutGetScale(uiLayout *layout) +{ + return layout->scale; +} + /********************** Layout *******************/ static void ui_item_estimate(uiItem *item) @@ -1581,7 +1666,8 @@ static void ui_item_align(uiLayout *litem, int nr) if(item->type == ITEM_BUTTON) { bitem= (uiButtonItem*)item; if(ui_but_can_align(bitem->but)) - bitem->but->alignnr= nr; + if(!bitem->but->alignnr) + bitem->but->alignnr= nr; } else if(item->type == ITEM_LAYOUT_FREE); else if(item->type == ITEM_LAYOUT_BOX) { @@ -1595,7 +1681,22 @@ static void ui_item_align(uiLayout *litem, int nr) } } -static void ui_item_layout(uiItem *item, int align) +static void ui_item_flag(uiLayout *litem, int flag) +{ + uiItem *item; + uiButtonItem *bitem; + + for(item=litem->items.last; item; item=item->prev) { + if(item->type == ITEM_BUTTON) { + bitem= (uiButtonItem*)item; + bitem->but->flag |= flag; + } + else + ui_item_flag((uiLayout*)item, flag); + } +} + +static void ui_item_layout(uiItem *item) { uiItem *subitem; @@ -1605,8 +1706,12 @@ static void ui_item_layout(uiItem *item, int align) if(litem->items.first == NULL) return; - if(litem->align && !align) + if(litem->align) ui_item_align(litem, ++litem->root->block->alignnr); + if(!litem->active) + ui_item_flag(litem, UI_BUT_INACTIVE); + if(!litem->enabled) + ui_item_flag(litem, UI_BUT_DISABLED); switch(litem->item.type) { case ITEM_LAYOUT_COLUMN: @@ -1635,14 +1740,14 @@ static void ui_item_layout(uiItem *item, int align) } for(subitem=litem->items.first; subitem; subitem=subitem->next) - ui_item_layout(subitem, litem->align || align); + ui_item_layout(subitem); } } static void ui_layout_items(const bContext *C, uiBlock *block, uiLayout *layout) { ui_item_estimate(&layout->item); - ui_item_layout(&layout->item, 0); + ui_item_layout(&layout->item); } static void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y) @@ -1690,6 +1795,9 @@ uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int siz layout->y= y; layout->root= root; layout->space= style->templatespace; + layout->active= 1; + layout->enabled= 1; + layout->context= NULL; if(type == UI_LAYOUT_MENU) layout->space= 0; @@ -1710,7 +1818,7 @@ uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int siz return layout; } -uiBlock *uiLayoutBlock(uiLayout *layout) +uiBlock *uiLayoutGetBlock(uiLayout *layout) { return layout->root->block; } @@ -1728,14 +1836,19 @@ void ui_layout_add_but(uiLayout *layout, uiBut *but) bitem->item.type= ITEM_BUTTON; bitem->but= but; BLI_addtail(&layout->items, bitem); + + if(layout->context) { + but->context= layout->context; + but->context->used= 1; + } } -void uiLayoutContext(uiLayout *layout, int opcontext) +void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext) { layout->root->opcontext= opcontext; } -void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv) +void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv) { layout->root->handlefunc= handlefunc; layout->root->argv= argv; @@ -1766,8 +1879,9 @@ void uiBlockLayoutResolve(const bContext *C, uiBlock *block, int *x, int *y) } } -float uiBlockAspect(uiBlock *block) +void uiLayoutSetContextPointer(uiLayout *layout, char *name, PointerRNA *ptr) { - return block->aspect; /* temporary */ + uiBlock *block= layout->root->block; + layout->context= CTX_store_add(&block->contexts, name, ptr); } |