diff -urN cui129/cui.c cui130/cui.c --- cui129/cui.c 2014-04-21 22:00:00.000000000 +0900 +++ cui130/cui.c 2014-04-24 22:00:00.000000000 +0900 @@ -181,20 +181,50 @@ return obj; } +int +cui_xy_conv(cui parent, int v) +{ + cui prev; + int d, base, offset; + + if(parent == NULL) return v; + if((prev = parent->children) == NULL) return v; + if((d = v - CUI_XY_MAGIC) < 0) return v; + offset = d % 100; + switch(d / 100){ + case 0: /* (CUI_CHILD_X - CUI_XY_MAGIC) / 100 */ + base = prev->x; + break; + case 1:/* (CUI_CHILD_Y - CUI_XY_MAGIC) / 100 */ + base = prev->y; + break; + case 2:/* (CUI_CHILD_X2 - CUI_XY_MAGIC) / 100 */ + base = cui_x2(prev); + break; + case 3:/* (CUI_CHILD_Y2 - CUI_XY_MAGIC) / 100 */ + base = cui_y2(prev); + break; + default: + return v; + } + return base + offset; +} + void cui_base_init(cui obj, cui parent, int x, int y, int w, int h) { obj->parent = parent; obj->children = NULL; obj->next = NULL; - obj->x = x; - obj->y = y; + obj->x = cui_xy_conv(parent, x); + obj->y = cui_xy_conv(parent, y); obj->w = w; obj->h = h; if(parent) cui_base_child_add(parent, obj); obj->handler_list = NULL; obj->flags = 0; + obj->name = NULL; } void @@ -535,6 +565,23 @@ return c; } +cui +cui_name_child_chain(cui obj, char *name) +{ + cui ret; + if(obj == NULL) return NULL; + if((ret = cui_name_child(obj, name)) != NULL) return ret; + return cui_name_child_chain(obj->next, name); +} + +cui +cui_name_child(cui obj, char *name) +{ + if(obj == NULL) return NULL; + if(obj->name && strcmp(obj->name, name) == 0) return obj; + return cui_name_child_chain(obj->children, name); +} + void cui_quit(void) { @@ -698,6 +745,7 @@ void cui_del(cui obj) { + if(obj->parent == NULL) return; cui_del_from(obj, &obj->parent->children); } @@ -788,4 +836,22 @@ } } +cui +cui_wlb_new(cui parent, int x, int y, char *s1, cui obj, char *s2) +{ + cui bs = cui_base_new(parent, x, y, 0, 0); + int bak = cui_hide_enter(obj); + cui lb1 = s1 ? cui_label_new(bs, 0, 0, s1) : NULL; + + cui_del(obj); + obj->parent = bs; + cui_base_child_add(bs, obj); + cui_xy_set(obj, lb1 ? lb1->w : 0, 0); + + if(s2) cui_label_new(bs, CUI_CHILD_X2, 0, s2); + cui_wh_fit(bs); + cui_hide_exit(obj, bak); + return bs; +} + /* EOF */ diff -urN cui129/cui.h cui130/cui.h --- cui129/cui.h 2014-04-21 22:00:00.000000000 +0900 +++ cui130/cui.h 2014-04-24 22:00:00.000000000 +0900 @@ -7,6 +7,7 @@ typedef struct cui_base *cui; +#include #include "dbg.h" #define MSG(s) fprintf(stderr, "%s() %s L%d : %s\n", __func__, __FILE__, __LINE__, s) @@ -30,6 +31,12 @@ #define CUI_ATTR_ULINE (1<<0) #define CUI_ATTR_REVERSE (1<<1) +#define CUI_XY_MAGIC (INT_MAX - 400) +#define CUI_CHILD_X (CUI_XY_MAGIC + 0) +#define CUI_CHILD_Y (CUI_XY_MAGIC + 100) +#define CUI_CHILD_X2 (CUI_XY_MAGIC + 200) +#define CUI_CHILD_Y2 (CUI_XY_MAGIC + 300) + typedef int (*cui_handler)(cui obj, int evt, int val, void *prm); #include "rect.h" @@ -40,6 +47,7 @@ int x, y, w, h; cui_list handler_list; int flags; + char *name; }; extern cui_rect cui_clip; @@ -48,6 +56,7 @@ void cui_fini(int init_ret); cui cui_alloc(int size); +int cui_xy_conv(cui parent, int v); void cui_base_init(cui obj, cui parent, int x, int y, int w, int h); void cui_base_child_add(cui obj, cui child); cui cui_base_new(cui parent, int x, int y, int w, int h); @@ -90,6 +99,8 @@ int cui_child_num(cui obj); int cui_index(cui obj); cui cui_index_to_child(cui obj, int i); +cui cui_name_child_chain(cui obj, char *name); +cui cui_name_child(cui obj, char *name); cui cui_focus_get(void); void cui_focus_set(cui obj); @@ -111,4 +122,7 @@ void cui_puts_temp_fd_exit(void); void cui_puts(char *s); +cui cui_wlb_new(cui parent, int x, int y, char *s1, cui obj, char *s2); + + #endif diff -urN cui129/menu.c cui130/menu.c --- cui129/menu.c 2014-04-21 22:00:00.000000000 +0900 +++ cui130/menu.c 2014-04-24 22:00:00.000000000 +0900 @@ -188,8 +188,9 @@ cui_menu_popup p = (cui_menu_popup)obj; cui_menu_item_init(obj, parent, x, y, lst[val]); - if(w >= 0) cui_w_set(obj, w); p->menu = cui_menu_new(cui_root(obj), 0, 0, lst); + if(w >= 0) cui_w_set(obj, w); + else cui_w_set(obj, p->menu->w); p->val = val; p->vp = NULL; p->call_btn_hdr_flag = TRUE; /* ! */ @@ -206,6 +207,11 @@ cui_menu_popup p = (cui_menu_popup)obj; cui menu = p->menu; int bak = p->val; + if(menu->parent != cui_root(obj)){ + if(menu->parent) cui_del(menu); + menu->parent = cui_root(obj); + cui_base_child_add(cui_root(obj), menu); + } menu->x = cui_lx(cui_root(obj), cui_gx(obj)); menu->y = cui_ly(cui_root(obj), cui_gy(obj)) - p->val; menu->flags &= ~CUI_FLG_HIDE;