diff -urN cui50/cui.c cui51/cui.c --- cui50/cui.c 2014-01-31 22:30:00.000000000 +0900 +++ cui51/cui.c 2014-01-31 23:00:00.000000000 +0900 @@ -172,6 +172,18 @@ } int +cui_lx(cui obj, int gx) +{ + return obj == NULL ? gx : cui_lx(obj->parent, gx) - obj->x; +} + +int +cui_ly(cui obj, int gy) +{ + return obj == NULL ? gy : cui_lx(obj->parent, gy) - obj->y; +} + +int cui_x2(cui obj) { return obj->x + obj->w; @@ -183,6 +195,12 @@ return obj->y + obj->h; } +cui +cui_root(cui obj) +{ + return obj->parent == NULL ? obj : cui_root(obj->parent); +} + void cui_draw(cui obj) { diff -urN cui50/cui.h cui51/cui.h --- cui50/cui.h 2014-01-31 22:30:00.000000000 +0900 +++ cui51/cui.h 2014-01-31 23:00:00.000000000 +0900 @@ -48,8 +48,11 @@ int cui_gx(cui obj); int cui_gy(cui obj); int cui_glen(cui o1, cui o2); +int cui_lx(cui obj, int gx); +int cui_ly(cui obj, int gy); int cui_x2(cui obj); int cui_y2(cui obj); +cui cui_root(cui obj); void cui_draw(cui obj); void cui_draw_chain(cui obj); void cui_hide(cui obj); diff -urN cui50/cui_test.c cui51/cui_test.c --- cui50/cui_test.c 2014-01-31 22:40:00.000000000 +0900 +++ cui51/cui_test.c 2014-01-31 23:00:00.000000000 +0900 @@ -200,18 +200,35 @@ return mn_btn; } +int +popup_hdr(cui obj, int evt, int val, void *prm) +{ + cui lb = (cui)prm; + static char buf[16]; + int last[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + sprintf(buf, "last %d/%d", val+1, last[val]); + cui_label_str_set(lb, buf); + return TRUE; +} + cui big_new(cui parent, int x, int y, cui_simple_dialog *res_dlg) { cui base = cui_panel_new(parent, x, y, 0, 0); cui dlg = cui_simple_dialog_new(base, 0, 0, "Are you sure ?", "OK", "Cancel"); cui_simple_dialog p = (cui_simple_dialog)dlg; + cui popup = cui_menu_popup_new(base, cui_x2(dlg)+1, cui_y2(dlg)+5, 8, + (char *[]){"January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December", NULL}, 0); + cui lb = cui_label_new(base, cui_x2(popup)+2, popup->y, "last 1/31"); + radio_new(base, cui_x2(dlg)+1, dlg->y); cui_simple_dialog_new(base, dlg->x, cui_y2(dlg), "How are you ?", "^_^", "T_T"); mn_long_new(base, cui_x2(dlg)+1, cui_y2(dlg)+3); cui_wh_fit(base, base->children); cui_bind(p->btn1, CUI_EVT_BUTTON, my_hdr, p); + cui_bind(popup, CUI_EVT_BUTTON, popup_hdr, lb); *res_dlg = p; return base; } diff -urN cui50/handler.c cui51/handler.c --- cui50/handler.c 2014-01-30 22:00:00.000000000 +0900 +++ cui51/handler.c 2014-01-31 23:00:00.000000000 +0900 @@ -36,12 +36,15 @@ while(*p){ list = *p; - if(list->evt == evt && list->hdr == hdr){ - *p = list->next; - free(list); - }else{ - p = &list->next; + if(list->evt & evt && list->hdr == hdr){ + list->evt &= ~evt; + if(list->evt == 0){ + *p = list->next; + free(list); + continue; + } } + p = &list->next; } } diff -urN cui50/menu.c cui51/menu.c --- cui50/menu.c 2014-01-31 22:50:00.000000000 +0900 +++ cui51/menu.c 2014-01-31 23:00:00.000000000 +0900 @@ -49,6 +49,12 @@ return cui_button_str_get(obj); } +void +cui_menu_btn_str_set(cui obj, char *s) +{ + cui_button_str_set(obj, s); +} + cui cui_menu_item_new(cui parent, int x, int y, char *s) { @@ -73,9 +79,11 @@ { cui_button btn = (cui_button)obj; cui_menu_item mn_item = (cui_menu_item)obj; + cui fill = mn_item->fill; btn->lb3->x = obj->w-1; - mn_item->fill->w = btn->lb3->x - cui_x2(btn->lb2); + fill->x = cui_x2(btn->lb2); + fill->w = btn->lb3->x - fill->x; } int @@ -120,6 +128,15 @@ return cui_menu_btn_str_get(obj); } +void +cui_menu_item_str_set(cui obj, char *s) +{ + int bak = obj->w; + cui_menu_btn_str_set(obj, s); + obj->w = bak; + cui_menu_item_adj(obj); +} + cui cui_menu_new(cui parent, int x, int y, char **lst) { @@ -149,4 +166,59 @@ return NULL; } +cui +cui_menu_popup_new(cui parent, int x, int y, int w, char **lst, int val) +{ + cui obj = cui_alloc(sizeof(struct cui_menu_popup)); + cui_menu_popup_init(obj, parent, x, y, w, lst, val); + return obj; +} + +void +cui_menu_popup_init(cui obj, cui parent, int x, int y, int w, char **lst, int val) +{ + cui_menu_popup p = (cui_menu_popup)obj; + + cui_menu_item_init(obj, parent, x, y, lst[val]); + if(w >= 0){ + obj->w = w; + cui_menu_item_adj(obj); + } + p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); + p->menu->flags |= CUI_FLG_HIDE; + p->val = val; + + cui_unbind(obj, CUI_EVT_KEY | CUI_EVT_BUTTON, cui_menu_item_hdr); + cui_bind(obj, CUI_EVT_KEY, cui_menu_popup_hdr, NULL); + cui_bind(p->menu, CUI_EVT_BUTTON,cui_menu_popup_hdr, obj); +} + +int +cui_menu_popup_hdr(cui obj, int evt, int val, void *prm) +{ + if(evt == CUI_EVT_KEY && val == CUI_KEY_ENTER){ /* menu_popup */ + cui_menu_popup p = (cui_menu_popup)obj; + cui menu = p->menu; + int bak = p->val; + menu->x = cui_lx(cui_root(obj), cui_gx(obj)); + menu->y = cui_ly(cui_root(obj), cui_gy(obj)) - p->val; + cui_show(menu); + cui_main(menu, cui_index_to_child(menu, p->val)); + cui_hide(menu); + if(p->val != bak){ + 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, obj->handler_list, CUI_EVT_BUTTON, p->val); + } + cui_draw(menu->parent); + return TRUE; + }else if(evt == CUI_EVT_BUTTON){ /* menu */ + cui_menu_popup p = (cui_menu_popup)prm; + if(val >= 0) p->val = val; + cui_quit(); + return TRUE; + } + return FALSE; +} + /* EOF */ diff -urN cui50/menu.h cui51/menu.h --- cui50/menu.h 2014-01-31 22:30:00.000000000 +0900 +++ cui51/menu.h 2014-01-31 23:00:00.000000000 +0900 @@ -13,18 +13,30 @@ cui fill; } *cui_menu_item; +typedef struct cui_menu_popup{ + struct cui_menu_item item; + cui menu; + int val; +} * cui_menu_popup; + 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); +void cui_menu_btn_str_set(cui obj, char *s); 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); +void cui_menu_item_str_set(cui obj, char *s); cui cui_menu_new(cui parent, int x, int y, char **lst); cui cui_menu_str_to_item(cui menu, char *s); +cui cui_menu_popup_new(cui parent, int x, int y, int w, char **lst, int val); +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); + #endif