diff -urN cui47/cui.c cui48/cui.c --- cui47/cui.c 2014-01-31 22:00:00.000000000 +0900 +++ cui48/cui.c 2014-01-31 22:30:00.000000000 +0900 @@ -294,6 +294,24 @@ cui_wh_fit(obj, child->next); } +int +cui_index(cui obj) +{ + if(obj == NULL) return -1; + return cui_index(obj->next) + 1; +} + +cui +cui_index_to_child(cui obj, int i) +{ + cui c = obj->children; + int ci = cui_index(c); + + if(ci < 0 || ci < i) return NULL; + while(ci-- > i) c = c->next; + return c; +} + void cui_quit(void) { diff -urN cui47/cui.h cui48/cui.h --- cui47/cui.h 2014-01-31 22:00:00.000000000 +0900 +++ cui48/cui.h 2014-01-31 22:30:00.000000000 +0900 @@ -64,6 +64,9 @@ void cui_wh_set(cui obj, int w, int h); void cui_wh_fit(cui obj, cui child); +int cui_index(cui obj); +cui cui_index_to_child(cui obj, int i); + cui cui_focus_get(void); void cui_focus_set(cui obj); void cui_focus_chk(void); diff -urN cui47/cui_test.c cui48/cui_test.c --- cui47/cui_test.c 2014-01-31 22:20:00.000000000 +0900 +++ cui48/cui_test.c 2014-01-31 22:30:00.000000000 +0900 @@ -181,7 +181,11 @@ int mn_hdr(cui obj, int evt, int val, void *prm) { - cui_label_str_set((cui)prm, cui_button_str_get(obj)); + if(val >= 0){ + cui item = cui_index_to_child(obj, val); + char *s = cui_menu_item_str_get(item); + cui_label_str_set((cui)prm, s); + } cui_quit(); return TRUE; } @@ -189,26 +193,15 @@ int mn_btn_hdr(cui obj, int evt, int val, void *prm) { - cui base = cui_base_new(obj->parent, obj->x, obj->y+1, 0, 0); - cui item[4]; - int i; - - item[0] = cui_menu_item_new(base, 0, 0, "Open"); - item[1] = cui_menu_item_new(base, 0, 1, "Save"); - item[2] = cui_menu_item_new(base, 0, 2, "Close"); - item[3] = cui_menu_item_new(base, 0, 3, "Quit"); - cui_wh_fit(base, base->children); - for(i=0; i<4; i++){ - item[i]->w = base->w; - cui_menu_item_adj(item[i]); - cui_bind(item[i], CUI_EVT_BUTTON, mn_hdr, prm); - } - cui_main(base, item[0]); - - cui_hide(base); - cui_draw(base->parent); - cui_del(base); - cui_free(base); + char *lst[] = {"Open", "Save", "Close", "Quit", NULL}; + cui menu = cui_menu_new(obj->parent, obj->x, obj->y+1, lst); + + cui_bind(menu, CUI_EVT_BUTTON, mn_hdr, prm); + cui_main(menu, cui_menu_str_to_item(menu, "Open")); + cui_hide(menu); + cui_draw(menu->parent); + cui_del(menu); + cui_free(menu); if(strcmp(cui_label_str_get((cui)prm), "Quit") == 0) cui_quit(); return TRUE; diff -urN cui47/menu.c cui48/menu.c --- cui47/menu.c 2014-01-31 22:20:00.000000000 +0900 +++ cui48/menu.c 2014-01-31 22:30:00.000000000 +0900 @@ -1,6 +1,8 @@ #include "menu.h" #include "handler.h" +#include "key.h" #include +#include cui cui_menu_btn_new(cui parent, int x, int y, char *s) @@ -41,6 +43,12 @@ return TRUE; } +char * +cui_menu_btn_str_get(cui obj) +{ + return cui_button_str_get(obj); +} + cui cui_menu_item_new(cui parent, int x, int y, char *s) { @@ -57,7 +65,7 @@ cui_menu_btn_init(obj, parent, x, y, s); mn_item->fill = cui_fill_new(obj, btn->lb3->x, 0, 0, 1, " ", CUI_ATTR_ULINE); - cui_bind(obj, CUI_EVT_DRAW, cui_menu_item_hdr, NULL); + cui_bind(obj, CUI_EVT_DRAW | CUI_EVT_KEY, cui_menu_item_hdr, NULL); } void @@ -76,9 +84,59 @@ cui_button btn = (cui_button)obj; cui_menu_item mn_item = (cui_menu_item)obj; + if(evt == CUI_EVT_BUTTON){ + val = val ? cui_index(obj) : -1; + cui_handler_call(obj->parent, obj->parent->handler_list, CUI_EVT_BUTTON, val); + return TRUE; + } + if(evt == CUI_EVT_KEY){ + switch(val){ + case CUI_KEY_ENTER: + case CUI_KEY_ESC: + cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, val == CUI_KEY_ENTER); + return TRUE; + } + return FALSE; + } + /* CUI_EVT_DRAW */ cui_menu_btn_hdr(obj, evt, val, prm); cui_fill_attr_set(mn_item->fill, cui_label_attr_get(btn->lb2)); return TRUE; } +char * +cui_menu_item_str_get(cui obj) +{ + return cui_menu_btn_str_get(obj); +} + +cui +cui_menu_new(cui parent, int x, int y, char **lst) +{ + cui obj = cui_base_new(parent, x, y, 0, 0); + char *s; + cui item; + + y = 0; + while((s = *lst++) != NULL) cui_menu_item_new(obj, 0, y++, s); + cui_wh_fit(obj, obj->children); + for(item=obj->children; item; item=item->next){ + item->w = obj->w; + cui_menu_item_adj(item); + cui_bind(item, CUI_EVT_BUTTON, cui_menu_item_hdr, NULL); + } + return obj; +} + +cui +cui_menu_str_to_item(cui menu, char *s) +{ + cui item; + + for(item=menu->children; item; item=item->next){ + if(strcmp(cui_menu_item_str_get(item), s) == 0) return item; + } + return NULL; +} + /* EOF */ diff -urN cui47/menu.h cui48/menu.h --- cui47/menu.h 2014-01-31 22:20:00.000000000 +0900 +++ cui48/menu.h 2014-01-31 22:30:00.000000000 +0900 @@ -16,10 +16,15 @@ 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); int cui_menu_btn_hdr(cui obj, int evt, int val, void *prm); +char *cui_menu_btn_str_get(cui obj); cui cui_menu_item_new(cui parent, int x, int y, char *s); void cui_menu_item_init(cui obj, cui parent, int x, int y, char *s); void cui_menu_item_adj(cui obj); int cui_menu_item_hdr(cui obj, int evt, int val, void *prm); +char *cui_menu_item_str_get(cui obj); + +cui cui_menu_new(cui parent, int x, int y, char **lst); +cui cui_menu_str_to_item(cui menu, char *s); #endif