# HG changeset patch # User John Tsiombikas # Date 1303191383 -10800 # Node ID ac2a8d8fca9ad442b69d33832e394f9d1066ee9f # Parent 1cf212375db338874266553ea3fdd60d991acce7 naturally I forgot to add listbox.c diff -r 1cf212375db3 -r ac2a8d8fca9a src/listbox.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/listbox.c Tue Apr 19 08:36:23 2011 +0300 @@ -0,0 +1,129 @@ +#include +#include +#include +#include "imtk.h" +#include "state.h" +#include "draw.h" + +#define ITEM_HEIGHT 18 +#define PAD 3 + +static void draw_listbox(int id, const char *list, int sel, int x, int y, int width, int nitems, int over); + +int imtk_listbox(int id, const char *list, int sel, int x, int y) +{ + int i, max_width, nitems, over; + const char *ptr; + + assert(id >= 0); + + max_width = 0; + over = 0; + + ptr = list; + for(i=0; *ptr; i++) { + int strsz = imtk_string_size(ptr) + 2 * PAD; + if(strsz > max_width) { + max_width = strsz; + } + ptr += strlen(ptr) + 1; + + if(imtk_hit_test(x, y + i * ITEM_HEIGHT, max_width, ITEM_HEIGHT)) { + imtk_set_hot(id); + over = i + 1; + } + } + nitems = i; + + if(imtk_button_state(IMTK_LEFT_BUTTON)) { + if(over) { + imtk_set_active(id); + } + } else { + if(imtk_is_active(id)) { + imtk_set_active(-1); + if(imtk_is_hot(id) && over) { + sel = over - 1; + } + } + } + + draw_listbox(id, list, sel, x, y, max_width, nitems, over); + return sel; +} + +char *imtk_create_list(const char *first, ...) +{ + int sz; + char *buf, *item; + va_list ap; + + if(!first) { + return 0; + } + + sz = strlen(first) + 2; + if(!(buf = malloc(sz))) { + return 0; + } + memcpy(buf, first, sz - 2); + buf[sz - 1] = buf[sz - 2] = 0; + + va_start(ap, first); + while((item = va_arg(ap, char*))) { + int len = strlen(item); + char *tmp = realloc(buf, sz + len + 1); + if(!tmp) { + free(buf); + return 0; + } + buf = tmp; + + memcpy(buf + sz - 1, item, len); + sz += len + 1; + buf[sz - 1] = buf[sz - 2] = 0; + } + va_end(ap); + + return buf; +} + +void imtk_free_list(char *list) +{ + free(list); +} + +static void draw_listbox(int id, const char *list, int sel, int x, int y, int width, int nitems, int over) +{ + int i; + const char *item = list; + + glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); + + for(i=0; i