diff -urN cui56/cui_test.c cui57/cui_test.c --- cui56/cui_test.c Sun Feb 2 22:00:00 2014 +++ cui57/cui_test.c Sun Feb 2 22:10:00 2014 @@ -130,7 +130,7 @@ cui radio_new(cui parent, int x, int y) { - cui panel, lb, grp, rd_on, rd_off, base, grp2, rd[4], lb2; + cui panel, lb, grp, rd_on, rd_off, base, grp2, rd[4]; panel = cui_panel_new(parent, x, y, 0, 0); lb = cui_label_new(panel, 1, 1, "Radio"); @@ -146,7 +146,7 @@ rd[2] = cui_radio_new(grp2, 0, 2, "MBS", 0); rd[3] = cui_radio_new(grp2, 0, 3, "OBC", 0); cui_wh_fit(grp2); - lb2 = cui_label_new(base, cui_x2(grp2)+2, 0, " kHz"); + cui_label_new(base, cui_x2(grp2)+2, 0, " kHz"); cui_wh_fit(base); cui_hide(base); diff -urN cui56/etext.c cui57/etext.c --- cui56/etext.c Sun Feb 2 22:00:00 2014 +++ cui57/etext.c Sun Feb 2 22:10:00 2014 @@ -27,7 +27,7 @@ p->lbf = cui_lblfix_new(p->view, 0, 0, CUI_ETEXT_BSIZE, p->buf, CUI_ATTR_NORMAL); obj->flags |= CUI_FLG_CAN_FOCUS; - p->edit_mode = FALSE; + p->mode = CUI_ETEXT_MODE_NORMAL; p->n = strlen(p->buf); p->cursor = 0; p->view_cursor = cui_base_new(p->lbf, 0, 0, 1, 1); @@ -38,21 +38,22 @@ } void -cui_etext_edit_in(cui obj) +cui_etext_edit_in(cui obj, int key) { cui_etext p = (cui_etext)obj; - p->edit_mode = TRUE; + p->mode = CUI_ETEXT_MODE_EDIT; strcpy(p->bak, p->buf); + if(key == CUI_KEY_BS) p->buf[0] = '\0'; p->n = strlen(p->buf); cui_lblfix_attr_set(p->lbf, CUI_ATTR_NORMAL); cui_lblfix_str_set(p->lbf, p->buf); cui_lblfix_str_set(p->lbf_shadow, p->buf); - p->cursor = 0; - cui_x_set(p->view_cursor, p->cursor); - cui_x_set(p->lbf_shadow, -p->cursor); + p->cursor = (key == CUI_KEY_RIGHT) ? p->n : 0; + cui_w_set(p->view_cursor, 1); + cui_etext_cursor_update(obj); cui_show(p->view_cursor); } @@ -65,7 +66,7 @@ cui_lblfix_str_set(p->lbf, p->buf); cui_lblfix_attr_set(p->lbf, CUI_ATTR_ULINE); cui_x_set(p->lbf, 0); - p->edit_mode = FALSE; + p->mode = CUI_ETEXT_MODE_NORMAL; if(strcmp(p->buf, p->bak) != 0) cui_handler_call(obj, CUI_EVT_BUTTON, 0); } @@ -101,54 +102,77 @@ cui_label_attr_set(p->lb_end, attr); return TRUE; case CUI_EVT_KEY: - if(!p->edit_mode){ + switch(p->mode){ + case CUI_ETEXT_MODE_NORMAL: if(val == CUI_KEY_ENTER){ - cui_etext_edit_in(obj); + if(p->buf[0] == '\0') cui_etext_edit_in(obj, val); + else{ + p->cursor = 0; + cui_etext_cursor_update(obj); + cui_w_set(p->view_cursor, p->lbf->w); + cui_show(p->view_cursor); + p->mode = CUI_ETEXT_MODE_SELALL; + } return TRUE; } return FALSE; + case CUI_ETEXT_MODE_SELALL: + switch(val){ + case CUI_KEY_ESC: + cui_hide(p->view_cursor); + p->mode = CUI_ETEXT_MODE_NORMAL; + cui_draw(obj); + break; + case CUI_KEY_ENTER: + case CUI_KEY_LEFT: + case CUI_KEY_RIGHT: + case CUI_KEY_BS: + cui_etext_edit_in(obj, val); + break; + } + return TRUE; + case CUI_ETEXT_MODE_EDIT: + 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_lblfix_str_set(p->lbf, p->buf); + cui_lblfix_str_set(p->lbf_shadow, p->buf); + p->cursor--; + cui_etext_cursor_update(obj); + break; + default: + if(p->n >= CUI_ETEXT_BSIZE - 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_lblfix_str_set(p->lbf, p->buf); + cui_lblfix_str_set(p->lbf_shadow, p->buf); + p->cursor++; + cui_etext_cursor_update(obj); + break; + } + return TRUE; } - 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_lblfix_str_set(p->lbf, p->buf); - cui_lblfix_str_set(p->lbf_shadow, p->buf); - p->cursor--; - cui_etext_cursor_update(obj); - break; - default: - if(p->n >= CUI_ETEXT_BSIZE - 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_lblfix_str_set(p->lbf, p->buf); - cui_lblfix_str_set(p->lbf_shadow, p->buf); - p->cursor++; - cui_etext_cursor_update(obj); - break; - } - return TRUE; } return FALSE; } @@ -164,7 +188,7 @@ cui_etext_str_set(cui obj, char *s) { cui_etext p = (cui_etext)obj; - if(p->edit_mode) cui_etext_edit_out(obj); + while(p->mode != CUI_ETEXT_MODE_NORMAL) cui_handler_call(obj, CUI_EVT_KEY, CUI_KEY_ESC); strcpy(p->buf, s); cui_lblfix_str_set(p->lbf, p->buf); } diff -urN cui56/etext.h cui57/etext.h --- cui56/etext.h Sun Feb 2 22:00:00 2014 +++ cui57/etext.h Sun Feb 2 22:10:00 2014 @@ -5,19 +5,24 @@ #define CUI_ETEXT_BSIZE 1024 +#define CUI_ETEXT_MODE_NORMAL (1<<0) +#define CUI_ETEXT_MODE_SELALL (1<<1) +#define CUI_ETEXT_MODE_EDIT (1<<2) + typedef struct cui_etext{ struct cui_base base; char buf[ CUI_ETEXT_BSIZE ], bak[ CUI_ETEXT_BSIZE ]; cui lb_top, lbf, lb_end; cui view; - int edit_mode; + int mode; int n, cursor; cui view_cursor, lbf_shadow; } *cui_etext; cui cui_etext_new(cui parent, int x, int y, int w, char *init_s); void cui_etext_init(cui obj, cui parent, int x, int y, int w, char *init_s); +void cui_etext_cursor_update(cui obj); int cui_etext_hdr(cui obj, int evt, int val, void *prm); char *cui_etext_str_get(cui obj); void cui_etext_str_set(cui obj, char *s);