|
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 |
|