Blame src-nuklear/nuklear_layout.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
 *                          LAYOUT
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_set_min_row_height(struct nk_context *ctx, float height)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    layout->row.min_height = height;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_reset_min_row_height(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    layout->row.min_height = ctx->style.font->height;
Ivan Mahonin b53a5c
    layout->row.min_height += ctx->style.text.padding.y*2;
Ivan Mahonin b53a5c
    layout->row.min_height += ctx->style.window.min_row_height_padding*2;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB float
Ivan Mahonin b53a5c
nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type,
Ivan Mahonin b53a5c
    float total_space, int columns)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    float panel_spacing;
Ivan Mahonin b53a5c
    float panel_space;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_vec2 spacing;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_UNUSED(type);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    spacing = style->window.spacing;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* calculate the usable panel space */
Ivan Mahonin b53a5c
    panel_spacing = (float)NK_MAX(columns - 1, 0) * spacing.x;
Ivan Mahonin b53a5c
    panel_space  = total_space - panel_spacing;
Ivan Mahonin b53a5c
    return panel_space;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_panel_layout(const struct nk_context *ctx, struct nk_window *win,
Ivan Mahonin b53a5c
    float height, int cols)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
    struct nk_command_buffer *out;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_vec2 item_spacing;
Ivan Mahonin b53a5c
    struct nk_color 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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* prefetch some configuration data */
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    out = &win->buffer;
Ivan Mahonin b53a5c
    color = style->window.background;
Ivan Mahonin b53a5c
    item_spacing = style->window.spacing;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /*  if one of these triggers you forgot to add an `if` condition around either
Ivan Mahonin b53a5c
        a window, group, popup, combobox or contextual menu `begin` and `end` block.
Ivan Mahonin b53a5c
        Example:
Ivan Mahonin b53a5c
            if (nk_begin(...) {...} nk_end(...); or
Ivan Mahonin b53a5c
            if (nk_group_begin(...) { nk_group_end(...);} */
Ivan Mahonin b53a5c
    NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED));
Ivan Mahonin b53a5c
    NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN));
Ivan Mahonin b53a5c
    NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED));
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* update the current row and set the current row layout */
Ivan Mahonin b53a5c
    layout->row.index = 0;
Ivan Mahonin b53a5c
    layout->at_y += layout->row.height;
Ivan Mahonin b53a5c
    layout->row.columns = cols;
Ivan Mahonin b53a5c
    if (height == 0.0f)
Ivan Mahonin b53a5c
        layout->row.height = NK_MAX(height, layout->row.min_height) + item_spacing.y;
Ivan Mahonin b53a5c
    else layout->row.height = height + item_spacing.y;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    if (layout->flags & NK_WINDOW_DYNAMIC) {
Ivan Mahonin b53a5c
        /* draw background for dynamic panels */
Ivan Mahonin b53a5c
        struct nk_rect background;
Ivan Mahonin b53a5c
        background.x = win->bounds.x;
Ivan Mahonin b53a5c
        background.w = win->bounds.w;
Ivan Mahonin b53a5c
        background.y = layout->at_y - 1.0f;
Ivan Mahonin b53a5c
        background.h = layout->row.height + 1.0f;
Ivan Mahonin b53a5c
        nk_fill_rect(out, background, 0, color);
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt,
Ivan Mahonin b53a5c
    float height, int cols, int width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    /* update the current row and set the current row layout */
Ivan Mahonin b53a5c
    struct nk_window *win;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, height, cols);
Ivan Mahonin b53a5c
    if (fmt == NK_DYNAMIC)
Ivan Mahonin b53a5c
        win->layout->row.type = NK_LAYOUT_DYNAMIC_FIXED;
Ivan Mahonin b53a5c
    else win->layout->row.type = NK_LAYOUT_STATIC_FIXED;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win->layout->row.ratio = 0;
Ivan Mahonin b53a5c
    win->layout->row.filled = 0;
Ivan Mahonin b53a5c
    win->layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    win->layout->row.item_width = (float)width;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API float
Ivan Mahonin b53a5c
nk_layout_ratio_from_pixel(struct nk_context *ctx, float pixel_width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(pixel_width);
Ivan Mahonin b53a5c
    if (!ctx || !ctx->current || !ctx->current->layout) return 0;
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    return NK_CLAMP(0.0f, pixel_width/win->bounds.x, 1.0f);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_row_layout(ctx, NK_DYNAMIC, height, cols, 0);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    nk_row_layout(ctx, NK_STATIC, height, cols, item_width);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt,
Ivan Mahonin b53a5c
    float row_height, int cols)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, row_height, cols);
Ivan Mahonin b53a5c
    if (fmt == NK_DYNAMIC)
Ivan Mahonin b53a5c
        layout->row.type = NK_LAYOUT_DYNAMIC_ROW;
Ivan Mahonin b53a5c
    else layout->row.type = NK_LAYOUT_STATIC_ROW;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    layout->row.ratio = 0;
Ivan Mahonin b53a5c
    layout->row.filled = 0;
Ivan Mahonin b53a5c
    layout->row.item_width = 0;
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    layout->row.columns = cols;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_push(struct nk_context *ctx, float ratio_or_width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW)
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    if (layout->row.type == NK_LAYOUT_DYNAMIC_ROW) {
Ivan Mahonin b53a5c
        float ratio = ratio_or_width;
Ivan Mahonin b53a5c
        if ((ratio + layout->row.filled) > 1.0f) return;
Ivan Mahonin b53a5c
        if (ratio > 0.0f)
Ivan Mahonin b53a5c
            layout->row.item_width = NK_SATURATE(ratio);
Ivan Mahonin b53a5c
        else layout->row.item_width = 1.0f - layout->row.filled;
Ivan Mahonin b53a5c
    } else layout->row.item_width = ratio_or_width;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW)
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    layout->row.item_width = 0;
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row(struct nk_context *ctx, enum nk_layout_format fmt,
Ivan Mahonin b53a5c
    float height, int cols, const float *ratio)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int i;
Ivan Mahonin b53a5c
    int n_undef = 0;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, height, cols);
Ivan Mahonin b53a5c
    if (fmt == NK_DYNAMIC) {
Ivan Mahonin b53a5c
        /* calculate width of undefined widget ratios */
Ivan Mahonin b53a5c
        float r = 0;
Ivan Mahonin b53a5c
        layout->row.ratio = ratio;
Ivan Mahonin b53a5c
        for (i = 0; i < cols; ++i) {
Ivan Mahonin b53a5c
            if (ratio[i] < 0.0f)
Ivan Mahonin b53a5c
                n_undef++;
Ivan Mahonin b53a5c
            else r += ratio[i];
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
        r = NK_SATURATE(1.0f - r);
Ivan Mahonin b53a5c
        layout->row.type = NK_LAYOUT_DYNAMIC;
Ivan Mahonin b53a5c
        layout->row.item_width = (r > 0 && n_undef > 0) ? (r / (float)n_undef):0;
Ivan Mahonin b53a5c
    } else {
Ivan Mahonin b53a5c
        layout->row.ratio = ratio;
Ivan Mahonin b53a5c
        layout->row.type = NK_LAYOUT_STATIC;
Ivan Mahonin b53a5c
        layout->row.item_width = 0;
Ivan Mahonin b53a5c
        layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    layout->row.filled = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_template_begin(struct nk_context *ctx, float height)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, height, 1);
Ivan Mahonin b53a5c
    layout->row.type = NK_LAYOUT_TEMPLATE;
Ivan Mahonin b53a5c
    layout->row.columns = 0;
Ivan Mahonin b53a5c
    layout->row.ratio = 0;
Ivan Mahonin b53a5c
    layout->row.item_width = 0;
Ivan Mahonin b53a5c
    layout->row.item_height = 0;
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    layout->row.filled = 0;
Ivan Mahonin b53a5c
    layout->row.item.x = 0;
Ivan Mahonin b53a5c
    layout->row.item.y = 0;
Ivan Mahonin b53a5c
    layout->row.item.w = 0;
Ivan Mahonin b53a5c
    layout->row.item.h = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_template_push_dynamic(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;
Ivan Mahonin b53a5c
    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;
Ivan Mahonin b53a5c
    layout->row.templates[layout->row.columns++] = -1.0f;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_template_push_variable(struct nk_context *ctx, float min_width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;
Ivan Mahonin b53a5c
    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;
Ivan Mahonin b53a5c
    layout->row.templates[layout->row.columns++] = -min_width;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_template_push_static(struct nk_context *ctx, float width)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;
Ivan Mahonin b53a5c
    if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return;
Ivan Mahonin b53a5c
    layout->row.templates[layout->row.columns++] = width;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_row_template_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    int i = 0;
Ivan Mahonin b53a5c
    int variable_count = 0;
Ivan Mahonin b53a5c
    int min_variable_count = 0;
Ivan Mahonin b53a5c
    float min_fixed_width = 0.0f;
Ivan Mahonin b53a5c
    float total_fixed_width = 0.0f;
Ivan Mahonin b53a5c
    float max_variable_width = 0.0f;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE);
Ivan Mahonin b53a5c
    if (layout->row.type != NK_LAYOUT_TEMPLATE) return;
Ivan Mahonin b53a5c
    for (i = 0; i < layout->row.columns; ++i) {
Ivan Mahonin b53a5c
        float width = layout->row.templates[i];
Ivan Mahonin b53a5c
        if (width >= 0.0f) {
Ivan Mahonin b53a5c
            total_fixed_width += width;
Ivan Mahonin b53a5c
            min_fixed_width += width;
Ivan Mahonin b53a5c
        } else if (width < -1.0f) {
Ivan Mahonin b53a5c
            width = -width;
Ivan Mahonin b53a5c
            total_fixed_width += width;
Ivan Mahonin b53a5c
            max_variable_width = NK_MAX(max_variable_width, width);
Ivan Mahonin b53a5c
            variable_count++;
Ivan Mahonin b53a5c
        } else {
Ivan Mahonin b53a5c
            min_variable_count++;
Ivan Mahonin b53a5c
            variable_count++;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    if (variable_count) {
Ivan Mahonin b53a5c
        float space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,
Ivan Mahonin b53a5c
                            layout->bounds.w, layout->row.columns);
Ivan Mahonin b53a5c
        float var_width = (NK_MAX(space-min_fixed_width,0.0f)) / (float)variable_count;
Ivan Mahonin b53a5c
        int enough_space = var_width >= max_variable_width;
Ivan Mahonin b53a5c
        if (!enough_space)
Ivan Mahonin b53a5c
            var_width = (NK_MAX(space-total_fixed_width,0)) / (float)min_variable_count;
Ivan Mahonin b53a5c
        for (i = 0; i < layout->row.columns; ++i) {
Ivan Mahonin b53a5c
            float *width = &layout->row.templates[i];
Ivan Mahonin b53a5c
            *width = (*width >= 0.0f)? *width: (*width < -1.0f && !enough_space)? -(*width): var_width;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_space_begin(struct nk_context *ctx, enum nk_layout_format fmt,
Ivan Mahonin b53a5c
    float height, int widget_count)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, height, widget_count);
Ivan Mahonin b53a5c
    if (fmt == NK_STATIC)
Ivan Mahonin b53a5c
        layout->row.type = NK_LAYOUT_STATIC_FREE;
Ivan Mahonin b53a5c
    else layout->row.type = NK_LAYOUT_DYNAMIC_FREE;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    layout->row.ratio = 0;
Ivan Mahonin b53a5c
    layout->row.filled = 0;
Ivan Mahonin b53a5c
    layout->row.item_width = 0;
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_space_end(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    layout->row.item_width = 0;
Ivan Mahonin b53a5c
    layout->row.item_height = 0;
Ivan Mahonin b53a5c
    layout->row.item_offset = 0;
Ivan Mahonin b53a5c
    nk_zero(&layout->row.item, sizeof(layout->row.item));
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_layout_space_push(struct nk_context *ctx, struct nk_rect rect)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    layout->row.item = rect;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_rect
Ivan Mahonin b53a5c
nk_layout_space_bounds(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_rect ret;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x = layout->clip.x;
Ivan Mahonin b53a5c
    ret.y = layout->clip.y;
Ivan Mahonin b53a5c
    ret.w = layout->clip.w;
Ivan Mahonin b53a5c
    ret.h = layout->row.height;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_rect
Ivan Mahonin b53a5c
nk_layout_widget_bounds(struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_rect ret;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x = layout->at_x;
Ivan Mahonin b53a5c
    ret.y = layout->at_y;
Ivan Mahonin b53a5c
    ret.w = layout->bounds.w - NK_MAX(layout->at_x - layout->bounds.x,0);
Ivan Mahonin b53a5c
    ret.h = layout->row.height;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_vec2
Ivan Mahonin b53a5c
nk_layout_space_to_screen(struct nk_context *ctx, struct nk_vec2 ret)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x += layout->at_x - (float)*layout->offset_x;
Ivan Mahonin b53a5c
    ret.y += layout->at_y - (float)*layout->offset_y;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_vec2
Ivan Mahonin b53a5c
nk_layout_space_to_local(struct nk_context *ctx, struct nk_vec2 ret)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x += -layout->at_x + (float)*layout->offset_x;
Ivan Mahonin b53a5c
    ret.y += -layout->at_y + (float)*layout->offset_y;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_rect
Ivan Mahonin b53a5c
nk_layout_space_rect_to_screen(struct nk_context *ctx, struct nk_rect ret)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x += layout->at_x - (float)*layout->offset_x;
Ivan Mahonin b53a5c
    ret.y += layout->at_y - (float)*layout->offset_y;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API struct nk_rect
Ivan Mahonin b53a5c
nk_layout_space_rect_to_local(struct nk_context *ctx, struct nk_rect ret)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ret.x += -layout->at_x + (float)*layout->offset_x;
Ivan Mahonin b53a5c
    ret.y += -layout->at_y + (float)*layout->offset_y;
Ivan Mahonin b53a5c
    return ret;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_panel *layout = win->layout;
Ivan Mahonin b53a5c
    struct nk_vec2 spacing = ctx->style.window.spacing;
Ivan Mahonin b53a5c
    const float row_height = layout->row.height - spacing.y;
Ivan Mahonin b53a5c
    nk_panel_layout(ctx, win, row_height, layout->row.columns);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx,
Ivan Mahonin b53a5c
    struct nk_window *win, int modify)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    struct nk_vec2 spacing;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    float item_offset = 0;
Ivan Mahonin b53a5c
    float item_width = 0;
Ivan Mahonin b53a5c
    float item_spacing = 0;
Ivan Mahonin b53a5c
    float panel_space = 0;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    NK_ASSERT(bounds);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    spacing = style->window.spacing;
Ivan Mahonin b53a5c
    panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type,
Ivan Mahonin b53a5c
                                            layout->bounds.w, layout->row.columns);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    #define NK_FRAC(x) (x - (float)(int)x) /* will be used to remove fookin gaps */
Ivan Mahonin b53a5c
    /* calculate the width of one item inside the current layout space */
Ivan Mahonin b53a5c
    switch (layout->row.type) {
Ivan Mahonin b53a5c
    case NK_LAYOUT_DYNAMIC_FIXED: {
Ivan Mahonin b53a5c
        /* scaling fixed size widgets item width */
Ivan Mahonin b53a5c
        float w = NK_MAX(1.0f,panel_space) / (float)layout->row.columns;
Ivan Mahonin b53a5c
        item_offset = (float)layout->row.index * w;
Ivan Mahonin b53a5c
        item_width = w + NK_FRAC(item_offset);
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_DYNAMIC_ROW: {
Ivan Mahonin b53a5c
        /* scaling single ratio widget width */
Ivan Mahonin b53a5c
        float w = layout->row.item_width * panel_space;
Ivan Mahonin b53a5c
        item_offset = layout->row.item_offset;
Ivan Mahonin b53a5c
        item_width = w + NK_FRAC(item_offset);
Ivan Mahonin b53a5c
        item_spacing = 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        if (modify) {
Ivan Mahonin b53a5c
            layout->row.item_offset += w + spacing.x;
Ivan Mahonin b53a5c
            layout->row.filled += layout->row.item_width;
Ivan Mahonin b53a5c
            layout->row.index = 0;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_DYNAMIC_FREE: {
Ivan Mahonin b53a5c
        /* panel width depended free widget placing */
Ivan Mahonin b53a5c
        bounds->x = layout->at_x + (layout->bounds.w * layout->row.item.x);
Ivan Mahonin b53a5c
        bounds->x -= (float)*layout->offset_x;
Ivan Mahonin b53a5c
        bounds->y = layout->at_y + (layout->row.height * layout->row.item.y);
Ivan Mahonin b53a5c
        bounds->y -= (float)*layout->offset_y;
Ivan Mahonin b53a5c
        bounds->w = layout->bounds.w  * layout->row.item.w + NK_FRAC(bounds->x);
Ivan Mahonin b53a5c
        bounds->h = layout->row.height * layout->row.item.h + NK_FRAC(bounds->y);
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    case NK_LAYOUT_DYNAMIC: {
Ivan Mahonin b53a5c
        /* scaling arrays of panel width ratios for every widget */
Ivan Mahonin b53a5c
        float ratio, w;
Ivan Mahonin b53a5c
        NK_ASSERT(layout->row.ratio);
Ivan Mahonin b53a5c
        ratio = (layout->row.ratio[layout->row.index] < 0) ?
Ivan Mahonin b53a5c
            layout->row.item_width : layout->row.ratio[layout->row.index];
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        w = (ratio * panel_space);
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
        item_offset = layout->row.item_offset;
Ivan Mahonin b53a5c
        item_width = w + NK_FRAC(item_offset);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        if (modify) {
Ivan Mahonin b53a5c
            layout->row.item_offset += w;
Ivan Mahonin b53a5c
            layout->row.filled += ratio;
Ivan Mahonin b53a5c
        }
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_STATIC_FIXED: {
Ivan Mahonin b53a5c
        /* non-scaling fixed widgets item width */
Ivan Mahonin b53a5c
        item_width = layout->row.item_width;
Ivan Mahonin b53a5c
        item_offset = (float)layout->row.index * item_width;
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_STATIC_ROW: {
Ivan Mahonin b53a5c
        /* scaling single ratio widget width */
Ivan Mahonin b53a5c
        item_width = layout->row.item_width;
Ivan Mahonin b53a5c
        item_offset = layout->row.item_offset;
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
        if (modify) layout->row.item_offset += item_width;
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_STATIC_FREE: {
Ivan Mahonin b53a5c
        /* free widget placing */
Ivan Mahonin b53a5c
        bounds->x = layout->at_x + layout->row.item.x;
Ivan Mahonin b53a5c
        bounds->w = layout->row.item.w;
Ivan Mahonin b53a5c
        if (((bounds->x + bounds->w) > layout->max_x) && modify)
Ivan Mahonin b53a5c
            layout->max_x = (bounds->x + bounds->w);
Ivan Mahonin b53a5c
        bounds->x -= (float)*layout->offset_x;
Ivan Mahonin b53a5c
        bounds->y = layout->at_y + layout->row.item.y;
Ivan Mahonin b53a5c
        bounds->y -= (float)*layout->offset_y;
Ivan Mahonin b53a5c
        bounds->h = layout->row.item.h;
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    case NK_LAYOUT_STATIC: {
Ivan Mahonin b53a5c
        /* non-scaling array of panel pixel width for every widget */
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
        item_width = layout->row.ratio[layout->row.index];
Ivan Mahonin b53a5c
        item_offset = layout->row.item_offset;
Ivan Mahonin b53a5c
        if (modify) layout->row.item_offset += item_width;
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    case NK_LAYOUT_TEMPLATE: {
Ivan Mahonin b53a5c
        /* stretchy row layout with combined dynamic/static widget width*/
Ivan Mahonin b53a5c
        float w;
Ivan Mahonin b53a5c
        NK_ASSERT(layout->row.index < layout->row.columns);
Ivan Mahonin b53a5c
        NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS);
Ivan Mahonin b53a5c
        w = layout->row.templates[layout->row.index];
Ivan Mahonin b53a5c
        item_offset = layout->row.item_offset;
Ivan Mahonin b53a5c
        item_width = w + NK_FRAC(item_offset);
Ivan Mahonin b53a5c
        item_spacing = (float)layout->row.index * spacing.x;
Ivan Mahonin b53a5c
        if (modify) layout->row.item_offset += w;
Ivan Mahonin b53a5c
    } break;
Ivan Mahonin b53a5c
    #undef NK_FRAC
Ivan Mahonin b53a5c
    default: NK_ASSERT(0); break;
Ivan Mahonin b53a5c
    };
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* set the bounds of the newly allocated widget */
Ivan Mahonin b53a5c
    bounds->w = item_width;
Ivan Mahonin b53a5c
    bounds->h = layout->row.height - spacing.y;
Ivan Mahonin b53a5c
    bounds->y = layout->at_y - (float)*layout->offset_y;
Ivan Mahonin b53a5c
    bounds->x = layout->at_x + item_offset + item_spacing;
Ivan Mahonin b53a5c
    if (((bounds->x + bounds->w) > layout->max_x) && modify)
Ivan Mahonin b53a5c
        layout->max_x = bounds->x + bounds->w;
Ivan Mahonin b53a5c
    bounds->x -= (float)*layout->offset_x;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* check if the end of the row has been hit and begin new row if so */
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    if (layout->row.index >= layout->row.columns)
Ivan Mahonin b53a5c
        nk_panel_alloc_row(ctx, win);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* calculate widget position and size */
Ivan Mahonin b53a5c
    nk_layout_widget_space(bounds, ctx, win, nk_true);
Ivan Mahonin b53a5c
    layout->row.index++;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_LIB void
Ivan Mahonin b53a5c
nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    float y;
Ivan Mahonin b53a5c
    int index;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
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
        *bounds = nk_rect(0,0,0,0);
Ivan Mahonin b53a5c
        return;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    y = layout->at_y;
Ivan Mahonin b53a5c
    index = layout->row.index;
Ivan Mahonin b53a5c
    if (layout->row.index >= layout->row.columns) {
Ivan Mahonin b53a5c
        layout->at_y += layout->row.height;
Ivan Mahonin b53a5c
        layout->row.index = 0;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    nk_layout_widget_space(bounds, ctx, win, nk_false);
Ivan Mahonin b53a5c
    if (!layout->row.index) {
Ivan Mahonin b53a5c
        bounds->x -= layout->row.item_offset;
Ivan Mahonin b53a5c
    }
Ivan Mahonin b53a5c
    layout->at_y = y;
Ivan Mahonin b53a5c
    layout->row.index = index;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_spacer(struct nk_context *ctx )
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_rect dummy_rect = { 0, 0, 0, 0 };
Ivan Mahonin b53a5c
    nk_panel_alloc_space( &dummy_rect, ctx );
Ivan Mahonin b53a5c
}