From ba7fb3f9698c5f5178eed25ab23b668c45115853 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 28 Sep 2009 15:59:09 +0000 Subject: Fix drawing of MENU buttons with only an icon, was not aligned right and showing unneeded triangles (+ buttons in Boids Brain). --- source/blender/editors/include/UI_interface.h | 1 + source/blender/editors/interface/interface.c | 14 +++++++++++++ .../blender/editors/interface/interface_intern.h | 1 + .../blender/editors/interface/interface_layout.c | 4 +++- .../blender/editors/interface/interface_widgets.c | 23 ++++++++++++++++++++-- 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index dc4744c9832..e1762991676 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -424,6 +424,7 @@ int uiIconFromID(struct ID *id); uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip); uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip); uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip); +uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip); uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, char *str, short x1, short y1, short x2, short y2, char *tip); uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *str, short x1, short y1, short x2, short y2, char *tip); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 1b05958b679..3e5cc0e6d67 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3064,6 +3064,20 @@ uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, in return but; } +uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip) +{ + uiBut *but= ui_def_but(block, PULLDOWN, 0, "", x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip); + + but->icon= (BIFIconID) icon; + but->flag |= UI_HAS_ICON; + but->flag &=~ UI_ICON_LEFT; + + but->menu_create_func= func; + ui_check_but(but); + + return but; +} + /* Block button containing both string label and icon */ uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip) { diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 885005ba06e..292c85e9072 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -72,6 +72,7 @@ typedef enum { /* menus */ UI_WTYPE_MENU_RADIO, + UI_WTYPE_MENU_ICON_RADIO, UI_WTYPE_MENU_POINTER_LINK, UI_WTYPE_PULLDOWN, diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index e3c392a145e..64a45efc551 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1183,8 +1183,10 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun if(layout->root->type == UI_LAYOUT_HEADER) /* ugly .. */ w -= 10; - if(icon) + if(name[0] && icon) but= uiDefIconTextMenuBut(block, func, arg, icon, (char*)name, 0, 0, w, h, ""); + else if(icon) + but= uiDefIconMenuBut(block, func, arg, icon, 0, 0, w, h, ""); else but= uiDefMenuBut(block, func, arg, (char*)name, 0, 0, w, h, ""); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index ac8750f84e6..d9a6c50315a 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1973,7 +1973,19 @@ static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roun /* text space */ rect->xmax -= (rect->ymax-rect->ymin); +} + +static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) +{ + uiWidgetBase wtb; + + widget_init(&wtb); + + /* half rounded */ + round_box_edges(&wtb, roundboxalign, rect, 4.0f); + /* decoration */ + widgetbase_draw(&wtb, wcol); } static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) @@ -2209,13 +2221,17 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) wt.wcol_theme= &btheme->tui.wcol_menu; wt.draw= widget_menubut; break; + + case UI_WTYPE_MENU_ICON_RADIO: + wt.wcol_theme= &btheme->tui.wcol_menu; + wt.draw= widget_menuiconbut; + break; case UI_WTYPE_MENU_POINTER_LINK: wt.wcol_theme= &btheme->tui.wcol_menu; wt.draw= widget_menubut; break; - case UI_WTYPE_PULLDOWN: wt.wcol_theme= &btheme->tui.wcol_pulldown; wt.draw= widget_pulldownbut; @@ -2405,7 +2421,10 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct case MENU: case BLOCK: case ICONTEXTROW: - wt= widget_type(UI_WTYPE_MENU_RADIO); + if(!but->str[0] && but->icon) + wt= widget_type(UI_WTYPE_MENU_ICON_RADIO); + else + wt= widget_type(UI_WTYPE_MENU_RADIO); break; case PULLDOWN: -- cgit v1.2.3