diff -urN cui60/Makefile cui61/Makefile --- cui60/Makefile 2014-02-01 02:00:00.000000000 +0900 +++ cui61/Makefile 2014-02-02 23:50:00.000000000 +0900 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o +OBJS = cui.o focus.o etext.o menu.o dialog.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 all: $(TARG) diff -urN cui60/ckbox.c cui61/ckbox.c --- cui60/ckbox.c 2014-02-01 02:00:00.000000000 +0900 +++ cui61/ckbox.c 2014-02-02 23:50:00.000000000 +0900 @@ -21,7 +21,6 @@ if(evt == CUI_EVT_KEY){ if(val == CUI_KEY_ENTER){ p->v = !p->v; - cui_label_str_set(p->lb1, p->v ? "[X] " : "[ ] "); cui_draw(obj); cui_handler_call(obj, CUI_EVT_BUTTON, p->v); return TRUE; @@ -31,6 +30,7 @@ /* CUI_EVT_DRAW */ + cui_label_str_set(p->lb1, p->v ? "[X] " : "[ ] "); attr = (val == CUI_DRAW_FOCUS) ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL; cui_label_attr_set(p->lb1, attr); cui_label_attr_set(p->lb2, attr); @@ -65,4 +65,19 @@ cui_w_set(obj, cui_x2(p->lb2)); } +int +cui_ckbox_val_get(cui obj) +{ + cui_ckbox p = (cui_ckbox)obj; + return p->v; +} + +void +cui_ckbox_val_set(cui obj, int v) +{ + cui_ckbox p = (cui_ckbox)obj; + p->v = v; + if(cui_is_visible(obj)) cui_draw(obj); +} + /* EOF */ diff -urN cui60/ckbox.h cui61/ckbox.h --- cui60/ckbox.h 2014-01-31 02:30:00.000000000 +0900 +++ cui61/ckbox.h 2014-02-02 23:50:00.000000000 +0900 @@ -10,10 +10,12 @@ } *cui_ckbox; cui cui_ckbox_new(cui parent, int x, int y, char *s, int v); +int cui_ckbox_hdr(cui obj, int evt, int val, void *prm); void cui_ckbox_init(cui obj, cui parent, int x, int y, char *s, int v); char *cui_ckbox_str_get(cui obj); void cui_ckbox_str_set(cui obj, char *s); - +int cui_ckbox_val_get(cui obj); +void cui_ckbox_val_set(cui obj, int v); #endif diff -urN cui60/cui.c cui61/cui.c --- cui60/cui.c 2014-02-01 02:00:00.000000000 +0900 +++ cui61/cui.c 2014-02-02 23:50:00.000000000 +0900 @@ -210,7 +210,7 @@ if(!cui_is_visible(obj)) return; val = (obj == cui_focus_get()) ? CUI_DRAW_FOCUS : CUI_DRAW_NORMAL; cui_handler_call(obj, CUI_EVT_DRAW, val); - //usleep(5*1000); // for debug + //usleep(20*1000); // for debug cui_draw_chain(obj->children); } @@ -339,6 +339,7 @@ void cui_wh_fit(cui obj) { + obj->w = obj->h = 0; cui_wh_fit_chain(obj, obj->children); } diff -urN cui60/cui_test.c cui61/cui_test.c --- cui60/cui_test.c 2014-02-02 23:00:00.000000000 +0900 +++ cui61/cui_test.c 2014-02-02 23:50:00.000000000 +0900 @@ -10,6 +10,7 @@ #include "dialog.h" #include "menu.h" #include "etext.h" +#include "tab.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -274,25 +275,11 @@ } int -tab_hdr(cui obj, int evt, int val, void *prm) -{ - cui sheet = (cui)prm; - if(val) cui_show(sheet); - else cui_hide(sheet); - return TRUE; -} - -int main() { cui bs = cui_panel_new(NULL, 0, 0, 42, 23); - cui grp = cui_base_new(bs, 1, 1, 0, 1); - cui rd_foo = cui_radio_new(grp, 0, 0, "foo", 1); - cui rd_bar = cui_radio_new(grp, cui_x2(rd_foo)+2, 0, "bar", 0); - cui rd_hoge = cui_radio_new(grp, cui_x2(rd_bar)+2, 0, "hoge", 0); cui lb_bar = cui_label_new(bs, 4, 4, "bar sheet"); cui lb_hoge = cui_label_new(bs, 4, 4, "hoge sheet"); - cui base = cui_panel_new(bs, 1, 2, 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"); @@ -313,12 +300,7 @@ cui_bind(ck, CUI_EVT_BUTTON, my_hdr2, small); cui_bind(mv_btn, CUI_EVT_BUTTON, mv_hdr, mv_lb); - cui_wh_fit(grp); - cui_hide(lb_bar); - cui_hide(lb_hoge); - cui_bind(rd_foo, CUI_EVT_BUTTON, tab_hdr, base); - cui_bind(rd_bar, CUI_EVT_BUTTON, tab_hdr, lb_bar); - cui_bind(rd_hoge, CUI_EVT_BUTTON, tab_hdr, lb_hoge); + cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", NULL}, (cui []){base, lb_bar, lb_hoge}, 0); cui_main(bs, NULL); printf("result %s\n", p->btn_result); diff -urN cui60/handler.c cui61/handler.c --- cui60/handler.c 2014-02-01 02:00:00.000000000 +0900 +++ cui61/handler.c 2014-02-02 23:50:00.000000000 +0900 @@ -54,7 +54,6 @@ if(list == NULL) return FALSE; return (evt & list->evt) && (*list->hdr)(obj, evt, val, list->prm) ? TRUE : cui_handler_call_chain(obj, list->next, evt, val); - } int diff -urN cui60/radio.c cui61/radio.c --- cui60/radio.c 2014-02-01 02:00:00.000000000 +0900 +++ cui61/radio.c 2014-02-02 23:50:00.000000000 +0900 @@ -14,11 +14,10 @@ void cui_radio_toggle(cui obj) { - cui_ckbox ck = (cui_ckbox)obj; - - ck->v = !ck->v; - cui_label_str_set(ck->lb1, ck->v ? "(O) " : "( ) "); - cui_handler_call(obj, CUI_EVT_BUTTON, ck->v); + int v = cui_radio_val_get(obj); + v = !v; + cui_radio_val_set(obj, v); + cui_handler_call(obj, CUI_EVT_BUTTON, v); } cui @@ -33,14 +32,24 @@ int cui_radio_hdr(cui obj, int evt, int val, void *prm) { - cui_ckbox ck = (cui_ckbox)obj; + cui_radio p = (cui_radio)obj; cui old; + int attr; - if(val != CUI_KEY_ENTER) return FALSE; - if(ck->v) return TRUE; - old = cui_radio_sel_get(obj->parent->children); - if(old) cui_radio_toggle(old); - cui_radio_toggle(obj); + if(evt == CUI_EVT_KEY){ + if(val != CUI_KEY_ENTER) return FALSE; + if(cui_radio_val_get(obj)) return TRUE; + old = cui_radio_sel_get(obj->parent->children); + if(old) cui_radio_toggle(old); + cui_radio_toggle(obj); + return TRUE; + } + /* CUI_EVT_DRAW */ + + cui_label_str_set(p->lb1, cui_radio_val_get(obj) ? "(O) " : "( ) "); + attr = (val == CUI_DRAW_FOCUS) ? CUI_ATTR_ULINE : CUI_ATTR_NORMAL; + cui_label_attr_set(p->lb1, attr); + cui_label_attr_set(p->lb2, attr); return TRUE; } @@ -48,11 +57,12 @@ cui_radio_init(cui obj, cui parent, int x, int y, char *s, int v) { cui_ckbox ck = (cui_ckbox)obj; + cui_radio p = (cui_radio)ck; + cui_ckbox_init(obj, parent, x, y, s, v); - cui_hide(obj); - cui_label_str_set(ck->lb1, v ? "(O) " : "( ) "); - cui_show(obj); - cui_bind(obj, CUI_EVT_KEY, cui_radio_hdr, NULL); + p->lb1 = ck->lb1; + p->lb2 = ck->lb2; + cui_bind(obj, CUI_EVT_KEY | CUI_EVT_DRAW, cui_radio_hdr, NULL); } char * @@ -67,4 +77,16 @@ cui_ckbox_str_set(obj, s); } +int +cui_radio_val_get(cui obj) +{ + return cui_ckbox_val_get(obj); +} + +void +cui_radio_val_set(cui obj, int v) +{ + cui_ckbox_val_set(obj, v); +} + /* EOF */ diff -urN cui60/radio.h cui61/radio.h --- cui60/radio.h 2014-01-31 22:00:00.000000000 +0900 +++ cui61/radio.h 2014-02-02 23:50:00.000000000 +0900 @@ -5,6 +5,7 @@ typedef struct cui_radio{ struct cui_ckbox ckbox; + cui lb1, lb2; } *cui_radio; cui cui_radio_new(cui parent, int x, int y, char *s, int v); @@ -14,6 +15,7 @@ void cui_radio_init(cui obj, cui parent, int x, int y, char *s, int v); char *cui_radio_str_get(cui obj); void cui_radio_str_set(cui obj, char *s); - +int cui_radio_val_get(cui obj); +void cui_radio_val_set(cui obj, int v); #endif diff -urN cui60/tab.c cui61/tab.c --- cui60/tab.c 1970-01-01 09:00:00.000000000 +0900 +++ cui61/tab.c 2014-02-02 23:50:00.000000000 +0900 @@ -0,0 +1,104 @@ +#include "tab.h" +#include "handler.h" +#include + +cui +cui_tab_btn_new(cui parent, int x, int y, char *s, int v) +{ + cui obj = cui_alloc(sizeof(struct cui_tab_btn)); + cui_tab_btn_init(obj, parent, x, y, s, v); + return obj; +} + +void +cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v) +{ + cui_radio rd = (cui_radio)obj; + cui_tab_btn p = (cui_tab_btn)rd; + + cui_radio_init(obj, parent, x, y, s, v); + + cui_hide(obj); + + p->lb1 = rd->lb1; + p->lb2 = rd->lb2; + cui_label_str_set(p->lb1, "/"); + cui_x_set(p->lb2, cui_x2(p->lb1)); + p->lb3 = cui_label_new(obj, cui_x2(p->lb2), 0, "|"); + cui_wh_fit(obj); + cui_bind(obj, CUI_EVT_DRAW , cui_tab_btn_hdr, NULL); + + cui_show(obj); +} + +int +cui_tab_btn_hdr(cui obj, int evt, int val, void *prm) +{ + cui_tab_btn p = (cui_tab_btn)obj; + int attr, v; + cui sheet; + + switch(evt){ + case CUI_EVT_DRAW: + v = cui_tab_btn_val_get(obj); + attr = v ? CUI_ATTR_NORMAL : CUI_ATTR_ULINE; + cui_label_attr_set(p->lb1, attr); + cui_label_attr_set(p->lb3, attr); + if(val == CUI_DRAW_FOCUS) attr |= CUI_ATTR_REVERSE; + cui_label_attr_set(p->lb2, attr); + return TRUE; + case CUI_EVT_BUTTON: + sheet = (cui)prm; + if(val) cui_show(sheet); + else cui_hide(sheet); + return TRUE; + } + return FALSE; +} + +int +cui_tab_btn_val_get(cui obj) +{ + return cui_radio_val_get(obj); +} + +void +cui_tab_btn_val_set(cui obj, int v) +{ + cui_radio_val_set(obj, v); +} + +cui +cui_tab_new(cui parent, int x, int y, int w, char **lst, cui *sheets, int v) +{ + cui obj = cui_alloc(sizeof(struct cui_tab)); + cui_tab_init(obj, parent, x, y, w, lst, sheets, v); + return obj; +} + +void +cui_tab_init(cui obj, cui parent, int x, int y, int w, char **lst, cui *sheets, int v) +{ + cui btn; + int i; + + cui_base_init(obj, parent, x, y, w, 1); + if(lst){ + x = 0; + for(i=0; lst[i]; i++){ + btn = cui_tab_btn_new(obj, x, 0, lst[i], i == v); + x = cui_x2(btn); + cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, sheets[i]); + } + } + if(w < 0) cui_wh_fit(obj); +} + +void +cui_tab_add(cui obj, char *s, cui sheet) +{ + cui btn = cui_tab_btn_new(obj, cui_x2(obj->children), 0, s, 0); + cui_bind(btn, CUI_EVT_BUTTON, cui_tab_btn_hdr, sheet); +} + +/* EOF */ diff -urN cui60/tab.h cui61/tab.h --- cui60/tab.h 1970-01-01 09:00:00.000000000 +0900 +++ cui61/tab.h 2014-02-02 23:50:00.000000000 +0900 @@ -0,0 +1,25 @@ +#ifndef __TAB_H__ +#define __TAB_H__ + +#include "radio.h" + +typedef struct cui_tab_btn{ + struct cui_radio radio; + cui lb1, lb2, lb3; +} *cui_tab_btn; + +typedef struct cui_tab{ + struct cui_base base; +} *cui_tab; + +cui cui_tab_btn_new(cui parent, int x, int y, char *s, int v); +void cui_tab_btn_init(cui obj, cui parent, int x, int y, char *s, int v); +int cui_tab_btn_hdr(cui obj, int evt, int val, void *prm); +int cui_tab_btn_val_get(cui obj); +void cui_tab_btn_val_set(cui obj, int v); + +cui cui_tab_new(cui parent, int x, int y, int w, char **lst, cui *sheets, int v); +void cui_tab_init(cui obj, cui parent, int x, int y, int w, char **lst, cui *sheets, int v); +void cui_tab_add(cui obj, char *s, cui sheet); + +#endif