From ad164a52618ff236aab73e83b9e47f3a9fb40be1 Mon Sep 17 00:00:00 2001 From: Ton Roosendaal Date: Wed, 15 Apr 2009 14:43:54 +0000 Subject: 2.5 Fixed & upgraded tooltips to new drawing system. Also fixed small error in menu shadows. Rounding of shadow below menu went wrong. --- source/blender/blenfont/intern/blf_internal.c | 6 +- source/blender/editors/interface/interface.c | 2 +- .../blender/editors/interface/interface_intern.h | 2 + .../blender/editors/interface/interface_regions.c | 96 ++++++++++------------ source/blender/editors/interface/interface_style.c | 2 +- .../blender/editors/interface/interface_widgets.c | 45 ++++++---- 6 files changed, 76 insertions(+), 77 deletions(-) (limited to 'source') diff --git a/source/blender/blenfont/intern/blf_internal.c b/source/blender/blenfont/intern/blf_internal.c index 2788332a492..d868a0fa32a 100644 --- a/source/blender/blenfont/intern/blf_internal.c +++ b/source/blender/blenfont/intern/blf_internal.c @@ -262,9 +262,9 @@ void blf_internal_boundbox(FontBLF *font, char *str, rctf *box) descent= d; } box->xmin = (float)0; - box->ymin = (float)-descent; - box->xmax = (float)length; - box->ymax = (float)ascent; + box->ymin = (float)-descent * font->aspect; + box->xmax = (float)length * font->aspect; + box->ymax = (float)ascent * font->aspect; } float blf_internal_width(FontBLF *font, char *str) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 2dc0ab6b413..dd3b75ad0d7 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -574,7 +574,7 @@ void uiEndBlock(const bContext *C, uiBlock *block) /* ************** BLOCK DRAWING FUNCTION ************* */ -static void ui_fontscale(short *points, float aspect) +void ui_fontscale(short *points, float aspect) { if(aspect < 0.9f || aspect > 1.1f) { float pointsf= *points; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index eb32c29c8c7..06041dc202e 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -273,6 +273,8 @@ extern int ui_translate_buttons(void); extern int ui_translate_menus(void); extern int ui_translate_tooltips(void); +void ui_fontscale(short *points, float aspect); + extern void ui_block_to_window_fl(const struct ARegion *ar, uiBlock *block, float *x, float *y); extern void ui_block_to_window(const struct ARegion *ar, uiBlock *block, int *x, int *y); extern void ui_block_to_window_rct(const struct ARegion *ar, uiBlock *block, rctf *graph, rcti *winr); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index b730cbab238..47afd03d051 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -66,11 +66,9 @@ #define MENU_BUTTON_HEIGHT 20 #define MENU_SEPR_HEIGHT 6 #define B_NOP -1 -#define MENU_SHADOW_LEFT -10 -#define MENU_SHADOW_BOTTOM -10 -#define MENU_SHADOW_RIGHT 10 -#define MENU_SHADOW_TOP 1 -#define MENU_ROUNDED_TOP 5 +#define MENU_SHADOW_SIDE 8 +#define MENU_SHADOW_BOTTOM 10 +#define MENU_TOP 8 /*********************** Menu Data Parsing ********************* */ @@ -253,43 +251,21 @@ void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar) /************************* Creating Tooltips **********************/ typedef struct uiTooltipData { - rctf bbox; - struct BMF_Font *font; + rcti bbox; + uiFontStyle fstyle; char *tip; - float aspect; } uiTooltipData; static void ui_tooltip_region_draw(const bContext *C, ARegion *ar) { - uiStyle *style= U.uistyles.first; // XXX pass on as arg - uiTooltipData *data; - int x1, y1, x2, y2; - - data= ar->regiondata; - - x1= ar->winrct.xmin; - y1= ar->winrct.ymin; - x2= ar->winrct.xmax; - y2= ar->winrct.ymax; - - /* draw background */ - glEnable(GL_BLEND); - glColor4f(0.15f, 0.15f, 0.15f, 0.85f); + uiTooltipData *data= ar->regiondata; - uiSetRoundBox(15); - uiRoundBox(data->bbox.xmin, 2, data->bbox.xmax+10, y2-y1-2, 5.0f); + ui_draw_menu_back(U.uistyles.first, NULL, &data->bbox); /* draw text */ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - /* set the position for drawing text +6 in from the left edge, and leaving - * an equal gap between the top of the background box and the top of the - * string's bbox, and the bottom of the background box, and the bottom of - * the string's bbox */ - - uiStyleFontSet(&style->widget); - BLF_position(5, ((y2-data->bbox.ymax)+(y1+data->bbox.ymin))/2 - data->bbox.ymin - y1, 0.0f); - BLF_draw(data->tip); + uiStyleFontSet(&data->fstyle); + uiStyleFontDraw(&data->fstyle, &data->bbox, data->tip); } static void ui_tooltip_region_free(ARegion *ar) @@ -308,6 +284,8 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) static ARegionType type; ARegion *ar; uiTooltipData *data; + float fonth, fontw, aspect= but->block->aspect; + float x1f, x2f, y1f, y2f; int x1, x2, y1, y2, winx, winy, ofsx, ofsy; if(!but->tip || strlen(but->tip)==0) @@ -324,11 +302,14 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) /* create tooltip data */ data= MEM_callocN(sizeof(uiTooltipData), "uiTooltipData"); data->tip= BLI_strdup(but->tip); - data->aspect= but->aspect; /* set font, get bb */ - uiStyleFontSet(&style->widget); - BLF_boundbox(data->tip, &data->bbox); + data->fstyle= style->widget; /* copy struct */ + data->fstyle.align= UI_STYLE_TEXT_CENTER; + ui_fontscale(&data->fstyle.points, aspect); + uiStyleFontSet(&data->fstyle); + fontw= aspect * BLF_width(data->tip); + fonth= aspect * BLF_height(data->tip); ar->regiondata= data; @@ -336,19 +317,19 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) ofsx= (but->block->panel)? but->block->panel->ofsx: 0; ofsy= (but->block->panel)? but->block->panel->ofsy: 0; - x1= (but->x1+but->x2)/2 + ofsx; - x2= x1+but->aspect*((data->bbox.xmax-data->bbox.xmin) + 8); - y2= but->y1-10 + ofsy; - y1= y2-but->aspect*((data->bbox.ymax+(data->bbox.ymax-data->bbox.ymin))); - - y2 += 8; - x2 += 4; - + x1f= (but->x1+but->x2)/2.0f + ofsx - 16.0f*aspect; + x2f= x1f + fontw + 16.0f*aspect; + y2f= but->y1 + ofsy - 15.0f*aspect; + y1f= y2f - fonth - 10.0f*aspect; + + /* copy to int, gets projected if possible too */ + x1= x1f; y1= y1f; x2= x2f; y2= y2f; + if(butregion) { /* XXX temp, region v2ds can be empty still */ if(butregion->v2d.cur.xmin != butregion->v2d.cur.xmax) { - UI_view2d_to_region_no_clip(&butregion->v2d, x1, y1, &x1, &y1); - UI_view2d_to_region_no_clip(&butregion->v2d, x2, y2, &x2, &y2); + UI_view2d_to_region_no_clip(&butregion->v2d, x1f, y1f, &x1, &y1); + UI_view2d_to_region_no_clip(&butregion->v2d, x2f, y2f, &x2, &y2); } x1 += butregion->winrct.xmin; @@ -374,11 +355,18 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but) y1 += 36; y2 += 36; } + + /* widget rect, in region coords */ + data->bbox.xmin= MENU_SHADOW_SIDE; + data->bbox.xmax= x2-x1 + MENU_SHADOW_SIDE; + data->bbox.ymin= MENU_SHADOW_BOTTOM; + data->bbox.ymax= y2-y1 + MENU_SHADOW_BOTTOM; - ar->winrct.xmin= x1; - ar->winrct.ymin= y1; - ar->winrct.xmax= x2; - ar->winrct.ymax= y2; + /* region bigger for shadow */ + ar->winrct.xmin= x1 - MENU_SHADOW_SIDE; + ar->winrct.xmax= x2 + MENU_SHADOW_SIDE; + ar->winrct.ymin= y1 - MENU_SHADOW_BOTTOM; + ar->winrct.ymax= y2 + MENU_TOP; /* adds subwindow */ ED_region_init(C, ar); @@ -683,10 +671,10 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut /* the block and buttons were positioned in window space as in 2.4x, now * these menu blocks are regions so we bring it back to region space. * additionally we add some padding for the menu shadow or rounded menus */ - ar->winrct.xmin= block->minx + MENU_SHADOW_LEFT; - ar->winrct.xmax= block->maxx + MENU_SHADOW_RIGHT; - ar->winrct.ymin= block->miny + MENU_SHADOW_BOTTOM; - ar->winrct.ymax= block->maxy + MENU_SHADOW_TOP + MENU_ROUNDED_TOP; + ar->winrct.xmin= block->minx - MENU_SHADOW_SIDE; + ar->winrct.xmax= block->maxx + MENU_SHADOW_SIDE; + ar->winrct.ymin= block->miny - MENU_SHADOW_BOTTOM; + ar->winrct.ymax= block->maxy + MENU_TOP; block->minx -= ar->winrct.xmin; block->maxx -= ar->winrct.xmin; diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c index ca773277132..99702097329 100644 --- a/source/blender/editors/interface/interface_style.c +++ b/source/blender/editors/interface/interface_style.c @@ -128,7 +128,7 @@ static uiFont *uifont_to_blfont(int id) return font; } } - return NULL; + return U.uifonts.first; } /* *************** draw ************************ */ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 692c458e245..abaa832957d 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -214,24 +214,21 @@ static void widget_init(uiWidgetBase *wtb) /* helper call, makes shadow rect, with 'sun' above menu, so only shadow to left/right/bottom */ /* return tot */ -static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, int inner) +static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, float step) { float vec[9][2]; float minx, miny, maxx, maxy; int a, tot= 0; - if(inner) { - minx= rect->xmin; - miny= rect->ymin; - maxx= rect->xmax; - maxy= rect->ymax; - } - else { - minx= rect->xmin-rad; - miny= rect->ymin-rad; - maxx= rect->xmax+rad; - maxy= rect->ymax+rad; - } + rad+= step; + + if(2.0f*rad > rect->ymax-rect->ymin) + rad= 0.5f*(rect->ymax-rect->ymin); + + minx= rect->xmin-step; + miny= rect->ymin-step; + maxx= rect->xmax+step; + maxy= rect->ymax+step; /* mult */ for(a=0; a<9; a++) { @@ -300,7 +297,7 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, flo { float vec[9][2], veci[9][2]; float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax; - float radi= rad - 1.0f; /* rad inner */ + float radi; /* rad inner */ float minxi= minx + 1.0f; /* boundbox inner */ float maxxi= maxx - 1.0f; float minyi= miny + 1.0f; @@ -309,6 +306,11 @@ static void round_box_edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, flo float facyi= 1.0f/(maxyi-minyi); int a, tot= 0; + if(2.0f*rad > rect->ymax-rect->ymin) + rad= 0.5f*(rect->ymax-rect->ymin); + + radi= rad - 1.0f; + /* mult */ for(a=0; a<9; a++) { veci[a][0]= radi*cornervec[a][0]; @@ -1133,17 +1135,21 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float float alpha, alphastep; int step, tot, a; - rect1.ymax -= 2.0f*radout; + /* prevent tooltips to not show round shadow */ + if( 2.0f*radout > 0.2f*(rect1.ymax-rect1.ymin) ) + rect1.ymax -= 0.2f*(rect1.ymax-rect1.ymin); + else + rect1.ymax -= 2.0f*radout; /* inner part */ - tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 1); + tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 0.0f); /* inverse linear shadow alpha */ alpha= 0.15; alphastep= 0.67; for(step= 1; step<=radout; step++, alpha*=alphastep) { - round_box_shadow_edges(wtb.outer_v, &rect1, (float)step, 15, 0); + round_box_shadow_edges(wtb.outer_v, &rect1, radin, 15, (float)step); glColor4f(0.0f, 0.0f, 0.0f, alpha); @@ -1820,7 +1826,10 @@ void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect) uiWidgetType *wt= widget_type(UI_WTYPE_MENU_BACK); wt->state(wt, 0); - wt->draw(&wt->wcol, rect, block->flag, block->direction); + if(block) + wt->draw(&wt->wcol, rect, block->flag, block->direction); + else + wt->draw(&wt->wcol, rect, 0, 0); } -- cgit v1.2.3