diff -urN cui53/cui_test.c cui54/cui_test.c --- cui53/cui_test.c 2014-02-01 00:00:00.000000000 +0900 +++ cui54/cui_test.c 2014-02-01 01:00:00.000000000 +0900 @@ -264,6 +264,16 @@ } int +etx_hdr(cui obj, int evt, int val, void *prm) +{ + static char buf[CUI_ETEXT_MAX * 2]; + + sprintf(buf, "'%s'", cui_etext_str_get(obj)); + cui_label_str_set((cui)prm, buf); + return TRUE; +} + +int main() { cui base = cui_panel_new(NULL, 0, 0, 40, 20); @@ -282,6 +292,7 @@ small->flags |= CUI_FLG_HIDE; cui_bind(mn_btn, CUI_EVT_BUTTON, mn_btn_hdr, mv_lb); + cui_bind(etx, CUI_EVT_BUTTON, etx_hdr, mv_lb); cui_bind(ck, CUI_EVT_BUTTON, my_hdr2, small); cui_bind(mv_btn, CUI_EVT_BUTTON, mv_hdr, mv_lb); diff -urN cui53/etext.c cui54/etext.c --- cui53/etext.c 2014-02-01 00:00:00.000000000 +0900 +++ cui54/etext.c 2014-02-01 01:00:00.000000000 +0900 @@ -1,5 +1,6 @@ #include "etext.h" #include "handler.h" +#include "key.h" #include #include @@ -30,22 +31,149 @@ cui_wh_fit(p->inner, p->inner->children); obj->flags |= CUI_FLG_CAN_FOCUS; - cui_bind(obj, CUI_EVT_DRAW, cui_etext_hdr, NULL); + + p->edit_mode = FALSE; + p->n = strlen(p->buf); + p->cursor = 0; + p->buf_cursor[0] = ' '; + p->buf_cursor[1] = '\0'; + p->lb_cursor = cui_label_new(p->lb, 0, 0, p->buf_cursor); + cui_label_attr_set(p->lb_cursor, CUI_ATTR_REVERSE); + p->lb_cursor->flags |= CUI_FLG_HIDE; + + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_etext_hdr, NULL); +} + +void +cui_etext_buf_to_lb(cui obj) +{ + cui_etext p = (cui_etext)obj; + + cui_label_str_set(p->lb, p->buf); + if(p->edit_mode) p->lb->w++; + cui_wh_fit(p->inner, p->inner->children); +} + +void +cui_etext_edit_in(cui obj) +{ + cui_etext p = (cui_etext)obj; + + p->edit_mode = TRUE; + strcpy(p->bak, p->buf); + p->n = strlen(p->buf); + + cui_hide(p->fill); + cui_label_attr_set(p->lb, CUI_ATTR_NORMAL); + cui_etext_buf_to_lb(obj); + + p->cursor = 0; + p->buf_cursor[0] = p->cursor < p->n ? p->buf[p->cursor] : ' '; + cui_label_str_set(p->lb_cursor, p->buf_cursor); + p->lb_cursor->x = p->cursor; + cui_show(p->lb_cursor); +} + +void +cui_etext_edit_out(cui obj) +{ + cui_etext p = (cui_etext)obj; + + cui_hide(p->inner); + cui_hide(p->lb_cursor); + cui_label_str_set(p->lb, p->buf); + cui_label_attr_set(p->lb, CUI_ATTR_ULINE); + p->fill->x = cui_x2(p->lb); + cui_show(p->fill); + p->inner->x = 0; + cui_wh_fit(p->inner, p->inner->children); + cui_show(p->inner); + p->edit_mode = FALSE; + + if(strcmp(p->buf, p->bak) != 0){ + cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, 0); + } +} + +void +cui_etext_cursor_update(cui obj) +{ + cui_etext p = (cui_etext)obj; + + cui_hide(p->lb_cursor); + cui_draw(p->lb_cursor->parent); + p->buf_cursor[0] = p->cursor < p->n ? p->buf[p->cursor] : ' '; + p->lb_cursor->x = p->cursor; + while(cui_lx(p->view, cui_gx(p->lb_cursor)) < 0){ + cui_x_set(p->inner, p->inner->x + 1); + } + while(cui_lx(p->view, cui_gx(p->lb_cursor)) >= p->view->w){ + cui_x_set(p->inner, p->inner->x - 1); + } + cui_show(p->lb_cursor); } int cui_etext_hdr(cui obj, int evt, int val, void *prm) { cui_etext p = (cui_etext)obj; - int attr; + int attr, i; - if(evt == CUI_EVT_DRAW){ + switch(evt){ + case CUI_EVT_DRAW: attr = (val == CUI_DRAW_FOCUS) ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL; cui_label_attr_set(p->lb_top, attr); cui_label_attr_set(p->lb, attr); cui_fill_attr_set(p->fill, attr); cui_label_attr_set(p->lb_end, attr); return TRUE; + case CUI_EVT_KEY: + if(!p->edit_mode){ + if(val == CUI_KEY_ENTER){ + cui_etext_edit_in(obj); + return TRUE; + } + return FALSE; + } + switch(val){ + case CUI_KEY_ESC: + strcpy(p->buf, p->bak); + + case CUI_KEY_ENTER: + cui_etext_edit_out(obj); + break; + case CUI_KEY_RIGHT: + if(p->cursor >= p->n) break; + p->cursor++; + cui_etext_cursor_update(obj); + break; + case CUI_KEY_LEFT: + if(p->cursor <= 0) break; + p->cursor--; + cui_etext_cursor_update(obj); + break; + case CUI_KEY_UP: + case CUI_KEY_DOWN: + break; + case CUI_KEY_BS: + if(p->cursor <= 0) break; + for(i=p->cursor; i<=p->n; i++) p->buf[i-1] = p->buf[i]; + p->n--; + cui_etext_buf_to_lb(obj); + p->cursor--; + cui_etext_cursor_update(obj); + break; + default: + if(p->n >= CUI_ETEXT_MAX - 1) break; + for(i=p->n; i>=p->cursor; i--) p->buf[i+1] = p->buf[i]; + p->buf[p->cursor] = val; + p->n++; + cui_etext_buf_to_lb(obj); + p->cursor++; + cui_etext_cursor_update(obj); + break; + } + return TRUE; } return FALSE; } @@ -60,6 +188,15 @@ void cui_etext_str_set(cui obj, char *s) { + cui_etext p = (cui_etext)obj; + + if(p->edit_mode) cui_etext_edit_out(obj); + strcpy(p->buf, s); + cui_label_str_set(p->lb, p->buf); + p->fill->x = cui_x2(p->lb); + cui_hide(p->inner); + cui_wh_fit(p->inner, p->inner->children); + cui_show(p->inner); } /* EOF */ diff -urN cui53/etext.h cui54/etext.h --- cui53/etext.h 2014-02-01 00:00:00.000000000 +0900 +++ cui54/etext.h 2014-02-01 01:00:00.000000000 +0900 @@ -10,6 +10,11 @@ char buf[ CUI_ETEXT_MAX ], bak[ CUI_ETEXT_MAX ]; cui lb_top, lb, fill, lb_end; cui view, inner; + + int edit_mode; + int n, cursor; + char buf_cursor[2]; + cui lb_cursor; } *cui_etext; cui cui_etext_new(cui parent, int x, int y, int w, char *init_s);