Blame src-nuklear/nuklear_selectable.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
 *                              SELECTABLE
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_draw_selectable(struct nk_command_buffer *out,
Ivan Mahonin b53a5c
    nk_flags state, const struct nk_style_selectable *style, nk_bool active,
Ivan Mahonin b53a5c
    const struct nk_rect *bounds,
Ivan Mahonin b53a5c
    const struct nk_rect *icon, const struct nk_image *img, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *string, int len, nk_flags align, const struct nk_user_font *font)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
Ivan Mahonin b53a5c
    struct nk_text text;
Ivan Mahonin b53a5c
    text.padding = style->padding;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* select correct colors/images */
Ivan Mahonin b53a5c
    if (!active) {
Ivan Mahonin b53a5c
        if (state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
            background = &style->pressed;
Ivan Mahonin b53a5c
            text.text = style->text_pressed;
Ivan Mahonin b53a5c
        } else if (state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
            background = &style->hover;
Ivan Mahonin b53a5c
            text.text = style->text_hover;
Ivan Mahonin b53a5c
        } else {
Ivan Mahonin b53a5c
            background = &style->normal;
Ivan Mahonin b53a5c
            text.text = style->text_normal;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        if (state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
            background = &style->pressed_active;
Ivan Mahonin b53a5c
            text.text = style->text_pressed_active;
Ivan Mahonin b53a5c
        } else if (state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
            background = &style->hover_active;
Ivan Mahonin b53a5c
            text.text = style->text_hover_active;
Ivan Mahonin b53a5c
        } else {
Ivan Mahonin b53a5c
            background = &style->normal_active;
Ivan Mahonin b53a5c
            text.text = style->text_normal_active;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    /* draw selectable background and text */
Ivan Mahonin b53a5c
    switch (background->type) {
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_IMAGE:
Ivan Mahonin b53a5c
            text.background = nk_rgba(0, 0, 0, 0);
Ivan Mahonin b53a5c
            nk_draw_image(out, *bounds, &background->data.image, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_NINE_SLICE:
Ivan Mahonin b53a5c
            text.background = nk_rgba(0, 0, 0, 0);
Ivan Mahonin b53a5c
            nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_COLOR:
Ivan Mahonin b53a5c
            text.background = background->data.color;
Ivan Mahonin b53a5c
            nk_fill_rect(out, *bounds, style->rounding, background->data.color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    if (icon) {
Ivan Mahonin b53a5c
        if (img) nk_draw_image(out, *icon, img, nk_white);
Ivan Mahonin b53a5c
        else nk_draw_symbol(out, sym, *icon, text.background, text.text, 1, font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    nk_widget_text(out, *bounds, string, len, &text, align, font);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB nk_bool
Ivan Mahonin b53a5c
nk_do_selectable(nk_flags *state, struct nk_command_buffer *out,
Ivan Mahonin b53a5c
    struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value,
Ivan Mahonin b53a5c
    const struct nk_style_selectable *style, const struct nk_input *in,
Ivan Mahonin b53a5c
    const struct nk_user_font *font)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int old_value;
Ivan Mahonin b53a5c
    struct nk_rect touch;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(state);
Ivan Mahonin b53a5c
    NK_ASSERT(out);
Ivan Mahonin b53a5c
    NK_ASSERT(str);
Ivan Mahonin b53a5c
    NK_ASSERT(len);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
Ivan Mahonin b53a5c
    NK_ASSERT(style);
Ivan Mahonin b53a5c
    NK_ASSERT(font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (!state || !out || !str || !len || !value || !style || !font) return 0;
Ivan Mahonin b53a5c
    old_value = *value;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* remove padding */
Ivan Mahonin b53a5c
    touch.x = bounds.x - style->touch_padding.x;
Ivan Mahonin b53a5c
    touch.y = bounds.y - style->touch_padding.y;
Ivan Mahonin b53a5c
    touch.w = bounds.w + style->touch_padding.x * 2;
Ivan Mahonin b53a5c
    touch.h = bounds.h + style->touch_padding.y * 2;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* update button */
Ivan Mahonin b53a5c
    if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        *value = !(*value);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw selectable */
Ivan Mahonin b53a5c
    if (style->draw_begin) style->draw_begin(out, style->userdata);
Ivan Mahonin b53a5c
    nk_draw_selectable(out, *state, style, *value, &bounds, 0,0,NK_SYMBOL_NONE, str, len, align, font);
Ivan Mahonin b53a5c
    if (style->draw_end) style->draw_end(out, style->userdata);
Ivan Mahonin b53a5c
    return old_value != *value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB nk_bool
Ivan Mahonin b53a5c
nk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out,
Ivan Mahonin b53a5c
    struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value,
Ivan Mahonin b53a5c
    const struct nk_image *img, const struct nk_style_selectable *style,
Ivan Mahonin b53a5c
    const struct nk_input *in, const struct nk_user_font *font)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_bool old_value;
Ivan Mahonin b53a5c
    struct nk_rect touch;
Ivan Mahonin b53a5c
    struct nk_rect icon;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(state);
Ivan Mahonin b53a5c
    NK_ASSERT(out);
Ivan Mahonin b53a5c
    NK_ASSERT(str);
Ivan Mahonin b53a5c
    NK_ASSERT(len);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
Ivan Mahonin b53a5c
    NK_ASSERT(style);
Ivan Mahonin b53a5c
    NK_ASSERT(font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (!state || !out || !str || !len || !value || !style || !font) return 0;
Ivan Mahonin b53a5c
    old_value = *value;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* toggle behavior */
Ivan Mahonin b53a5c
    touch.x = bounds.x - style->touch_padding.x;
Ivan Mahonin b53a5c
    touch.y = bounds.y - style->touch_padding.y;
Ivan Mahonin b53a5c
    touch.w = bounds.w + style->touch_padding.x * 2;
Ivan Mahonin b53a5c
    touch.h = bounds.h + style->touch_padding.y * 2;
Ivan Mahonin b53a5c
    if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        *value = !(*value);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    icon.y = bounds.y + style->padding.y;
Ivan Mahonin b53a5c
    icon.w = icon.h = bounds.h - 2 * style->padding.y;
Ivan Mahonin b53a5c
    if (align & NK_TEXT_ALIGN_LEFT) {
Ivan Mahonin b53a5c
        icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w);
Ivan Mahonin b53a5c
        icon.x = NK_MAX(icon.x, 0);
Ivan Mahonin b53a5c
    } else icon.x = bounds.x + 2 * style->padding.x;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    icon.x += style->image_padding.x;
Ivan Mahonin b53a5c
    icon.y += style->image_padding.y;
Ivan Mahonin b53a5c
    icon.w -= 2 * style->image_padding.x;
Ivan Mahonin b53a5c
    icon.h -= 2 * style->image_padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw selectable */
Ivan Mahonin b53a5c
    if (style->draw_begin) style->draw_begin(out, style->userdata);
Ivan Mahonin b53a5c
    nk_draw_selectable(out, *state, style, *value, &bounds, &icon, img, NK_SYMBOL_NONE, str, len, align, font);
Ivan Mahonin b53a5c
    if (style->draw_end) style->draw_end(out, style->userdata);
Ivan Mahonin b53a5c
    return old_value != *value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB nk_bool
Ivan Mahonin b53a5c
nk_do_selectable_symbol(nk_flags *state, struct nk_command_buffer *out,
Ivan Mahonin b53a5c
    struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value,
Ivan Mahonin b53a5c
    enum nk_symbol_type sym, const struct nk_style_selectable *style,
Ivan Mahonin b53a5c
    const struct nk_input *in, const struct nk_user_font *font)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int old_value;
Ivan Mahonin b53a5c
    struct nk_rect touch;
Ivan Mahonin b53a5c
    struct nk_rect icon;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(state);
Ivan Mahonin b53a5c
    NK_ASSERT(out);
Ivan Mahonin b53a5c
    NK_ASSERT(str);
Ivan Mahonin b53a5c
    NK_ASSERT(len);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
Ivan Mahonin b53a5c
    NK_ASSERT(style);
Ivan Mahonin b53a5c
    NK_ASSERT(font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (!state || !out || !str || !len || !value || !style || !font) return 0;
Ivan Mahonin b53a5c
    old_value = *value;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* toggle behavior */
Ivan Mahonin b53a5c
    touch.x = bounds.x - style->touch_padding.x;
Ivan Mahonin b53a5c
    touch.y = bounds.y - style->touch_padding.y;
Ivan Mahonin b53a5c
    touch.w = bounds.w + style->touch_padding.x * 2;
Ivan Mahonin b53a5c
    touch.h = bounds.h + style->touch_padding.y * 2;
Ivan Mahonin b53a5c
    if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        *value = !(*value);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    icon.y = bounds.y + style->padding.y;
Ivan Mahonin b53a5c
    icon.w = icon.h = bounds.h - 2 * style->padding.y;
Ivan Mahonin b53a5c
    if (align & NK_TEXT_ALIGN_LEFT) {
Ivan Mahonin b53a5c
        icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w);
Ivan Mahonin b53a5c
        icon.x = NK_MAX(icon.x, 0);
Ivan Mahonin b53a5c
    } else icon.x = bounds.x + 2 * style->padding.x;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    icon.x += style->image_padding.x;
Ivan Mahonin b53a5c
    icon.y += style->image_padding.y;
Ivan Mahonin b53a5c
    icon.w -= 2 * style->image_padding.x;
Ivan Mahonin b53a5c
    icon.h -= 2 * style->image_padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw selectable */
Ivan Mahonin b53a5c
    if (style->draw_begin) style->draw_begin(out, style->userdata);
Ivan Mahonin b53a5c
    nk_draw_selectable(out, *state, style, *value, &bounds, &icon, 0, sym, str, len, align, font);
Ivan Mahonin b53a5c
    if (style->draw_end) style->draw_end(out, style->userdata);
Ivan Mahonin b53a5c
    return old_value != *value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_selectable_text(struct nk_context *ctx, const char *str, int len,
Ivan Mahonin b53a5c
    nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    enum nk_widget_layout_states state;
Ivan Mahonin b53a5c
    struct nk_rect bounds;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
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 || !value)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    state = nk_widget(&bounds, ctx);
Ivan Mahonin b53a5c
    if (!state) return 0;
Ivan Mahonin b53a5c
    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
Ivan Mahonin b53a5c
    return nk_do_selectable(&ctx->last_widget_state, &win->buffer, bounds,
Ivan Mahonin b53a5c
                str, len, align, value, &style->selectable, in, style->font);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_selectable_image_text(struct nk_context *ctx, struct nk_image img,
Ivan Mahonin b53a5c
    const char *str, int len, nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    enum nk_widget_layout_states state;
Ivan Mahonin b53a5c
    struct nk_rect bounds;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
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 || !value)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    state = nk_widget(&bounds, ctx);
Ivan Mahonin b53a5c
    if (!state) return 0;
Ivan Mahonin b53a5c
    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
Ivan Mahonin b53a5c
    return nk_do_selectable_image(&ctx->last_widget_state, &win->buffer, bounds,
Ivan Mahonin b53a5c
                str, len, align, value, &img, &style->selectable, in, style->font);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_selectable_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *str, int len, nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    enum nk_widget_layout_states state;
Ivan Mahonin b53a5c
    struct nk_rect bounds;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(value);
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 || !value)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    state = nk_widget(&bounds, ctx);
Ivan Mahonin b53a5c
    if (!state) return 0;
Ivan Mahonin b53a5c
    in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
Ivan Mahonin b53a5c
    return nk_do_selectable_symbol(&ctx->last_widget_state, &win->buffer, bounds,
Ivan Mahonin b53a5c
                str, len, align, value, sym, &style->selectable, in, style->font);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_selectable_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *title, nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_selectable_symbol_text(ctx, sym, title, nk_strlen(title), align, value);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_select_text(struct nk_context *ctx, const char *str, int len,
Ivan Mahonin b53a5c
    nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_selectable_text(ctx, str, len, align, &value);return value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_selectable_label(struct nk_context *ctx, const char *str, nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_selectable_text(ctx, str, nk_strlen(str), align, value);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_selectable_image_label(struct nk_context *ctx,struct nk_image img,
Ivan Mahonin b53a5c
    const char *str, nk_flags align, nk_bool *value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, value);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_select_label(struct nk_context *ctx, const char *str, nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_selectable_text(ctx, str, nk_strlen(str), align, &value);return value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_select_image_label(struct nk_context *ctx, struct nk_image img,
Ivan Mahonin b53a5c
    const char *str, nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, &value);return value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool nk_select_image_text(struct nk_context *ctx, struct nk_image img,
Ivan Mahonin b53a5c
    const char *str, int len, nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_selectable_image_text(ctx, img, str, len, align, &value);return value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_select_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *title, int title_len, nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_selectable_symbol_text(ctx, sym, title, title_len, align, &value);return value;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_select_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *title, nk_flags align, nk_bool value)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_select_symbol_text(ctx, sym, title, nk_strlen(title), align, value);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c