diff -urN cui101/Makefile cui102/Makefile --- cui101/Makefile Sun Apr 6 22:00:00 2014 +++ cui102/Makefile Sun Apr 6 23:00:00 2014 @@ -7,7 +7,7 @@ endif TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o dbg.o list.o +OBJS = cui.o focus.o num.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o dbg.o list.o all: $(TARG) diff -urN cui101/cui_test.c cui102/cui_test.c --- cui101/cui_test.c Tue Apr 1 23:10:00 2014 +++ cui102/cui_test.c Sun Apr 6 23:00:00 2014 @@ -18,6 +18,7 @@ #include "scpanel.h" #include "term.h" #include "timer.h" +#include "num.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -327,6 +328,18 @@ } int +num_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + cui lb_num = (cui)prm; + static char buf[ CUI_ETEXT_BSIZE ]; + + sprintf(buf, "%d", val); + cui_label_str_set(lb_num, buf); + return TRUE; +} + +int main(int ac, char **av) { int dbg_ret = cui_dbg_open(ac, av); @@ -344,6 +357,11 @@ cui lb_timer1 = cui_label_new(bs_timer, 0, 1, "0 "); cui lb_timer2 = cui_label_new(bs_timer, 10, 1, "not yet"); cui lb_timer3 = cui_label_new(bs_timer, 10, 2, "not yet"); + cui bs_num = cui_base_new(bs_view, 0, 1, 0, 0); + 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 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"); @@ -355,7 +373,7 @@ cui small = cui_scpanel_new(base, 2, 3, base->w - (2 * 2), base->h - (3 + 1), "title"); cui small2 = cui_scpanel_sheet_get(small); - cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term, bs_timer }; + cui tab_sheets[] = { base, bs_bar, sc_hoge, bs_term, bs_timer, bs_num }; char lb_timer1_buf[16]; @@ -394,7 +412,13 @@ cui_timer_set_bind(lb_timer2, 200, FALSE, lb_timer_hdr, NULL); cui_timer_set_bind(lb_timer3, 10*1000, TRUE, lb_timer_hdr, NULL); - cui_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", NULL}, tab_sheets, 0); + cui_hide(bs_num); + 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_tab_new(bs_view, 0, 0, -1, (char *[]){"foo", "bar", "hoge", "term", "timer", "num", NULL}, tab_sheets, 0); cui_main(bs, NULL); printf("result %s\n", p->btn_result); diff -urN cui101/etext.h cui102/etext.h --- cui101/etext.h Sun Feb 2 22:20:00 2014 +++ cui102/etext.h Sun Apr 6 23:00:00 2014 @@ -26,6 +26,7 @@ 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_hist_del(cui obj, char *str); void cui_etext_hist_add(cui obj); void cui_etext_cursor_update(cui obj); int cui_etext_hdr(cui obj, int evt, int val, void *prm); diff -urN cui101/num.c cui102/num.c --- cui101/num.c Thu Jan 1 09:00:00 1970 +++ cui102/num.c Sun Apr 6 23:00:00 2014 @@ -0,0 +1,131 @@ +#include "num.h" +#include "etext.h" +#include "fillbtn.h" +#include "scbar.h" +#include "handler.h" +#include +#include +#include +#include + +cui +cui_num_new(cui parent, int x, int y, int w, int init_v, int min_v, int max_v, int bar_h) +{ + cui obj = cui_alloc(sizeof(struct cui_num)); + cui_num_init(obj, parent, x, y, w, init_v, min_v, max_v, bar_h); + return obj; +} + +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) +{ + cui_num p = (cui_num)obj; + char buf[ CUI_ETEXT_BSIZE ]; + + w = w < 6 ? 6 : w; + cui_base_init(obj, parent, x, y, w, 1); + + if(min_v == max_v){ /* default */ + min_v = INT_MIN / 32; + max_v = INT_MAX / 32; + } + init_v = init_v < min_v ? min_v : init_v; + init_v = init_v > max_v ? max_v : init_v; + p->v = init_v; + p->min_v = min_v; + p->max_v = max_v; + sprintf(buf, "%d", p->v); + + if(bar_h == 0) bar_h = w; + + p->fb_dec = cui_fillbtn_new(obj, 0, 0, 1, 1, "<"); + p->etx = cui_etext_new(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, "|"); + + p->bs_bar = cui_base_new(cui_root(obj), 0, 0, 0, 0); + cui_hide(p->bs_bar); + p->sc_max = max_v - min_v; + p->bar = cui_scbar_new(p->bs_bar, 1, 1, 1, bar_h, p->sc_max, 0); + p->fb_x = cui_fillbtn_new(p->bs_bar, 1, 0, 1, 1, "x"); + cui_wh_fit(p->bs_bar); + p->bs_bar->w++; + + 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); + cui_bind(p->fb_bar, CUI_EVT_BUTTON, cui_num_hdr, obj); + + cui_bind(p->bar, CUI_EVT_BUTTON, cui_num_hdr, obj); + cui_bind(p->fb_x, CUI_EVT_BUTTON, cui_num_hdr, obj); +} + +static void +update(cui obj) +{ + cui_num p = (cui_num)obj; + 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); + else sprintf(buf, "%d", p->v); + cui_etext_str_set(p->etx, buf); +} + +int +cui_num_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_BUTTON */ + + cui num = (cui)prm; + cui_num p = (cui_num) num; + + 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); + 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++; + 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--; + update(num); + cui_handler_call(num, CUI_EVT_BUTTON, p->v); + return TRUE; + }else if(obj == p->fb_bar){ + cui root = cui_root(obj); + int x = cui_lx(root, cui_gx(obj)) - 1; + int y = cui_ly(root, cui_gy(obj)) - p->bs_bar->h / 2; + cui focus = ((cui_scbar)p->bar)->thumb; + + cui_scbar_val_set(p->bar, p->sc_max - p->v + p->min_v); + y = y < 0 ? 0 : y; + cui_xy_set(p->bs_bar, x, y); + p->bs_bar->flags &= ~CUI_FLG_HIDE; + cui_main(p->bs_bar, focus); + cui_hide(p->bs_bar); + cui_draw(p->bs_bar->parent); + return TRUE; + }else if(obj == p->bar){ + p->v = p->sc_max - val + p->min_v; + update(num); + cui_handler_call(num, CUI_EVT_BUTTON, p->v); + return TRUE; + }else if(obj == p->fb_x){ + cui_quit(); + return TRUE; + } + return FALSE; +} + +/* EOF */ diff -urN cui101/num.h cui102/num.h --- cui101/num.h Thu Jan 1 09:00:00 1970 +++ cui102/num.h Sun Apr 6 23:00:00 2014 @@ -0,0 +1,18 @@ +#ifndef __NUM_H__ +#define __NUM_H__ + +#include "cui.h" + +typedef struct cui_num{ + 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 sc_max; +} *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); + +#endif