11 static int list_radio(int id, const char *list, int sel, int x, int y, void (*draw)());
12 static void draw_listbox(int id, const char *list, int sel, int x, int y, int width, int nitems, int over);
13 static void draw_radio(int id, const char *list, int sel, int x, int y, int width, int nitems, int over);
15 int imtk_listbox(int id, const char *list, int sel, int x, int y)
17 return list_radio(id, list, sel, x, y, draw_listbox);
20 int imtk_radiogroup(int id, const char *list, int sel, int x, int y)
22 return list_radio(id, list, sel, x, y, draw_radio);
25 static int list_radio(int id, const char *list, int sel, int x, int y, void (*draw)())
27 int i, max_width, nitems, over;
32 if(x == IMTK_AUTO || y == IMTK_AUTO) {
33 imtk_layout_get_pos(&x, &y);
41 int strsz = imtk_string_size(ptr) + 2 * PAD;
42 if(strsz > max_width) {
45 ptr += strlen(ptr) + 1;
47 if(imtk_hit_test(x, y + i * ITEM_HEIGHT, max_width, ITEM_HEIGHT)) {
54 if(imtk_button_state(IMTK_LEFT_BUTTON)) {
59 if(imtk_is_active(id)) {
61 if(imtk_is_hot(id) && over) {
67 draw(id, list, sel, x, y, max_width, nitems, over);
68 imtk_layout_advance(max_width, ITEM_HEIGHT * nitems);
72 char *imtk_create_list(const char *first, ...)
82 sz = strlen(first) + 2;
83 if(!(buf = malloc(sz))) {
86 memcpy(buf, first, sz - 2);
87 buf[sz - 1] = buf[sz - 2] = 0;
90 while((item = va_arg(ap, char*))) {
91 int len = strlen(item);
92 char *tmp = realloc(buf, sz + len + 1);
99 memcpy(buf + sz - 1, item, len);
101 buf[sz - 1] = buf[sz - 2] = 0;
108 void imtk_free_list(char *list)
113 static void draw_listbox(int id, const char *list, int sel, int x, int y, int width, int nitems, int over)
116 const char *item = list;
118 glColor4fv(imtk_get_color(IMTK_TEXT_COLOR));
120 for(i=0; i<nitems; i++) {
121 int item_y = i * ITEM_HEIGHT + y;
122 unsigned int attr = 0;
123 float tcol[4], bcol[4];
126 attr |= IMTK_FOCUS_BIT;
130 attr |= IMTK_SEL_BIT;
131 memcpy(tcol, imtk_get_color(IMTK_TOP_COLOR | attr), sizeof tcol);
132 memcpy(bcol, imtk_get_color(IMTK_BOTTOM_COLOR | attr), sizeof bcol);
134 memcpy(tcol, imtk_get_color(IMTK_BOTTOM_COLOR | attr), sizeof tcol);
135 memcpy(bcol, imtk_get_color(IMTK_BOTTOM_COLOR | attr), sizeof bcol);
138 imtk_draw_rect(x, item_y, width, ITEM_HEIGHT, tcol, bcol);
140 glColor4fv(imtk_get_color(IMTK_TEXT_COLOR));
141 imtk_draw_string(x + 3, item_y + ITEM_HEIGHT - 5, item);
142 item += strlen(item) + 1;
145 imtk_draw_frame(x, y, width, ITEM_HEIGHT * nitems, FRAME_INSET);
148 static void draw_radio(int id, const char *list, int sel, int x, int y, int width, int nitems, int over)
151 const char *item = list;
152 float rad = ITEM_HEIGHT * 0.5;
154 for(i=0; i<nitems; i++) {
155 int item_y = i * ITEM_HEIGHT + y;
156 unsigned int attr = 0;
157 float tcol[4], bcol[4];
160 attr |= IMTK_FOCUS_BIT;
163 imtk_draw_disc_frame(x + rad, item_y + rad, rad * 0.9, rad * 0.75, 5, FRAME_INSET);
165 memcpy(tcol, imtk_get_color(IMTK_BOTTOM_COLOR | attr), sizeof tcol);
166 memcpy(bcol, imtk_get_color(IMTK_TOP_COLOR | attr), sizeof bcol);
167 imtk_draw_disc(x + rad, item_y + rad, rad * 0.75, 5, tcol, bcol);
170 attr |= IMTK_SEL_BIT;
171 memcpy(tcol, imtk_get_color(IMTK_TOP_COLOR | attr), sizeof tcol);
172 memcpy(bcol, imtk_get_color(IMTK_BOTTOM_COLOR | attr), sizeof bcol);
174 imtk_draw_disc(x + rad, item_y + ITEM_HEIGHT / 2, rad * 0.6, 5, tcol, bcol);
177 glColor4fv(imtk_get_color(IMTK_TEXT_COLOR));
178 imtk_draw_string(x + rad * 2.0 + 3, item_y + ITEM_HEIGHT - 5, item);
179 item += strlen(item) + 1;