diff -urN cui136/etext.c cui137/etext.c --- cui136/etext.c Fri Apr 25 01:30:00 2014 +++ cui137/etext.c Mon Mar 23 00:00:44 2015 @@ -9,22 +9,37 @@ cui cui_etext_new(cui parent, int x, int y, int w, char *init_s) { + return cui_etext_new_lb(parent, x, y, w, init_s, "[", "]"); +} + +cui +cui_etext_new_no_lb(cui parent, int x, int y, int w, char *init_s) +{ + return cui_etext_new_lb(parent, x, y, w, init_s, NULL, NULL); +} + +cui +cui_etext_new_lb(cui parent, int x, int y, int w, char *init_s, char *lb_l, char *lb_r) +{ cui obj = cui_alloc(sizeof(struct cui_etext)); - cui_etext_init(obj, parent, x, y, w, init_s); + cui_etext_init(obj, parent, x, y, w, init_s, lb_l, lb_r); return obj; } void -cui_etext_init(cui obj, cui parent, int x, int y, int w, char *init_s) +cui_etext_init(cui obj, cui parent, int x, int y, int w, char *init_s, char *lb_l, char *lb_r) { + int len_l = lb_l ? strlen(lb_l) : 0; + int len_r = lb_r ? strlen(lb_r) : 0; + cui_etext p = (cui_etext)obj; cui_base_init(obj, parent, x, y, 0, 1); if(init_s == NULL) init_s = ""; strcpy(p->buf, init_s); - p->lb_top = cui_label_new(obj, 0, 0, "["); - p->view = cui_base_new(obj, 1, 0, w-2, 1); - p->lb_end = cui_label_new(obj, cui_x2(p->view), 0, "]"); + p->lb_top = lb_l ? cui_label_new(obj, 0, 0, lb_l) : NULL; + p->view = cui_base_new(obj, len_l, 0, w - len_l - len_r, 1); + p->lb_end = lb_r ? cui_label_new(obj, cui_x2(p->view), 0, lb_r) : NULL; cui_wh_fit(obj); p->lbf = cui_lblfix_new(p->view, 0, 0, CUI_ETEXT_BSIZE, p->buf, CUI_ATTR_NORMAL); obj->flags |= CUI_FLG_CAN_FOCUS; @@ -233,9 +248,9 @@ 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); + if(p->lb_top) cui_label_attr_set(p->lb_top, attr); cui_lblfix_attr_set(p->lbf, p->mode == CUI_ETEXT_MODE_EDIT ? CUI_ATTR_NORMAL : attr); - cui_label_attr_set(p->lb_end, attr); + if(p->lb_end) cui_label_attr_set(p->lb_end, attr); return TRUE; case CUI_EVT_KEY: switch(p->mode){ diff -urN cui136/etext.h cui137/etext.h --- cui136/etext.h Sun Apr 6 23:00:00 2014 +++ cui137/etext.h Mon Mar 23 00:00:44 2015 @@ -25,7 +25,9 @@ } *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); +cui cui_etext_new_no_lb(cui parent, int x, int y, int w, char *init_s); +cui cui_etext_new_lb(cui parent, int x, int y, int w, char *init_s, char *lb_l, char *lb_r); +void cui_etext_init(cui obj, cui parent, int x, int y, int w, char *init_s, char *lb_l, char *lb_r); void cui_etext_hist_del(cui obj, char *str); void cui_etext_hist_add(cui obj); void cui_etext_cursor_update(cui obj); diff -urN cui136/focus.c cui137/focus.c --- cui136/focus.c Sat Feb 8 23:30:00 2014 +++ cui137/focus.c Mon Mar 23 00:00:44 2015 @@ -2,26 +2,46 @@ #include "key.h" #include +#define SWAP(a, b, t) do{ t=a; a=b; b=t; }while(0) + int cui_focus_glen(cui o1, cui o2, int key) { - int dx, dy; + int o1x = cui_gx(o1), o1y = cui_gy(o1), o1w = o1->w, o1h = o1->h; + int o2x = cui_gx(o2), o2y = cui_gy(o2), o2w = o2->w, o2h = o2->h; + int swap_xy, tmp, dx, dy; + + swap_xy = (key == CUI_KEY_UP || key == CUI_KEY_DOWN); + if(swap_xy){ + SWAP(o1x, o1y, tmp); + SWAP(o1w, o1h, tmp); + SWAP(o2x, o2y, tmp); + SWAP(o2w, o2h, tmp); + key = (key == CUI_KEY_UP) ? CUI_KEY_LEFT : CUI_KEY_RIGHT; + } + if(key == CUI_KEY_LEFT){ + SWAP(o1x, o2x, tmp); + SWAP(o1w, o2w, tmp); + SWAP(o1y, o2y, tmp); + SWAP(o1h, o2h, tmp); + key = CUI_KEY_RIGHT; + } + if(o2x + o2w > o1x) return -1; - dx = (cui_gx(o1) + o1->w / 2) - (cui_gx(o2) + o2->w / 2); - dy = (cui_gy(o1) + o1->h / 2) - (cui_gy(o2) + o2->h / 2); - dy *= 2; + dx = o1x - (o2x + o2w); - switch(key){ - case CUI_KEY_UP: - case CUI_KEY_DOWN: - dx *= 4; - break; - case CUI_KEY_LEFT: - case CUI_KEY_RIGHT: - dy *= 4; - break; + if(o1y > o2y){ + SWAP(o1y, o2y, tmp); + SWAP(o1h, o2h, tmp); } - return dx * dx + dy * dy; + + dy = o1y <= o2y && o2y <= o1y + o1h ? 0 : o2y - (o1y + o1h); + + if(swap_xy){ + SWAP(dx, dy, tmp); + } + dy *= 2; + return dx*dx + dy*dy; } int @@ -75,20 +95,7 @@ v = cui_focus_move_val(obj, key); if(focus){ - switch(key){ - case CUI_KEY_UP: - jg = cui_gy(obj) + obj->h / 2 < cui_gy(focus) + focus->h / 2; - break; - case CUI_KEY_DOWN: - jg = cui_gy(obj) + obj->h / 2 > cui_gy(focus) + focus->h / 2; - break; - case CUI_KEY_LEFT: - jg = cui_gx(obj) + obj->w / 2 < cui_gx(focus) + focus->w / 2; - break; - case CUI_KEY_RIGHT: - jg = cui_gx(obj) + obj->w / 2 > cui_gx(focus) + focus->w / 2; - break; - } + jg = (v >= 0); if(old) jg = jg && v < *val; }else if(!old){ jg = TRUE; diff -urN cui136/num.c cui137/num.c --- cui136/num.c Sat Apr 19 00:00:00 2014 +++ cui137/num.c Mon Mar 23 00:00:44 2015 @@ -53,7 +53,6 @@ { cui_num p = (cui_num)obj; char buf[ CUI_ETEXT_BSIZE ]; - cui eview; w = w < 6 ? 6 : w; cui_base_init(obj, parent, x, y, w, 1); @@ -73,8 +72,7 @@ if(bar_h == 0) bar_h = w; p->fb_dec = cui_fillbtn_new(obj, 0, 0, 1, 1, "<"); - eview = cui_base_new(obj, 1, 0, w-3, 1); - p->etx = cui_etext_new(eview, -1, 0, w-1, buf); + p->etx = cui_etext_new_no_lb(obj, 1, 0, w-3, buf); p->fb_inc = cui_fillbtn_new(obj, cui_x2(p->etx), 0, 1, 1, ">"); p->fb_bar = cui_fillbtn_new(obj, cui_x2(p->fb_inc), 0, 1, 1, "|");