UI: split out button checks from tooltip creation

Allows to make tooltips from other kinds of data.
This commit is contained in:
2017-12-19 19:30:05 +11:00
parent a0fa404deb
commit 77c62c7793
3 changed files with 47 additions and 44 deletions

View File

@@ -7649,7 +7649,7 @@ void UI_but_tooltip_refresh(bContext *C, uiBut *but)
data = but->active;
if (data && data->tooltip) {
ui_tooltip_free(C, data->tooltip);
data->tooltip = ui_tooltip_create(C, data->region, but);
data->tooltip = ui_tooltip_create_from_button(C, data->region, but);
}
}
@@ -8393,7 +8393,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but)
data->tooltiptimer = NULL;
if (!data->tooltip)
data->tooltip = ui_tooltip_create(C, data->region, but);
data->tooltip = ui_tooltip_create_from_button(C, data->region, but);
}
/* handle menu auto open timer */
else if (event->customdata == data->autoopentimer) {

View File

@@ -587,7 +587,7 @@ struct uiPopupBlockHandle {
/* interface_region_*.c */
/* interface_region_tooltip.c */
struct ARegion *ui_tooltip_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
struct ARegion *ui_tooltip_create_from_button(struct bContext *C, struct ARegion *butregion, uiBut *but);
void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
/* interface_region_color_picker.c */

View File

@@ -560,13 +560,10 @@ static uiTooltipData *ui_tooltip_data_from_button(bContext *C, uiBut *but)
}
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name ToolTip Public API
* \{ */
ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
static ARegion *ui_tooltip_create_with_data(
bContext *C, uiTooltipData *data,
const float init_position[2],
const float aspect)
{
const float pad_px = UI_TIP_PADDING;
wmWindow *win = CTX_wm_window(C);
@@ -574,24 +571,12 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
uiStyle *style = UI_style_get();
static ARegionType type;
ARegion *ar;
/* IDProperty *prop;*/
/* aspect values that shrink text are likely unreadable */
const float aspect = min_ff(1.0f, but->block->aspect);
int fonth, fontw;
int ofsx, ofsy, h, i;
int h, i;
rctf rect_fl;
rcti rect_i;
int font_flag = 0;
if (but->drawflag & UI_BUT_NO_TOOLTIP) {
return NULL;
}
uiTooltipData *data = ui_tooltip_data_from_button(C, but);
if (data == NULL) {
return NULL;
}
/* create area region */
ar = ui_region_temp_add(CTX_wm_screen(C));
@@ -669,31 +654,12 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
data->lineh = h;
/* compute position */
ofsx = 0; //(but->block->panel) ? but->block->panel->ofsx : 0;
ofsy = 0; //(but->block->panel) ? but->block->panel->ofsy : 0;
rect_fl.xmin = BLI_rctf_cent_x(&but->rect) + ofsx - TIP_BORDER_X;
rect_fl.xmin = init_position[0] - TIP_BORDER_X;
rect_fl.xmax = rect_fl.xmin + fontw + pad_px;
rect_fl.ymax = but->rect.ymin + ofsy - TIP_BORDER_Y;
rect_fl.ymax = init_position[1] - TIP_BORDER_Y;
rect_fl.ymin = rect_fl.ymax - fonth - TIP_BORDER_Y;
/* since the text has beens caled already, the size of tooltips is defined now */
/* here we try to figure out the right location */
if (butregion) {
float mx, my;
float ofsx_fl = rect_fl.xmin, ofsy_fl = rect_fl.ymax;
ui_block_to_window_fl(butregion, but->block, &ofsx_fl, &ofsy_fl);
#if 1
/* use X mouse location */
mx = (win->eventstate->x + (TIP_BORDER_X * 2)) - BLI_rctf_cent_x(&but->rect);
#else
mx = ofsx_fl - rect_fl.xmin;
#endif
my = ofsy_fl - rect_fl.ymax;
BLI_rctf_translate(&rect_fl, mx, my);
}
BLI_rcti_rctf_copy(&rect_i, &rect_fl);
#undef TIP_BORDER_X
@@ -748,6 +714,43 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
return ar;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name ToolTip Public API
* \{ */
ARegion *ui_tooltip_create_from_button(bContext *C, ARegion *butregion, uiBut *but)
{
wmWindow *win = CTX_wm_window(C);
/* aspect values that shrink text are likely unreadable */
const float aspect = min_ff(1.0f, but->block->aspect);
float init_position[2];
if (but->drawflag & UI_BUT_NO_TOOLTIP) {
return NULL;
}
uiTooltipData *data = NULL;
if (data == NULL) {
data = ui_tooltip_data_from_button(C, but);
}
if (data == NULL) {
return NULL;
}
init_position[0] = BLI_rctf_cent_x(&but->rect);
init_position[1] = but->rect.ymin;
if (butregion) {
ui_block_to_window_fl(butregion, but->block, &init_position[0], &init_position[1]);
init_position[0] = win->eventstate->x;
}
return ui_tooltip_create_with_data(C, data, init_position, aspect);
}
void ui_tooltip_free(bContext *C, ARegion *ar)
{
ui_region_temp_remove(C, CTX_wm_screen(C), ar);