91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
|
#include "nuklear.h"
|
||
|
#include "nuklear_internal.h"
|
||
|
|
||
|
/* ===============================================================
|
||
|
*
|
||
|
* TABLE
|
||
|
*
|
||
|
* ===============================================================*/
|
||
|
NK_LIB struct nk_table*
|
||
|
nk_create_table(struct nk_context *ctx)
|
||
|
{
|
||
|
struct nk_page_element *elem;
|
||
|
elem = nk_create_page_element(ctx);
|
||
|
if (!elem) return 0;
|
||
|
nk_zero_struct(*elem);
|
||
|
return &elem->data.tbl;
|
||
|
}
|
||
|
NK_LIB void
|
||
|
nk_free_table(struct nk_context *ctx, struct nk_table *tbl)
|
||
|
{
|
||
|
union nk_page_data *pd = NK_CONTAINER_OF(tbl, union nk_page_data, tbl);
|
||
|
struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data);
|
||
|
nk_free_page_element(ctx, pe);
|
||
|
}
|
||
|
NK_LIB void
|
||
|
nk_push_table(struct nk_window *win, struct nk_table *tbl)
|
||
|
{
|
||
|
if (!win->tables) {
|
||
|
win->tables = tbl;
|
||
|
tbl->next = 0;
|
||
|
tbl->prev = 0;
|
||
|
tbl->size = 0;
|
||
|
win->table_count = 1;
|
||
|
return;
|
||
|
}
|
||
|
win->tables->prev = tbl;
|
||
|
tbl->next = win->tables;
|
||
|
tbl->prev = 0;
|
||
|
tbl->size = 0;
|
||
|
win->tables = tbl;
|
||
|
win->table_count++;
|
||
|
}
|
||
|
NK_LIB void
|
||
|
nk_remove_table(struct nk_window *win, struct nk_table *tbl)
|
||
|
{
|
||
|
if (win->tables == tbl)
|
||
|
win->tables = tbl->next;
|
||
|
if (tbl->next)
|
||
|
tbl->next->prev = tbl->prev;
|
||
|
if (tbl->prev)
|
||
|
tbl->prev->next = tbl->next;
|
||
|
tbl->next = 0;
|
||
|
tbl->prev = 0;
|
||
|
}
|
||
|
NK_LIB nk_uint*
|
||
|
nk_add_value(struct nk_context *ctx, struct nk_window *win,
|
||
|
nk_hash name, nk_uint value)
|
||
|
{
|
||
|
NK_ASSERT(ctx);
|
||
|
NK_ASSERT(win);
|
||
|
if (!win || !ctx) return 0;
|
||
|
if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) {
|
||
|
struct nk_table *tbl = nk_create_table(ctx);
|
||
|
NK_ASSERT(tbl);
|
||
|
if (!tbl) return 0;
|
||
|
nk_push_table(win, tbl);
|
||
|
}
|
||
|
win->tables->seq = win->seq;
|
||
|
win->tables->keys[win->tables->size] = name;
|
||
|
win->tables->values[win->tables->size] = value;
|
||
|
return &win->tables->values[win->tables->size++];
|
||
|
}
|
||
|
NK_LIB nk_uint*
|
||
|
nk_find_value(struct nk_window *win, nk_hash name)
|
||
|
{
|
||
|
struct nk_table *iter = win->tables;
|
||
|
while (iter) {
|
||
|
unsigned int i = 0;
|
||
|
unsigned int size = iter->size;
|
||
|
for (i = 0; i < size; ++i) {
|
||
|
if (iter->keys[i] == name) {
|
||
|
iter->seq = win->seq;
|
||
|
return &iter->values[i];
|
||
|
}
|
||
|
} size = NK_VALUE_PAGE_CAPACITY;
|
||
|
iter = iter->next;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|