Blame src-nuklear/nuklear_input.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
 *                          INPUT
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_begin(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
    for (i = 0; i < NK_BUTTON_MAX; ++i)
Ivan Mahonin b53a5c
        in->mouse.buttons[i].clicked = 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in->keyboard.text_len = 0;
Ivan Mahonin b53a5c
    in->mouse.scroll_delta = nk_vec2(0,0);
Ivan Mahonin b53a5c
    in->mouse.prev.x = in->mouse.pos.x;
Ivan Mahonin b53a5c
    in->mouse.prev.y = in->mouse.pos.y;
Ivan Mahonin b53a5c
    in->mouse.delta.x = 0;
Ivan Mahonin b53a5c
    in->mouse.delta.y = 0;
Ivan Mahonin b53a5c
    for (i = 0; i < NK_KEY_MAX; i++)
Ivan Mahonin b53a5c
        in->keyboard.keys[i].clicked = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
    if (in->mouse.grab)
Ivan Mahonin b53a5c
        in->mouse.grab = 0;
Ivan Mahonin b53a5c
    if (in->mouse.ungrab) {
Ivan Mahonin b53a5c
        in->mouse.grabbed = 0;
Ivan Mahonin b53a5c
        in->mouse.ungrab = 0;
Ivan Mahonin b53a5c
        in->mouse.grab = 0;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_motion(struct nk_context *ctx, int x, int y)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
    in->mouse.pos.x = (float)x;
Ivan Mahonin b53a5c
    in->mouse.pos.y = (float)y;
Ivan Mahonin b53a5c
    in->mouse.delta.x = in->mouse.pos.x - in->mouse.prev.x;
Ivan Mahonin b53a5c
    in->mouse.delta.y = in->mouse.pos.y - in->mouse.prev.y;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_key(struct nk_context *ctx, enum nk_keys key, nk_bool down)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
#ifdef NK_KEYSTATE_BASED_INPUT
Ivan Mahonin b53a5c
    if (in->keyboard.keys[key].down != down)
Ivan Mahonin b53a5c
        in->keyboard.keys[key].clicked++;
Ivan Mahonin b53a5c
#else
Ivan Mahonin b53a5c
    in->keyboard.keys[key].clicked++;
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
    in->keyboard.keys[key].down = down;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_button(struct nk_context *ctx, enum nk_buttons id, int x, int y, nk_bool down)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
    if (in->mouse.buttons[id].down == down) return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    btn = &in->mouse.buttons[id];
Ivan Mahonin b53a5c
    btn->clicked_pos.x = (float)x;
Ivan Mahonin b53a5c
    btn->clicked_pos.y = (float)y;
Ivan Mahonin b53a5c
    btn->down = down;
Ivan Mahonin b53a5c
    btn->clicked++;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* Fix Click-Drag for touch events. */
Ivan Mahonin b53a5c
    in->mouse.delta.x = 0;
Ivan Mahonin b53a5c
    in->mouse.delta.y = 0;
Ivan Mahonin b53a5c
#ifdef NK_BUTTON_TRIGGER_ON_RELEASE
Ivan Mahonin b53a5c
    if (down == 1 && id == NK_BUTTON_LEFT)
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        in->mouse.down_pos.x = btn->clicked_pos.x;
Ivan Mahonin b53a5c
        in->mouse.down_pos.y = btn->clicked_pos.y;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    ctx->input.mouse.scroll_delta.x += val.x;
Ivan Mahonin b53a5c
    ctx->input.mouse.scroll_delta.y += val.y;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_glyph(struct nk_context *ctx, const nk_glyph glyph)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int len = 0;
Ivan Mahonin b53a5c
    nk_rune unicode;
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    in = &ctx->input;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    len = nk_utf_decode(glyph, &unicode, NK_UTF_SIZE);
Ivan Mahonin b53a5c
    if (len && ((in->keyboard.text_len + len) < NK_INPUT_MAX)) {
Ivan Mahonin b53a5c
        nk_utf_encode(unicode, &in->keyboard.text[in->keyboard.text_len],
Ivan Mahonin b53a5c
            NK_INPUT_MAX - in->keyboard.text_len);
Ivan Mahonin b53a5c
        in->keyboard.text_len += len;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_char(struct nk_context *ctx, char c)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_glyph glyph;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    glyph[0] = c;
Ivan Mahonin b53a5c
    nk_input_glyph(ctx, glyph);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_input_unicode(struct nk_context *ctx, nk_rune unicode)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_glyph rune;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    if (!ctx) return;
Ivan Mahonin b53a5c
    nk_utf_encode(unicode, rune, NK_UTF_SIZE);
Ivan Mahonin b53a5c
    nk_input_glyph(ctx, rune);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_has_mouse_click(const struct nk_input *i, enum nk_buttons id)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    return (btn->clicked && btn->down == nk_false) ? nk_true : nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_has_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id,
Ivan Mahonin b53a5c
    struct nk_rect b)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h))
Ivan Mahonin b53a5c
        return nk_false;
Ivan Mahonin b53a5c
    return nk_true;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_has_mouse_click_in_button_rect(const struct nk_input *i, enum nk_buttons id,
Ivan Mahonin b53a5c
    struct nk_rect b)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
#ifdef NK_BUTTON_TRIGGER_ON_RELEASE
Ivan Mahonin b53a5c
    if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h)
Ivan Mahonin b53a5c
        || !NK_INBOX(i->mouse.down_pos.x,i->mouse.down_pos.y,b.x,b.y,b.w,b.h))
Ivan Mahonin b53a5c
#else
Ivan Mahonin b53a5c
    if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h))
Ivan Mahonin b53a5c
#endif
Ivan Mahonin b53a5c
        return nk_false;
Ivan Mahonin b53a5c
    return nk_true;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_has_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id,
Ivan Mahonin b53a5c
    struct nk_rect b, nk_bool down)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    return nk_input_has_mouse_click_in_rect(i, id, b) && (btn->down == down);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id,
Ivan Mahonin b53a5c
    struct nk_rect b)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    return (nk_input_has_mouse_click_down_in_rect(i, id, b, nk_false) &&
Ivan Mahonin b53a5c
            btn->clicked) ? nk_true : nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id,
Ivan Mahonin b53a5c
    struct nk_rect b, nk_bool down)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *btn;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    btn = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    return (nk_input_has_mouse_click_down_in_rect(i, id, b, down) &&
Ivan Mahonin b53a5c
            btn->clicked) ? nk_true : nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_any_mouse_click_in_rect(const struct nk_input *in, struct nk_rect b)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i, down = 0;
Ivan Mahonin b53a5c
    for (i = 0; i < NK_BUTTON_MAX; ++i)
Ivan Mahonin b53a5c
        down = down || nk_input_is_mouse_click_in_rect(in, (enum nk_buttons)i, b);
Ivan Mahonin b53a5c
    return down;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_hovering_rect(const struct nk_input *i, struct nk_rect rect)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    return NK_INBOX(i->mouse.pos.x, i->mouse.pos.y, rect.x, rect.y, rect.w, rect.h);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_prev_hovering_rect(const struct nk_input *i, struct nk_rect rect)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    return NK_INBOX(i->mouse.prev.x, i->mouse.prev.y, rect.x, rect.y, rect.w, rect.h);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_mouse_clicked(const struct nk_input *i, enum nk_buttons id, struct nk_rect rect)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    if (!nk_input_is_mouse_hovering_rect(i, rect)) return nk_false;
Ivan Mahonin b53a5c
    return nk_input_is_mouse_click_in_rect(i, id, rect);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_down(const struct nk_input *i, enum nk_buttons id)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    return i->mouse.buttons[id].down;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_pressed(const struct nk_input *i, enum nk_buttons id)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_mouse_button *b;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    b = &i->mouse.buttons[id];
Ivan Mahonin b53a5c
    if (b->down && b->clicked)
Ivan Mahonin b53a5c
        return nk_true;
Ivan Mahonin b53a5c
    return nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_mouse_released(const struct nk_input *i, enum nk_buttons id)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    return (!i->mouse.buttons[id].down && i->mouse.buttons[id].clicked);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_key_pressed(const struct nk_input *i, enum nk_keys key)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_key *k;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    k = &i->keyboard.keys[key];
Ivan Mahonin b53a5c
    if ((k->down && k->clicked) || (!k->down && k->clicked >= 2))
Ivan Mahonin b53a5c
        return nk_true;
Ivan Mahonin b53a5c
    return nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_key_released(const struct nk_input *i, enum nk_keys key)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_key *k;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    k = &i->keyboard.keys[key];
Ivan Mahonin b53a5c
    if ((!k->down && k->clicked) || (k->down && k->clicked >= 2))
Ivan Mahonin b53a5c
        return nk_true;
Ivan Mahonin b53a5c
    return nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_input_is_key_down(const struct nk_input *i, enum nk_keys key)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_key *k;
Ivan Mahonin b53a5c
    if (!i) return nk_false;
Ivan Mahonin b53a5c
    k = &i->keyboard.keys[key];
Ivan Mahonin b53a5c
    if (k->down) return nk_true;
Ivan Mahonin b53a5c
    return nk_false;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c