Blame src-nuklear/nuklear_tooltip.c

Ivan Mahonin b53a5c
#include "nuklear.h"
Ivan Mahonin b53a5c
#include "nuklear_internal.h"
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
/* ===============================================================
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 *                              TOOLTIP
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_tooltip_begin(struct nk_context *ctx, float width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int x,y,w,h;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
    struct nk_rect bounds;
Ivan Mahonin b53a5c
    int ret;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current->layout);
Ivan Mahonin b53a5c
    if (!ctx || !ctx->current || !ctx->current->layout)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* make sure that no nonblocking popup is currently active */
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
    if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK))
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    w = nk_iceilf(width);
Ivan Mahonin b53a5c
    h = nk_iceilf(nk_null_rect.h);
Ivan Mahonin b53a5c
    x = nk_ifloorf(in->mouse.pos.x + 1) - (int)win->layout->clip.x;
Ivan Mahonin b53a5c
    y = nk_ifloorf(in->mouse.pos.y + 1) - (int)win->layout->clip.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    bounds.x = (float)x;
Ivan Mahonin b53a5c
    bounds.y = (float)y;
Ivan Mahonin b53a5c
    bounds.w = (float)w;
Ivan Mahonin b53a5c
    bounds.h = (float)h;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC,
Ivan Mahonin b53a5c
        "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, bounds);
Ivan Mahonin b53a5c
    if (ret) win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM;
Ivan Mahonin b53a5c
    win->popup.type = NK_PANEL_TOOLTIP;
Ivan Mahonin b53a5c
    ctx->current->layout->type = NK_PANEL_TOOLTIP;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_tooltip_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current);
Ivan Mahonin b53a5c
    if (!ctx || !ctx->current) return;
Ivan Mahonin b53a5c
    ctx->current->seq--;
Ivan Mahonin b53a5c
    nk_popup_close(ctx);
Ivan Mahonin b53a5c
    nk_popup_end(ctx);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_tooltip(struct nk_context *ctx, const char *text)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
    struct nk_vec2 padding;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    int text_len;
Ivan Mahonin b53a5c
    float text_width;
Ivan Mahonin b53a5c
    float text_height;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current->layout);
Ivan Mahonin b53a5c
    NK_ASSERT(text);
Ivan Mahonin b53a5c
    if (!ctx || !ctx->current || !ctx->current->layout || !text)
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* fetch configuration data */
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    padding = style->window.padding;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* calculate size of the text and tooltip */
Ivan Mahonin b53a5c
    text_len = nk_strlen(text);
Ivan Mahonin b53a5c
    text_width = style->font->width(style->font->userdata,
Ivan Mahonin b53a5c
                    style->font->height, text, text_len);
Ivan Mahonin b53a5c
    text_width += (4 * padding.x);
Ivan Mahonin b53a5c
    text_height = (style->font->height + 2 * padding.y);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* execute tooltip and fill with text */
Ivan Mahonin b53a5c
    if (nk_tooltip_begin(ctx, (float)text_width)) {
Ivan Mahonin b53a5c
        nk_layout_row_dynamic(ctx, (float)text_height, 1);
Ivan Mahonin b53a5c
        nk_text(ctx, text, text_len, NK_TEXT_LEFT);
Ivan Mahonin b53a5c
        nk_tooltip_end(ctx);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
#ifdef NK_INCLUDE_STANDARD_VARARGS
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_tooltipf(struct nk_context *ctx, const char *fmt, ...)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    va_list args;
Ivan Mahonin b53a5c
    va_start(args, fmt);
Ivan Mahonin b53a5c
    nk_tooltipfv(ctx, fmt, args);
Ivan Mahonin b53a5c
    va_end(args);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    char buf[256];
Ivan Mahonin b53a5c
    nk_strfmt(buf, NK_LEN(buf), fmt, args);
Ivan Mahonin b53a5c
    nk_tooltip(ctx, buf);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c