nuclear@6: #include nuclear@6: #include nuclear@6: #include nuclear@6: #include "imtk.h" nuclear@6: #include "state.h" nuclear@6: #include "draw.h" nuclear@6: nuclear@6: #define TEXTBOX_SIZE 100 nuclear@6: nuclear@6: static void draw_textbox(int id, const char *text, int x, int y); nuclear@6: nuclear@6: nuclear@6: void imtk_textbox(int id, char *textbuf, size_t buf_sz, int x, int y) nuclear@6: { nuclear@6: int len, over = 0; nuclear@6: nuclear@6: assert(id >= 0); nuclear@6: nuclear@6: if(imtk_hit_test(x, y, TEXTBOX_SIZE, 20)) { nuclear@6: imtk_set_hot(id); nuclear@6: over = 1; nuclear@6: } nuclear@6: nuclear@6: if(imtk_button_state(IMTK_LEFT_BUTTON)) { nuclear@6: if(over) { nuclear@6: imtk_set_active(id); nuclear@6: } nuclear@6: } else { nuclear@6: if(imtk_is_active(id)) { nuclear@6: imtk_set_active(-1); nuclear@6: if(imtk_is_hot(id) && over) { nuclear@6: imtk_set_focus(id); nuclear@6: } nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: if(imtk_has_focus(id)) { nuclear@6: int key; nuclear@6: len = strlen(textbuf); nuclear@6: nuclear@6: while((key = imtk_get_key()) != -1) { nuclear@6: if(isprint(key)) { nuclear@6: if(len < buf_sz) { nuclear@6: textbuf[len++] = (char)key; nuclear@6: } nuclear@6: } else { nuclear@6: switch(key) { nuclear@6: case '\b': nuclear@6: if(len > 0) { nuclear@6: textbuf[--len] = 0; nuclear@6: } nuclear@6: break; nuclear@6: nuclear@6: default: nuclear@6: break; nuclear@6: } nuclear@6: } nuclear@6: } nuclear@6: } nuclear@6: nuclear@6: draw_textbox(id, textbuf, x, y); nuclear@6: } nuclear@6: nuclear@6: nuclear@6: static void draw_textbox(int id, const char *text, int x, int y) nuclear@6: { nuclear@6: int strsz = imtk_string_size(text); nuclear@6: nuclear@6: if(imtk_hit_test(x, y, TEXTBOX_SIZE, 20)) { nuclear@6: glColor4fv(imtk_get_color(IMTK_FOCUS_COLOR)); nuclear@6: } else { nuclear@6: glColor4fv(imtk_get_color(IMTK_BASE_COLOR)); nuclear@6: } nuclear@6: nuclear@8: imtk_draw_rect(x, y, TEXTBOX_SIZE, 20, 0); nuclear@6: nuclear@6: if(imtk_has_focus(id)) { nuclear@6: glBegin(GL_LINES); nuclear@8: glColor4f(0.8, 0.25, 0.18, imtk_get_color(IMTK_TEXT_COLOR)[3]); nuclear@8: glVertex2f(x + strsz + 3, y + 2); nuclear@8: glVertex2f(x + strsz + 3, y + 18); nuclear@8: glVertex2f(x + strsz + 4, y + 2); nuclear@8: glVertex2f(x + strsz + 4, y + 18); nuclear@6: glEnd(); nuclear@6: } nuclear@6: nuclear@8: glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); nuclear@6: imtk_draw_string(x + 2, y + 15, text); nuclear@6: nuclear@6: imtk_draw_frame(x, y, TEXTBOX_SIZE, 20, FRAME_INSET); nuclear@6: } nuclear@6: