Blame src-nuklear/nuklear_list_view.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
 *                          LIST VIEW
Ivan Mahonin b53a5c
 *
Ivan Mahonin b53a5c
 * ===============================================================*/
Ivan Mahonin b53a5c
NK_API nk_bool
Ivan Mahonin b53a5c
nk_list_view_begin(struct nk_context *ctx, struct nk_list_view *view,
Ivan Mahonin b53a5c
    const char *title, nk_flags flags, int row_height, int row_count)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    int title_len;
Ivan Mahonin b53a5c
    nk_hash title_hash;
Ivan Mahonin b53a5c
    nk_uint *x_offset;
Ivan Mahonin b53a5c
    nk_uint *y_offset;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    int result;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
    const struct nk_style *style;
Ivan Mahonin b53a5c
    struct nk_vec2 item_spacing;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(view);
Ivan Mahonin b53a5c
    NK_ASSERT(title);
Ivan Mahonin b53a5c
    if (!ctx || !view || !title) return 0;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    style = &ctx->style;
Ivan Mahonin b53a5c
    item_spacing = style->window.spacing;
Ivan Mahonin b53a5c
    row_height += NK_MAX(0, (int)item_spacing.y);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    /* find persistent list view scrollbar offset */
Ivan Mahonin b53a5c
    title_len = (int)nk_strlen(title);
Ivan Mahonin b53a5c
    title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_GROUP);
Ivan Mahonin b53a5c
    x_offset = nk_find_value(win, title_hash);
Ivan Mahonin b53a5c
    if (!x_offset) {
Ivan Mahonin b53a5c
        x_offset = nk_add_value(ctx, win, title_hash, 0);
Ivan Mahonin b53a5c
        y_offset = nk_add_value(ctx, win, title_hash+1, 0);
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
        NK_ASSERT(x_offset);
Ivan Mahonin b53a5c
        NK_ASSERT(y_offset);
Ivan Mahonin b53a5c
        if (!x_offset || !y_offset) return 0;
Ivan Mahonin b53a5c
        *x_offset = *y_offset = 0;
Ivan Mahonin b53a5c
    } else y_offset = nk_find_value(win, title_hash+1);
Ivan Mahonin b53a5c
    view->scroll_value = *y_offset;
Ivan Mahonin b53a5c
    view->scroll_pointer = y_offset;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    *y_offset = 0;
Ivan Mahonin b53a5c
    result = nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags);
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    view->total_height = row_height * NK_MAX(row_count,1);
Ivan Mahonin b53a5c
    view->begin = (int)NK_MAX(((float)view->scroll_value / (float)row_height), 0.0f);
Ivan Mahonin b53a5c
    view->count = (int)NK_MAX(nk_iceilf((layout->clip.h)/(float)row_height),0);
Ivan Mahonin b53a5c
    view->count = NK_MIN(view->count, row_count - view->begin);
Ivan Mahonin b53a5c
    view->end = view->begin + view->count;
Ivan Mahonin b53a5c
    view->ctx = ctx;
Ivan Mahonin b53a5c
    return result;
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c
NK_API void
Ivan Mahonin b53a5c
nk_list_view_end(struct nk_list_view *view)
Ivan Mahonin b53a5c
{
Ivan Mahonin b53a5c
    struct nk_context *ctx;
Ivan Mahonin b53a5c
    struct nk_window *win;
Ivan Mahonin b53a5c
    struct nk_panel *layout;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    NK_ASSERT(view);
Ivan Mahonin b53a5c
    NK_ASSERT(view->ctx);
Ivan Mahonin b53a5c
    NK_ASSERT(view->scroll_pointer);
Ivan Mahonin b53a5c
    if (!view || !view->ctx) return;
Ivan Mahonin b53a5c
Ivan Mahonin b53a5c
    ctx = view->ctx;
Ivan Mahonin b53a5c
    win = ctx->current;
Ivan Mahonin b53a5c
    layout = win->layout;
Ivan Mahonin b53a5c
    layout->at_y = layout->bounds.y + (float)view->total_height;
Ivan Mahonin b53a5c
    *view->scroll_pointer = *view->scroll_pointer + view->scroll_value;
Ivan Mahonin b53a5c
    nk_group_end(view->ctx);
Ivan Mahonin b53a5c
}
Ivan Mahonin b53a5c