Blame src-nuklear/nuklear_combo.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
 *                          COMBO
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_INTERN nk_bool
Ivan Mahonin b53a5c
nk_combo_begin(struct nk_context *ctx, struct nk_window *win,
Ivan Mahonin b53a5c
    struct nk_vec2 size, nk_bool is_clicked, struct nk_rect header)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *popup;
Ivan Mahonin b53a5c
    int is_open = 0;
Ivan Mahonin b53a5c
    int is_active = 0;
Ivan Mahonin b53a5c
    struct nk_rect body;
Ivan Mahonin b53a5c
    nk_hash hash;
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
    popup = win->popup.win;
Ivan Mahonin b53a5c
    body.x = header.x;
Ivan Mahonin b53a5c
    body.w = size.x;
Ivan Mahonin b53a5c
    body.y = header.y + header.h-ctx->style.window.combo_border;
Ivan Mahonin b53a5c
    body.h = size.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    hash = win->popup.combo_count++;
Ivan Mahonin b53a5c
    is_open = (popup) ? nk_true:nk_false;
Ivan Mahonin b53a5c
    is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_COMBO);
Ivan Mahonin b53a5c
    if ((is_clicked && is_open && !is_active) || (is_open && !is_active) ||
Ivan Mahonin b53a5c
        (!is_open && !is_active && !is_clicked)) return 0;
Ivan Mahonin b53a5c
    if (!nk_nonblock_begin(ctx, 0, body,
Ivan Mahonin b53a5c
        (is_clicked && is_open)?nk_rect(0,0,0,0):header, NK_PANEL_COMBO)) return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win->popup.type = NK_PANEL_COMBO;
Ivan Mahonin b53a5c
    win->popup.name = hash;
Ivan Mahonin b53a5c
    return 1;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_text(struct nk_context *ctx, const char *selected, int len,
Ivan Mahonin b53a5c
    struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
Ivan Mahonin b53a5c
    struct nk_text text;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(selected);
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 || !selected)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (s == NK_WIDGET_INVALID)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
        text.text = style->combo.label_active;
Ivan Mahonin b53a5c
    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
        text.text = style->combo.label_hover;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        background = &style->combo.normal;
Ivan Mahonin b53a5c
        text.text = style->combo.label_normal;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
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(&win->buffer, header, &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(&win->buffer, header, &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(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        /* print currently selected text item */
Ivan Mahonin b53a5c
        struct nk_rect label;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        int draw_button_symbol;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else
Ivan Mahonin b53a5c
            sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* represents whether or not the combo's button symbol should be drawn */
Ivan Mahonin b53a5c
        draw_button_symbol = sym != NK_SYMBOL_NONE;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw selected label */
Ivan Mahonin b53a5c
        text.padding = nk_vec2(0,0);
Ivan Mahonin b53a5c
        label.x = header.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        label.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        label.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            label.w = button.x - (style->combo.content_padding.x + style->combo.spacing.x) - label.x;
Ivan Mahonin b53a5c
        else
Ivan Mahonin b53a5c
            label.w = header.w - 2 * style->combo.content_padding.x;
Ivan Mahonin b53a5c
        nk_widget_text(&win->buffer, label, selected, len, &text,
Ivan Mahonin b53a5c
            NK_TEXT_LEFT, ctx->style.font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw open/close button */
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
                &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_label(struct nk_context *ctx, const char *selected, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_combo_begin_text(ctx, selected, nk_strlen(selected), size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_color(struct nk_context *ctx, struct nk_color color, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (s == NK_WIDGET_INVALID)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED)
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
    else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
    else background = &style->combo.normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    switch(background->type) {
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_IMAGE:
Ivan Mahonin b53a5c
            nk_draw_image(&win->buffer, header, &background->data.image, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_NINE_SLICE:
Ivan Mahonin b53a5c
            nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_COLOR:
Ivan Mahonin b53a5c
            nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
        struct nk_rect bounds;
Ivan Mahonin b53a5c
        int draw_button_symbol;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* represents whether or not the combo's button symbol should be drawn */
Ivan Mahonin b53a5c
        draw_button_symbol = sym != NK_SYMBOL_NONE;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw color */
Ivan Mahonin b53a5c
        bounds.h = header.h - 4 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.y = header.y + 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.x = header.x + 2 * style->combo.content_padding.x;
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            bounds.w = (button.x - (style->combo.content_padding.x + style->combo.spacing.x)) - bounds.x;
Ivan Mahonin b53a5c
        else
Ivan Mahonin b53a5c
            bounds.w = header.w - 4 * style->combo.content_padding.x;
Ivan Mahonin b53a5c
        nk_fill_rect(&win->buffer, bounds, 0, color);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw open/close button */
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
                &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_symbol(struct nk_context *ctx, enum nk_symbol_type symbol, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
Ivan Mahonin b53a5c
    struct nk_color sym_background;
Ivan Mahonin b53a5c
    struct nk_color symbol_color;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (s == NK_WIDGET_INVALID)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_active;
Ivan Mahonin b53a5c
    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_hover;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        background = &style->combo.normal;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_hover;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    switch(background->type) {
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_IMAGE:
Ivan Mahonin b53a5c
            sym_background = nk_rgba(0, 0, 0, 0);
Ivan Mahonin b53a5c
            nk_draw_image(&win->buffer, header, &background->data.image, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_NINE_SLICE:
Ivan Mahonin b53a5c
            sym_background = nk_rgba(0, 0, 0, 0);
Ivan Mahonin b53a5c
            nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_COLOR:
Ivan Mahonin b53a5c
            sym_background = background->data.color;
Ivan Mahonin b53a5c
            nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        struct nk_rect bounds = {0,0,0,0};
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw symbol */
Ivan Mahonin b53a5c
        bounds.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.x = header.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        bounds.w = (button.x - style->combo.content_padding.y) - bounds.x;
Ivan Mahonin b53a5c
        nk_draw_symbol(&win->buffer, symbol, bounds, sym_background, symbol_color,
Ivan Mahonin b53a5c
            1.0f, style->font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw open/close button */
Ivan Mahonin b53a5c
        nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
            &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_symbol_text(struct nk_context *ctx, const char *selected, int len,
Ivan Mahonin b53a5c
    enum nk_symbol_type symbol, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
Ivan Mahonin b53a5c
    struct nk_color symbol_color;
Ivan Mahonin b53a5c
    struct nk_text text;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (!s) return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_active;
Ivan Mahonin b53a5c
        text.text = style->combo.label_active;
Ivan Mahonin b53a5c
    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_hover;
Ivan Mahonin b53a5c
        text.text = style->combo.label_hover;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        background = &style->combo.normal;
Ivan Mahonin b53a5c
        symbol_color = style->combo.symbol_normal;
Ivan Mahonin b53a5c
        text.text = style->combo.label_normal;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
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(&win->buffer, header, &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(&win->buffer, header, &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(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
        struct nk_rect label;
Ivan Mahonin b53a5c
        struct nk_rect image;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
        nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
            &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw symbol */
Ivan Mahonin b53a5c
        image.x = header.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        image.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        image.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        image.w = image.h;
Ivan Mahonin b53a5c
        nk_draw_symbol(&win->buffer, symbol, image, text.background, symbol_color,
Ivan Mahonin b53a5c
            1.0f, style->font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw label */
Ivan Mahonin b53a5c
        text.padding = nk_vec2(0,0);
Ivan Mahonin b53a5c
        label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        label.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        label.w = (button.x - style->combo.content_padding.x) - label.x;
Ivan Mahonin b53a5c
        label.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_image(struct nk_context *ctx, struct nk_image img, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
    const struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (s == NK_WIDGET_INVALID)
Ivan Mahonin b53a5c
        return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED)
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
    else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
    else background = &style->combo.normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    switch (background->type) {
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_IMAGE:
Ivan Mahonin b53a5c
            nk_draw_image(&win->buffer, header, &background->data.image, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_NINE_SLICE:
Ivan Mahonin b53a5c
            nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
        case NK_STYLE_ITEM_COLOR:
Ivan Mahonin b53a5c
            nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        struct nk_rect bounds = {0,0,0,0};
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
        int draw_button_symbol;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* represents whether or not the combo's button symbol should be drawn */
Ivan Mahonin b53a5c
        draw_button_symbol = sym != NK_SYMBOL_NONE;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw image */
Ivan Mahonin b53a5c
        bounds.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        bounds.x = header.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            bounds.w = (button.x - style->combo.content_padding.y) - bounds.x;
Ivan Mahonin b53a5c
        else
Ivan Mahonin b53a5c
            bounds.w = header.w - 2 * style->combo.content_padding.x;
Ivan Mahonin b53a5c
        nk_draw_image(&win->buffer, bounds, &img, nk_white);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw open/close button */
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
                &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_image_text(struct nk_context *ctx, const char *selected, int len,
Ivan Mahonin b53a5c
    struct nk_image img, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_style *style;
Ivan Mahonin b53a5c
    struct nk_input *in;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_rect header;
Ivan Mahonin b53a5c
    int is_clicked = nk_false;
Ivan Mahonin b53a5c
    enum nk_widget_layout_states s;
Ivan Mahonin b53a5c
    const struct nk_style_item *background;
Ivan Mahonin b53a5c
    struct nk_text text;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    s = nk_widget(&header, ctx);
Ivan Mahonin b53a5c
    if (!s) return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input;
Ivan Mahonin b53a5c
    if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT))
Ivan Mahonin b53a5c
        is_clicked = nk_true;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* draw combo box header background and border */
Ivan Mahonin b53a5c
    if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) {
Ivan Mahonin b53a5c
        background = &style->combo.active;
Ivan Mahonin b53a5c
        text.text = style->combo.label_active;
Ivan Mahonin b53a5c
    } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) {
Ivan Mahonin b53a5c
        background = &style->combo.hover;
Ivan Mahonin b53a5c
        text.text = style->combo.label_hover;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        background = &style->combo.normal;
Ivan Mahonin b53a5c
        text.text = style->combo.label_normal;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
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(&win->buffer, header, &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(&win->buffer, header, &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(&win->buffer, header, style->combo.rounding, background->data.color);
Ivan Mahonin b53a5c
            nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color);
Ivan Mahonin b53a5c
            break;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    {
Ivan Mahonin b53a5c
        struct nk_rect content;
Ivan Mahonin b53a5c
        struct nk_rect button;
Ivan Mahonin b53a5c
        struct nk_rect label;
Ivan Mahonin b53a5c
        struct nk_rect image;
Ivan Mahonin b53a5c
        int draw_button_symbol;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        enum nk_symbol_type sym;
Ivan Mahonin b53a5c
        if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER)
Ivan Mahonin b53a5c
            sym = style->combo.sym_hover;
Ivan Mahonin b53a5c
        else if (is_clicked)
Ivan Mahonin b53a5c
            sym = style->combo.sym_active;
Ivan Mahonin b53a5c
        else sym = style->combo.sym_normal;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* represents whether or not the combo's button symbol should be drawn */
Ivan Mahonin b53a5c
        draw_button_symbol = sym != NK_SYMBOL_NONE;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* calculate button */
Ivan Mahonin b53a5c
        button.w = header.h - 2 * style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.x = (header.x + header.w - header.h) - style->combo.button_padding.x;
Ivan Mahonin b53a5c
        button.y = header.y + style->combo.button_padding.y;
Ivan Mahonin b53a5c
        button.h = button.w;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        content.x = button.x + style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.y = button.y + style->combo.button.padding.y;
Ivan Mahonin b53a5c
        content.w = button.w - 2 * style->combo.button.padding.x;
Ivan Mahonin b53a5c
        content.h = button.h - 2 * style->combo.button.padding.y;
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state,
Ivan Mahonin b53a5c
                &ctx->style.combo.button, sym, style->font);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw image */
Ivan Mahonin b53a5c
        image.x = header.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        image.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        image.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        image.w = image.h;
Ivan Mahonin b53a5c
        nk_draw_image(&win->buffer, image, &img, nk_white);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        /* draw label */
Ivan Mahonin b53a5c
        text.padding = nk_vec2(0,0);
Ivan Mahonin b53a5c
        label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x;
Ivan Mahonin b53a5c
        label.y = header.y + style->combo.content_padding.y;
Ivan Mahonin b53a5c
        label.h = header.h - 2 * style->combo.content_padding.y;
Ivan Mahonin b53a5c
        if (draw_button_symbol)
Ivan Mahonin b53a5c
            label.w = (button.x - style->combo.content_padding.x) - label.x;
Ivan Mahonin b53a5c
        else
Ivan Mahonin b53a5c
            label.w = (header.x + header.w - style->combo.content_padding.x) - label.x;
Ivan Mahonin b53a5c
        nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return nk_combo_begin(ctx, win, size, is_clicked, header);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_symbol_label(struct nk_context *ctx,
Ivan Mahonin b53a5c
    const char *selected, enum nk_symbol_type type, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_combo_begin_symbol_text(ctx, selected, nk_strlen(selected), type, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_begin_image_label(struct nk_context *ctx,
Ivan Mahonin b53a5c
    const char *selected, struct nk_image img, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_combo_begin_image_text(ctx, selected, nk_strlen(selected), img, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_text(struct nk_context *ctx, const char *text, int len,nk_flags align)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_text(ctx, text, len, align);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_label(struct nk_context *ctx, const char *label, nk_flags align)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_label(ctx, label, align);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_image_text(struct nk_context *ctx, struct nk_image img, const char *text,
Ivan Mahonin b53a5c
    int len, nk_flags alignment)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_image_text(ctx, img, text, len, alignment);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_image_label(struct nk_context *ctx, struct nk_image img,
Ivan Mahonin b53a5c
    const char *text, nk_flags alignment)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_image_label(ctx, img, text, alignment);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *text, int len, nk_flags alignment)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_symbol_text(ctx, sym, text, len, alignment);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_combo_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym,
Ivan Mahonin b53a5c
    const char *label, nk_flags alignment)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_contextual_item_symbol_label(ctx, sym, label, alignment);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void nk_combo_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_contextual_end(ctx);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void nk_combo_close(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_contextual_close(ctx);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API int
Ivan Mahonin b53a5c
nk_combo(struct nk_context *ctx, const char **items, int count,
Ivan Mahonin b53a5c
    int selected, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i = 0;
Ivan Mahonin b53a5c
    int max_height;
Ivan Mahonin b53a5c
    struct nk_vec2 item_spacing;
Ivan Mahonin b53a5c
    struct nk_vec2 window_padding;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(items);
Ivan Mahonin b53a5c
    NK_ASSERT(ctx->current);
Ivan Mahonin b53a5c
    if (!ctx || !items ||!count)
Ivan Mahonin b53a5c
        return selected;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    item_spacing = ctx->style.window.spacing;
Ivan Mahonin b53a5c
    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);
Ivan Mahonin b53a5c
    max_height = count * item_height + count * (int)item_spacing.y;
Ivan Mahonin b53a5c
    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;
Ivan Mahonin b53a5c
    size.y = NK_MIN(size.y, (float)max_height);
Ivan Mahonin b53a5c
    if (nk_combo_begin_label(ctx, items[selected], size)) {
Ivan Mahonin b53a5c
        nk_layout_row_dynamic(ctx, (float)item_height, 1);
Ivan Mahonin b53a5c
        for (i = 0; i < count; ++i) {
Ivan Mahonin b53a5c
            if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT))
Ivan Mahonin b53a5c
                selected = i;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
        nk_combo_end(ctx);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return selected;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API int
Ivan Mahonin b53a5c
nk_combo_separator(struct nk_context *ctx, const char *items_separated_by_separator,
Ivan Mahonin b53a5c
    int separator, int selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    int max_height;
Ivan Mahonin b53a5c
    struct nk_vec2 item_spacing;
Ivan Mahonin b53a5c
    struct nk_vec2 window_padding;
Ivan Mahonin b53a5c
    const char *current_item;
Ivan Mahonin b53a5c
    const char *iter;
Ivan Mahonin b53a5c
    int length = 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(items_separated_by_separator);
Ivan Mahonin b53a5c
    if (!ctx || !items_separated_by_separator)
Ivan Mahonin b53a5c
        return selected;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* calculate popup window */
Ivan Mahonin b53a5c
    item_spacing = ctx->style.window.spacing;
Ivan Mahonin b53a5c
    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);
Ivan Mahonin b53a5c
    max_height = count * item_height + count * (int)item_spacing.y;
Ivan Mahonin b53a5c
    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;
Ivan Mahonin b53a5c
    size.y = NK_MIN(size.y, (float)max_height);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* find selected item */
Ivan Mahonin b53a5c
    current_item = items_separated_by_separator;
Ivan Mahonin b53a5c
    for (i = 0; i < count; ++i) {
Ivan Mahonin b53a5c
        iter = current_item;
Ivan Mahonin b53a5c
        while (*iter && *iter != separator) iter++;
Ivan Mahonin b53a5c
        length = (int)(iter - current_item);
Ivan Mahonin b53a5c
        if (i == selected) break;
Ivan Mahonin b53a5c
        current_item = iter + 1;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (nk_combo_begin_text(ctx, current_item, length, size)) {
Ivan Mahonin b53a5c
        current_item = items_separated_by_separator;
Ivan Mahonin b53a5c
        nk_layout_row_dynamic(ctx, (float)item_height, 1);
Ivan Mahonin b53a5c
        for (i = 0; i < count; ++i) {
Ivan Mahonin b53a5c
            iter = current_item;
Ivan Mahonin b53a5c
            while (*iter && *iter != separator) iter++;
Ivan Mahonin b53a5c
            length = (int)(iter - current_item);
Ivan Mahonin b53a5c
            if (nk_combo_item_text(ctx, current_item, length, NK_TEXT_LEFT))
Ivan Mahonin b53a5c
                selected = i;
Ivan Mahonin b53a5c
            current_item = current_item + length + 1;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
        nk_combo_end(ctx);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    return selected;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API int
Ivan Mahonin b53a5c
nk_combo_string(struct nk_context *ctx, const char *items_separated_by_zeros,
Ivan Mahonin b53a5c
    int selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    return nk_combo_separator(ctx, items_separated_by_zeros, '\0', selected, count, item_height, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API int
Ivan Mahonin b53a5c
nk_combo_callback(struct nk_context *ctx, void(*item_getter)(void*, int, const char**),
Ivan Mahonin b53a5c
    void *userdata, int selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    int max_height;
Ivan Mahonin b53a5c
    struct nk_vec2 item_spacing;
Ivan Mahonin b53a5c
    struct nk_vec2 window_padding;
Ivan Mahonin b53a5c
    const char *item;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(item_getter);
Ivan Mahonin b53a5c
    if (!ctx || !item_getter)
Ivan Mahonin b53a5c
        return selected;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* calculate popup window */
Ivan Mahonin b53a5c
    item_spacing = ctx->style.window.spacing;
Ivan Mahonin b53a5c
    window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type);
Ivan Mahonin b53a5c
    max_height = count * item_height + count * (int)item_spacing.y;
Ivan Mahonin b53a5c
    max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2;
Ivan Mahonin b53a5c
    size.y = NK_MIN(size.y, (float)max_height);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    item_getter(userdata, selected, &item);
Ivan Mahonin b53a5c
    if (nk_combo_begin_label(ctx, item, size)) {
Ivan Mahonin b53a5c
        nk_layout_row_dynamic(ctx, (float)item_height, 1);
Ivan Mahonin b53a5c
        for (i = 0; i < count; ++i) {
Ivan Mahonin b53a5c
            item_getter(userdata, i, &item);
Ivan Mahonin b53a5c
            if (nk_combo_item_label(ctx, item, NK_TEXT_LEFT))
Ivan Mahonin b53a5c
                selected = i;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
        nk_combo_end(ctx);
Ivan Mahonin b53a5c
    } return selected;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_combobox(struct nk_context *ctx, const char **items, int count,
Ivan Mahonin b53a5c
    int *selected, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    *selected = nk_combo(ctx, items, count, *selected, item_height, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_combobox_string(struct nk_context *ctx, const char *items_separated_by_zeros,
Ivan Mahonin b53a5c
    int *selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    *selected = nk_combo_string(ctx, items_separated_by_zeros, *selected, count, item_height, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_combobox_separator(struct nk_context *ctx, const char *items_separated_by_separator,
Ivan Mahonin b53a5c
    int separator, int *selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    *selected = nk_combo_separator(ctx, items_separated_by_separator, separator,
Ivan Mahonin b53a5c
                                    *selected, count, item_height, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_combobox_callback(struct nk_context *ctx,
Ivan Mahonin b53a5c
    void(*item_getter)(void* data, int id, const char **out_text),
Ivan Mahonin b53a5c
    void *userdata, int *selected, int count, int item_height, struct nk_vec2 size)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    *selected = nk_combo_callback(ctx, item_getter, userdata,  *selected, count, item_height, size);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c