diff -urN cui102/cui_test.c cui103/cui_test.c --- cui102/cui_test.c Sun Apr 6 23:00:00 2014 +++ cui103/cui_test.c Tue Apr 8 22:00:00 2014 @@ -331,15 +331,38 @@ num_hdr(cui obj, int evt, int val, void *prm) { /* CUI_EVT_BUTTON */ + + cui_num p = (cui_num)obj; cui lb_num = (cui)prm; static char buf[ CUI_ETEXT_BSIZE ]; - sprintf(buf, "%d", val); + if(p->use_dbl) sprintf(buf, "%f", p->dv); + else sprintf(buf, "%d", val); + + if(p->vp) sprintf(buf + strlen(buf), " (%d)", *p->vp); + if(p->dvp) sprintf(buf + strlen(buf), " (%f)", *p->dvp); + cui_label_str_set(lb_num, buf); return TRUE; } int +btn_num_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + cui *arr = (cui *)prm; + cui num2 = arr[0]; + cui num_d2 = arr[1]; + static int v2 = 7; + static double dv2 = 45.768; + + cui_num_vp_set(num2, &v2); + cui_num_dvp_set(num_d2, &dv2); + return TRUE; +} + +int main(int ac, char **av) { int dbg_ret = cui_dbg_open(ac, av); @@ -361,7 +384,11 @@ cui num = cui_num_new(bs_num, 1, 1, 20, 0, -5, 5, 0); cui num2 = cui_num_new(bs_num, 1, 3, 20, 0, -128, 127, 0); cui num3 = cui_num_new(bs_num, 1, 5, 20, 0, 0, 0, 0); - cui lb_num = cui_label_new(bs_num, 1, 7, ""); + 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 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"); @@ -416,7 +443,11 @@ cui_bind(num, CUI_EVT_BUTTON, num_hdr, lb_num); cui_bind(num2, CUI_EVT_BUTTON, num_hdr, lb_num); cui_bind(num3, CUI_EVT_BUTTON, num_hdr, lb_num); - cui_wh_fit(bs_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(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_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", "num", NULL}, tab_sheets, 0); diff -urN cui102/num.c cui103/num.c --- cui102/num.c Sun Apr 6 23:00:00 2014 +++ cui103/num.c Tue Apr 8 22:00:00 2014 @@ -34,6 +34,7 @@ p->v = init_v; p->min_v = min_v; p->max_v = max_v; + p->vp = NULL; sprintf(buf, "%d", p->v); if(bar_h == 0) bar_h = w; @@ -51,6 +52,8 @@ cui_wh_fit(p->bs_bar); p->bs_bar->w++; + p->use_dbl = FALSE; + cui_bind(p->etx, CUI_EVT_BUTTON, cui_num_hdr, obj); cui_bind(p->fb_dec, CUI_EVT_BUTTON, cui_num_hdr, obj); cui_bind(p->fb_inc, CUI_EVT_BUTTON, cui_num_hdr, obj); @@ -67,11 +70,50 @@ char buf[ CUI_ETEXT_BSIZE ]; char *s = cui_etext_str_get(p->etx); - if(strncmp(s, "0x", 2) == 0) sprintf(buf, "0x%x", (unsigned int)p->v); + if(p->use_dbl){ + int i; + sprintf(buf, "%f", p->dv); + i = strlen(buf) - 1; + while(i > 0 && buf[i] == '0') buf[i--] = '\0'; + if(buf[i] == '.') buf[i] = '\0'; + }else if(strncmp(s, "0x", 2) == 0) sprintf(buf, "0x%x", (unsigned int)p->v); else sprintf(buf, "%d", p->v); cui_etext_str_set(p->etx, buf); } +static void +num_set(cui obj, int v) +{ + cui_num p = (cui_num)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; +} + +static void +num_dbl_set(cui obj, double dv) +{ + cui_num p = (cui_num)obj; + int v; + + if(!p->use_dbl) return; + if(dv < p->min_dv) dv = p->min_dv; + if(dv > p->max_dv) dv = p->max_dv; + p->dv = dv; + if(p->dvp) *p->dvp = p->dv; + + v = (int)(p->ddiv * (dv - p->min_dv) / (p->max_dv - p->min_dv)); + num_set(obj, v); +} + +static double +to_dv(cui obj, int v) +{ + cui_num p = (cui_num)obj; + return p->min_dv + (p->max_dv - p->min_dv) * v / p->ddiv; +} + int cui_num_hdr(cui obj, int evt, int val, void *prm) { @@ -83,22 +125,22 @@ if(obj == p->etx){ char *s = cui_etext_str_get(p->etx); cui_etext_hist_del(p->etx, s); - p->v = strtol(s, NULL, 0); - if(p->v > p->max_v) p->v = p->max_v; - if(p->v < p->min_v) p->v = p->min_v; - update(num); + if(p->use_dbl) cui_num_dbl_set(num, strtod(s, NULL)); + else cui_num_set(num, strtol(s, NULL, 0)); cui_etext_hist_add(p->etx); cui_handler_call(num, CUI_EVT_BUTTON, p->v); return TRUE; }else if(obj == p->fb_inc){ if(p->v >= p->max_v) return TRUE; - p->v++; + num_set(num, p->v + 1); + if(p->use_dbl) num_dbl_set(num, to_dv(num, p->v)); update(num); cui_handler_call(num, CUI_EVT_BUTTON, p->v); return TRUE; }else if(obj == p->fb_dec){ if(p->v <= p->min_v) return TRUE; - p->v--; + num_set(num, p->v - 1); + if(p->use_dbl) num_dbl_set(num, to_dv(num, p->v)); update(num); cui_handler_call(num, CUI_EVT_BUTTON, p->v); return TRUE; @@ -117,7 +159,8 @@ cui_draw(p->bs_bar->parent); return TRUE; }else if(obj == p->bar){ - p->v = p->sc_max - val + p->min_v; + num_set(num, p->sc_max - val + p->min_v); + if(p->use_dbl) num_dbl_set(num, to_dv(num, p->v)); update(num); cui_handler_call(num, CUI_EVT_BUTTON, p->v); return TRUE; @@ -126,6 +169,101 @@ return TRUE; } return FALSE; +} + +int +cui_num_get(cui obj) +{ + cui_num p = (cui_num)obj; + return p->v; +} + +void +cui_num_set(cui obj, int v) +{ + num_set(obj, v); + update(obj); +} + +void +cui_num_vp_set(cui obj, int *vp) +{ + cui_num p = (cui_num)obj; + p->vp = vp; + if(p->vp) cui_num_set(obj, *p->vp); +} + +void +cui_num_min_max_set(cui obj, int min_v, int max_v) +{ + cui_num p = (cui_num)obj; + p->min_v = min_v; + p->max_v = max_v; + p->sc_max = max_v - min_v; + cui_num_set(obj, p->v); +} + +cui +cui_num_dbl_new(cui parent, int x, int y, int w, double init_dv, double min_dv, double max_dv, double step_dv, int bar_h) +{ + cui obj = cui_alloc(sizeof(struct cui_num)); + cui_num_dbl_init(obj, parent, x, y, w, init_dv, min_dv, max_dv, step_dv, bar_h); + return obj; +} + +void +cui_num_dbl_init(cui obj, cui parent, int x, int y, int w, double init_dv, double min_dv, double max_dv, double step_dv, int bar_h) +{ + cui_num p = (cui_num)obj; + int ddiv = (step_dv != 0) ? (int)((max_dv - min_dv) / step_dv) : 20; + int v = (int)(ddiv * (init_dv - min_dv) / (max_dv - min_dv)); + cui_num_init(obj, parent, x, y, w, v, 0, ddiv, bar_h); + p->use_dbl = TRUE; + p->dv = init_dv; + p->min_dv = min_dv; + p->max_dv = max_dv; + p->dvp = NULL; + p->ddiv = ddiv; + cui_num_dbl_set(obj, init_dv); +} + +double +cui_num_dbl_get(cui obj) +{ + cui_num p = (cui_num)obj; + return p->use_dbl ? p->dv : 0; +} + +void +cui_num_dbl_set(cui obj, double dv) +{ + num_dbl_set(obj, dv); + update(obj); +} + +void +cui_num_dbl_vp_set(cui obj, double *dvp) +{ + cui_num p = (cui_num)obj; + p->dvp = dvp; + if(p->dvp) cui_num_dbl_set(obj, *p->dvp); +} + +void +cui_num_dvp_set(cui obj, double *dvp) +{ + cui_num_dbl_vp_set(obj, dvp); +} + +void +cui_num_dbl_min_max_set(cui obj, double min_dv, double max_dv, double step_dv) +{ + cui_num p = (cui_num)obj; + int ddiv = (step_dv != 0) ? (int)((max_dv - min_dv) / step_dv) : 20; + cui_num_min_max_set(obj, 0, ddiv); + p->min_dv = min_dv; + p->max_dv = max_dv; + cui_num_dbl_set(obj, p->dv); } /* EOF */ diff -urN cui102/num.h cui103/num.h --- cui102/num.h Sun Apr 6 23:00:00 2014 +++ cui103/num.h Tue Apr 8 22:00:00 2014 @@ -7,12 +7,34 @@ struct cui_base base; cui fb_dec, etx, fb_inc, fb_bar; cui bs_bar, bar, fb_x; - int v, min_v, max_v; + int v, min_v, max_v, *vp; int sc_max; + + int use_dbl; + double dv, min_dv, max_dv, *dvp; + int ddiv; + } *cui_num; cui cui_num_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v, int bar_h); void cui_num_init(cui obj, cui parent, int x, int y, int w, int init_v, int min_v, int max_v, int bar_h); int cui_num_hdr(cui obj, int evt, int val, void *prm); + +int cui_num_get(cui obj); +void cui_num_set(cui obj, int v); +void cui_num_vp_set(cui obj, int *vp); +void cui_num_min_max_set(cui obj, int min_v, int max_v); + + +/* for use_dbl */ + +cui cui_num_dbl_new(cui parent, int x, int y, int w, double init_dv, double min_dv, double max_dv, double step_dv, int bar_h); +void cui_num_dbl_init(cui obj, cui parent, int x, int y, int w, double init_dv, double min_dv, double max_dv, double step_dv, int bar_h); + +double cui_num_dbl_get(cui obj); +void cui_num_dbl_set(cui obj, double dv); +void cui_num_dbl_vp_set(cui obj, double *dvp); +void cui_num_dvp_set(cui obj, double *dvp); +void cui_num_dbl_min_max_set(cui obj, double min_dv, double max_dv, double step_dv); #endif