diff -urN cui17/cui.c cui18/cui.c --- cui17/cui.c Thu Jan 30 22:00:00 2014 +++ cui18/cui.c Thu Jan 30 22:20:00 2014 @@ -183,11 +183,39 @@ int val; if(obj == NULL) return; + if(!cui_is_visible(obj)) return; val = (obj == cui_focus) ? CUI_DRAW_FOCUS : CUI_DRAW_NORMAL; cui_handler_call(obj, obj->handler_list, CUI_EVT_DRAW, val); + cui_draw_chain(obj->children); +} - cui_draw(obj->next); - cui_draw(obj->children); +void +cui_draw_chain(cui obj) +{ + if(obj == NULL) return; + cui_draw_chain(obj->next); + cui_draw(obj); +} + +void +cui_hide(cui obj) +{ + obj->flags |= CUI_FLG_HIDE; + cui_clear(obj); +} + +void +cui_show(cui obj) +{ + obj->flags &= ~CUI_FLG_HIDE; + cui_draw(obj); +} + +int +cui_is_visible(cui obj) +{ + if(obj == NULL) return TRUE; /* root */ + return !(obj->flags & CUI_FLG_HIDE) && cui_is_visible(obj->parent); } void diff -urN cui17/cui.h cui18/cui.h --- cui17/cui.h Thu Jan 30 22:00:00 2014 +++ cui18/cui.h Thu Jan 30 22:20:00 2014 @@ -18,6 +18,7 @@ #define CUI_EVT_BUTTON (1<<2) #define CUI_FLG_CAN_FOCUS (1<<0) +#define CUI_FLG_HIDE (1<<1) typedef struct cui_handler_list *cui_handler_list; @@ -40,6 +41,10 @@ int cui_gx(cui obj); int cui_gy(cui obj); void cui_draw(cui obj); +void cui_draw_chain(cui obj); +void cui_hide(cui obj); +void cui_show(cui obj); +int cui_is_visible(cui obj); void cui_quit(void); void cui_main(cui top_obj); void cui_free(cui obj); diff -urN cui17/label.c cui18/label.c --- cui17/label.c Thu Jan 30 22:10:00 2014 +++ cui18/label.c Thu Jan 30 22:20:00 2014 @@ -39,8 +39,9 @@ cui_label_str_set(cui obj, char *s) { cui_label p = (cui_label)obj; + cui_hide(obj); p->s = s; - cui_draw(obj); + cui_show(obj); } /* EOF */