diff -urN cui103/cui.c cui104/cui.c --- cui103/cui.c Thu Apr 3 22:00:00 2014 +++ cui104/cui.c Tue Apr 8 23:00:00 2014 @@ -385,6 +385,12 @@ if(obj->w != bak_w || obj->h != bak_h) cui_handler_call(obj, CUI_EVT_RESIZE, TRUE); } +void +cui_wh_exp(cui obj) +{ + if(obj->parent) cui_wh_set(obj, obj->parent->w - obj->x, obj->parent->h - obj->y); +} + int cui_index(cui obj) { diff -urN cui103/cui.h cui104/cui.h --- cui103/cui.h Thu Apr 3 22:00:00 2014 +++ cui104/cui.h Tue Apr 8 23:00:00 2014 @@ -80,6 +80,7 @@ void cui_wh_set(cui obj, int w, int h); void cui_wh_fit_chain(cui obj, cui child); void cui_wh_fit(cui obj); +void cui_wh_exp(cui obj); int cui_index(cui obj); cui cui_index_to_child(cui obj, int i); diff -urN cui103/cui_test.c cui104/cui_test.c --- cui103/cui_test.c Tue Apr 8 22:00:00 2014 +++ cui104/cui_test.c Tue Apr 8 23:00:00 2014 @@ -347,6 +347,22 @@ } int +mn_int_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + cui_menu_int p = (cui_menu_int)obj; + cui lb_num = (cui)prm; + static char buf[ CUI_ETEXT_BSIZE ]; + + sprintf(buf, "%d", val); + if(p->vp) sprintf(buf + strlen(buf), " (%d)", *p->vp); + + cui_label_str_set(lb_num, buf); + return TRUE; +} + +int btn_num_hdr(cui obj, int evt, int val, void *prm) { /* CUI_EVT_BUTTON */ @@ -354,11 +370,13 @@ cui *arr = (cui *)prm; cui num2 = arr[0]; cui num_d2 = arr[1]; - static int v2 = 7; + cui mn_int1 = arr[2]; + static int v2 = 7, v3 = -2; static double dv2 = 45.768; cui_num_vp_set(num2, &v2); cui_num_dvp_set(num_d2, &dv2); + cui_menu_int_vp_set(mn_int1, &v3); return TRUE; } @@ -386,9 +404,10 @@ cui num3 = cui_num_new(bs_num, 1, 5, 20, 0, 0, 0, 0); cui num_d1 = cui_num_dbl_new(bs_num, 1, 7, 20, 0, -1, 1, 0.01, 0); cui num_d2 = cui_num_dbl_new(bs_num, 1, 9, 20, 12.345, 0, 100, 0.1, 0); - cui lb_num = cui_label_new(bs_num, 1, 11, ""); - cui btn_num = cui_button_new(bs_num, 1, 13, "addr set"); - cui num_arr[] = { num2, num_d2 }; + cui mn_int1 = cui_menu_int_new(bs_num, 1, 11, 20, 0, -5, 5); + cui lb_num = cui_label_new(bs_num, 1, 13, ""); + cui btn_num = cui_button_new(bs_num, 1, 15, "addr set"); + cui num_arr[] = { num2, num_d2, mn_int1 }; cui base = cui_base_new(bs_view, 0, 1, 40, 20); cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); cui etx = cui_etext_new(base, mn_btn->x, cui_y2(mn_btn), 8, "foo"); @@ -445,9 +464,9 @@ cui_bind(num3, CUI_EVT_BUTTON, num_hdr, lb_num); cui_bind(num_d1, CUI_EVT_BUTTON, num_hdr, lb_num); cui_bind(num_d2, CUI_EVT_BUTTON, num_hdr, lb_num); + cui_bind(mn_int1, CUI_EVT_BUTTON, mn_int_hdr, lb_num); cui_bind(btn_num, CUI_EVT_BUTTON, btn_num_hdr, num_arr); - //cui_wh_fit(bs_num); - cui_wh_set(bs_num, bs_num->parent->w - bs_num->x, bs_num->parent->h - bs_num->y); + cui_wh_exp(bs_num); cui_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", "num", NULL}, tab_sheets, 0); diff -urN cui103/menu.c cui104/menu.c --- cui103/menu.c Thu Mar 27 22:00:00 2014 +++ cui104/menu.c Tue Apr 8 23:00:00 2014 @@ -2,6 +2,7 @@ #include "handler.h" #include "key.h" #include +#include #include cui @@ -27,7 +28,6 @@ obj->w = 0; cui_wh_fit(obj); cui_label_attr_set(btn->lb2, CUI_ATTR_ULINE); - cui_label_attr_set(btn->lb3, CUI_ATTR_ULINE); cui_show(obj); } @@ -38,7 +38,6 @@ int attr = CUI_ATTR_ULINE; if(val == CUI_DRAW_FOCUS) attr |= CUI_ATTR_REVERSE; cui_label_attr_set(btn->lb2, attr); - cui_label_attr_set(btn->lb3, attr); return TRUE; } @@ -71,7 +70,6 @@ cui_hide(obj); p->lbf = cui_lblfix_new(obj, 0, 0, -1, s, CUI_ATTR_ULINE); p->lb_end = cui_label_new(obj, cui_x2(p->lbf), 0, "|"); - cui_label_attr_set(p->lb_end, CUI_ATTR_ULINE); cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY | CUI_EVT_RESIZE, cui_menu_item_hdr, NULL); cui_wh_fit(obj); cui_show(obj); @@ -110,7 +108,6 @@ attr = CUI_ATTR_ULINE; if(val == CUI_DRAW_FOCUS) attr |= CUI_ATTR_REVERSE; cui_lblfix_attr_set(p->lbf, attr); - cui_label_attr_set(p->lb_end, attr); return TRUE; case CUI_EVT_RESIZE: cui_w_set(p->lbf, obj->w - 1); @@ -182,6 +179,7 @@ if(w >= 0) cui_w_set(obj, w); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); p->val = val; + p->call_btn_hdr_flag = TRUE; /* ! */ cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); cui_bind(obj, CUI_EVT_KEY, cui_menu_popup_hdr, NULL); @@ -204,7 +202,7 @@ else{ char *s = cui_menu_item_str_get(cui_index_to_child(menu, p->val)); cui_menu_item_str_set(obj, s); - cui_handler_call(obj, CUI_EVT_BUTTON, p->val); + if(p->call_btn_hdr_flag) cui_handler_call(obj, CUI_EVT_BUTTON, p->val); } cui_draw(menu->parent); return TRUE; @@ -221,6 +219,160 @@ cui_menu_popup_str_get(cui obj) { return cui_menu_item_str_get(obj); +} + +int +cui_menu_popup_get(cui obj) +{ + cui_menu_popup p = (cui_menu_popup)obj; + return p->val; +} + +void +cui_menu_popup_set(cui obj, int idx) +{ + cui_menu_popup p = (cui_menu_popup)obj; + char *s; + p->val = idx; + s = cui_menu_item_str_get(cui_index_to_child(p->menu, p->val)); + cui_menu_item_str_set(obj, s); +} + +cui +cui_menu_int_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v) +{ + cui obj = cui_alloc(sizeof(struct cui_menu_int)); + cui_menu_int_init(obj, parent, x, y, w, init_v, min_v, max_v); + return obj; +} + +static int +menu_int_alloc_size(int min_v, int max_v) +{ + char buf[32]; + int n = max_v - min_v + 1; + int sum = sizeof(char *) * (n + 1); + int v, i; + + for(i=0; imax_v - p->min_v + 1; + char *cp = (char *)&p->lst[n + 1]; + int i, v; + + for(i=0; ilst[i] = cp; + v = p->max_v - i; + sprintf(cp, "%d", v); + cp += strlen(cp) + 1; + } + p->lst[i] = NULL; +} + +void +cui_menu_int_init(cui obj, cui parent, int x, int y, int w, int init_v, int min_v, int max_v) +{ + cui_menu_int p = (cui_menu_int)obj; + + if((p->alloc = malloc(menu_int_alloc_size(min_v, max_v))) == NULL) ERR("No Mem"); + p->lst = (char **)p->alloc; + p->min_v = min_v; + p->max_v = max_v; + menu_int_lst_setup(obj); + p->v = init_v; + p->vp = NULL; + + cui_menu_popup_init(obj, parent, x, y, w, p->lst, max_v - init_v); + p->popup.call_btn_hdr_flag = FALSE; /* ! */ + + cui_unbind(obj, CUI_EVT_KEY, cui_menu_popup_hdr); + cui_bind(obj, CUI_EVT_KEY, cui_menu_int_hdr, NULL); +} + +void +cui_menu_int_lst_free(cui obj) +{ + cui_menu_int p = (cui_menu_int)obj; + if(p->alloc){ + free(p->alloc); + p->alloc = NULL; + } +} + +static void +menu_int_set(cui obj , int v) +{ + cui_menu_int p = (cui_menu_int)obj; + if(v < p->min_v) v = p->min_v; + if(v > p->max_v) v = p->max_v; + p->v = v; + if(p->vp) *p->vp = p->v; +} + +int +cui_menu_int_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_KEY */ + + cui_menu_int p = (cui_menu_int)obj; + int bak = p->popup.val; + if(cui_menu_popup_hdr(obj, evt, val, prm)){ + if(p->popup.val != bak){ + menu_int_set(obj, p->max_v - p->popup.val); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + return TRUE; + } + return FALSE; +} + +int +cui_menu_int_get(cui obj) +{ + cui_menu_int p = (cui_menu_int)obj; + return p->v; +} + +void +cui_menu_int_set(cui obj, int v) +{ + cui_menu_int p = (cui_menu_int)obj; + menu_int_set(obj, v); + cui_menu_popup_set(obj, p->max_v - p->v); +} + +void +cui_menu_int_vp_set(cui obj, int *vp) +{ + cui_menu_int p = (cui_menu_int)obj; + p->vp = vp; + if(p->vp) cui_menu_int_set(obj, *p->vp); +} + +void +cui_menu_int_min_max_set(cui obj, int min_v, int max_v) +{ + cui_menu_int p = (cui_menu_int)obj; + + cui_menu_int_lst_free(obj); + + if((p->alloc = malloc(menu_int_alloc_size(min_v, max_v))) == NULL) ERR("No Mem"); + p->lst = (char **)p->alloc; + + p->min_v = min_v; + p->max_v = max_v; + menu_int_lst_setup(obj); + cui_menu_int_set(obj, p->v); } /* EOF */ diff -urN cui103/menu.h cui104/menu.h --- cui103/menu.h Sun Feb 9 00:00:00 2014 +++ cui104/menu.h Tue Apr 8 23:00:00 2014 @@ -17,7 +17,15 @@ struct cui_menu_item item; cui menu; int val; -} * cui_menu_popup; + int call_btn_hdr_flag; /* ! */ +} *cui_menu_popup; + +typedef struct cui_menu_int{ + struct cui_menu_popup popup; + void *alloc; + char **lst; + int v, min_v, max_v, *vp; +} *cui_menu_int; cui cui_menu_btn_new(cui parent, int x, int y, char *s); void cui_menu_btn_init(cui obj, cui parent, int x, int y, char *s); @@ -38,5 +46,16 @@ void cui_menu_popup_init(cui obj, cui parent, int x, int y, int w, char **lst, int val); int cui_menu_popup_hdr(cui obj, int evt, int val, void *prm); char *cui_menu_popup_str_get(cui obj); +int cui_menu_popup_get(cui obj); +void cui_menu_popup_set(cui obj, int idx); + +cui cui_menu_int_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v); +void cui_menu_int_init(cui obj, cui parent, int x, int y, int w, int init_v, int min_v, int max_v); +int cui_menu_int_hdr(cui obj, int evt, int val, void *prm); +void cui_menu_int_lst_free(cui obj); +int cui_menu_int_get(cui obj); +void cui_menu_int_set(cui obj, int v); +void cui_menu_int_vp_set(cui obj, int *vp); +void cui_menu_int_min_max_set(cui obj, int min_v, int max_v); #endif