From 78250f1d1d87d5158be4824e64d8869a3b361f75 Mon Sep 17 00:00:00 2001 From: Ines Almeida Date: Fri, 22 May 2015 21:31:26 +0100 Subject: [PATCH] IconView template: adding optional labels to popup buttons --- source/blender/editors/include/UI_interface.h | 2 +- .../editors/interface/interface_templates.c | 53 ++++++++++++------- .../editors/interface/interface_widgets.c | 22 +++++++- source/blender/makesrna/intern/rna_ui_api.c | 5 +- .../bad_level_call_stubs/stubs.c | 2 +- 5 files changed, 61 insertions(+), 23 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index cc66cbe1879..1b09671b3f6 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -889,7 +889,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr); void uiTemplatePreview(uiLayout *layout, struct bContext *C, struct ID *id, int show_buttons, struct ID *parent, struct MTex *slot, const char *preview_id); void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand); -void uiTemplateIconView(uiLayout *layout, struct PointerRNA *ptr, const char *propname); +void uiTemplateIconView(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int show_labels); void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname); void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname); void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 20ce18b2817..d164f3c674b 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -1636,11 +1636,16 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname /********************* Icon viewer Template ************************/ +typedef struct IconViewMenuArgs { + PointerRNA ptr; + PropertyRNA *prop; + int show_labels; +} IconViewMenuArgs; /* ID Search browse menu, open */ static uiBlock *ui_icon_view_menu_cb(bContext *C, ARegion *ar, void *arg_litem) { - static RNAUpdateCb cb; + static IconViewMenuArgs args; uiBlock *block; uiBut *but; int icon, value; @@ -1649,25 +1654,36 @@ static uiBlock *ui_icon_view_menu_cb(bContext *C, ARegion *ar, void *arg_litem) bool free; /* arg_litem is malloced, can be freed by parent button */ - cb = *((RNAUpdateCb *)arg_litem); + args = *((IconViewMenuArgs *) arg_litem); block = UI_block_begin(C, ar, "_popup", UI_EMBOSS_PULLDOWN); UI_block_flag_enable(block, UI_BLOCK_LOOP); - - - RNA_property_enum_items(C, &cb.ptr, cb.prop, &item, NULL, &free); - + + RNA_property_enum_items(C, &args.ptr, args.prop, &item, NULL, &free); + for (a = 0; item[a].identifier; a++) { int x, y; - /* XXX hardcoded size to 5 x unit */ - x = (a % 8) * UI_UNIT_X * 5; - y = (a / 8) * UI_UNIT_X * 5; - + int w = UI_UNIT_X * 5; + int h = UI_UNIT_Y * 5; + + if(args.show_labels) { + h += (int)(1.25f * UI_UNIT_Y); + } + + x = (a % 8) * w; + y = (a / 8) * h; + icon = item[a].icon; value = item[a].value; - but = uiDefIconButR_prop(block, UI_BTYPE_ROW, 0, ICON_NONE, x, y, UI_UNIT_X * 5, UI_UNIT_Y * 5, - &cb.ptr, cb.prop, -1, 0, value, -1, -1, NULL); + if(args.show_labels) { + but = uiDefIconTextButR_prop(block, UI_BTYPE_ROW, 0, icon, item[a].name, x, y, w, h, + &args.ptr, args.prop, -1, 0, value, -1, -1, NULL); + } + else { + but = uiDefIconButR_prop(block, UI_BTYPE_ROW, 0, icon, x, y, w, h, + &args.ptr, args.prop, -1, 0, value, -1, -1, NULL); + } ui_def_but_icon(but, icon, UI_HAS_ICON | UI_BUT_ICON_PREVIEW); } @@ -1681,10 +1697,10 @@ static uiBlock *ui_icon_view_menu_cb(bContext *C, ARegion *ar, void *arg_litem) return block; } -void uiTemplateIconView(uiLayout *layout, PointerRNA *ptr, const char *propname) +void uiTemplateIconView(uiLayout *layout, PointerRNA *ptr, const char *propname, int show_labels) { PropertyRNA *prop = RNA_struct_find_property(ptr, propname); - RNAUpdateCb *cb; + IconViewMenuArgs *cb_args; EnumPropertyItem *items; uiBlock *block; uiBut *but; @@ -1702,11 +1718,12 @@ void uiTemplateIconView(uiLayout *layout, PointerRNA *ptr, const char *propname) value = RNA_property_enum_get(ptr, prop); RNA_enum_icon_from_value(items, value, &icon); - cb = MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb"); - cb->ptr = *ptr; - cb->prop = prop; + cb_args = MEM_callocN(sizeof(IconViewMenuArgs), __func__); + cb_args->ptr = *ptr; + cb_args->prop = prop; + cb_args->show_labels = show_labels; - but = uiDefBlockButN(block, ui_icon_view_menu_cb, cb, "", 0, 0, UI_UNIT_X * 6, UI_UNIT_Y * 6, ""); + but = uiDefBlockButN(block, ui_icon_view_menu_cb, cb_args, "", 0, 0, UI_UNIT_X * 6, UI_UNIT_Y * 6, ""); ui_def_but_icon(but, icon, UI_HAS_ICON | UI_BUT_ICON_PREVIEW); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index f5ee8e1cf6e..9860c1b70ad 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1518,7 +1518,27 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB /* If there's an icon too (made with uiDefIconTextBut) then draw the icon * and offset the text label to accommodate it */ - if (but->flag & UI_HAS_ICON || show_menu_icon) { + /* Big previews with optional text label below */ + if (but->flag & UI_BUT_ICON_PREVIEW && ui_block_is_menu(but->block)) { + const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE; + const float icon_size = 0.8f * BLI_rcti_size_y(rect); + float text_size; + + if(but->drawstr[0] != '\0') + text_size = 0.2f * BLI_rcti_size_y(rect); + else + text_size = 0.0f; + + /* draw icon in rect above the space reserved for the label */ + rect->ymin += text_size; + widget_draw_icon(but, icon, alpha, rect, show_menu_icon); + + /* offset rect to draw label in*/ + rect->ymin -= text_size; + rect->ymax -= icon_size; + } + /* Icons on the left with optional text label on the right */ + else if (but->flag & UI_HAS_ICON || show_menu_icon) { const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE; const float icon_size = ICON_SIZE_FROM_BUTRECT(rect); diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 832a29a2761..ce5f44a3989 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -719,11 +719,12 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_function_ui_description(func, "Item. A color ramp widget"); api_ui_item_rna_common(func); RNA_def_boolean(func, "expand", false, "", "Expand button to show more detail"); - + func = RNA_def_function(srna, "template_icon_view", "uiTemplateIconView"); RNA_def_function_ui_description(func, "Enum. Large widget showing Icon previews"); api_ui_item_rna_common(func); - + RNA_def_boolean(func, "show_labels", false, "", "Show enum label in preview buttons"); + func = RNA_def_function(srna, "template_histogram", "uiTemplateHistogram"); RNA_def_function_ui_description(func, "Item. A histogramm widget to analyze imaga data"); api_ui_item_rna_common(func); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index f1cb2358582..38b58fbb4f7 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -471,7 +471,7 @@ void uiLayoutSetEnabled(uiLayout *layout, bool enabled) RET_NONE void uiLayoutSetAlignment(uiLayout *layout, char alignment) RET_NONE void uiLayoutSetScaleX(struct uiLayout *layout, float scale) RET_NONE void uiLayoutSetScaleY(struct uiLayout *layout, float scale) RET_NONE -void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE +void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, int show_labels) RET_NONE void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base) RET_NONE void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface) RET_NONE void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE