diff -urN cui46/Makefile cui47/Makefile --- cui46/Makefile 2014-01-31 22:00:00.000000000 +0900 +++ cui47/Makefile 2014-01-31 22:20:00.000000000 +0900 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o dialog.o radio.o ckbox.o button.o fill.o label.o panel.o handler.o esc.o key.o rect.o +OBJS = cui.o focus.o menu.o dialog.o radio.o ckbox.o button.o fill.o label.o panel.o handler.o esc.o key.o rect.o all: $(TARG) diff -urN cui46/cui_test.c cui47/cui_test.c --- cui46/cui_test.c 2014-01-31 22:10:00.000000000 +0900 +++ cui47/cui_test.c 2014-01-31 22:20:00.000000000 +0900 @@ -8,6 +8,7 @@ #include "ckbox.h" #include "radio.h" #include "dialog.h" +#include "menu.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -188,26 +189,26 @@ int mn_btn_hdr(cui obj, int evt, int val, void *prm) { - cui panel = cui_panel_new(obj->parent, obj->x, obj->y+1, 0, 0); - cui btn[4]; + cui base = cui_base_new(obj->parent, obj->x, obj->y+1, 0, 0); + cui item[4]; int i; - btn[0] = cui_button_new(panel, 1, 1, "Open"); - btn[1] = cui_button_new(panel, 1, 2, "Save"); - btn[2] = cui_button_new(panel, 1, 3, "Close"); - btn[3] = cui_button_new(panel, 1, 4, "Quit"); - cui_wh_fit(panel, panel->children); - panel->w += 1; - panel->h += 1; - cui_panel_adj(panel); - - for(i=0; i<4; i++) cui_bind(btn[i], CUI_EVT_BUTTON, mn_hdr, prm); - cui_main(panel, btn[0]); + 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(panel); - cui_draw(panel->parent); - cui_del(panel); - cui_free(panel); + cui_hide(base); + cui_draw(base->parent); + cui_del(base); + cui_free(base); if(strcmp(cui_label_str_get((cui)prm), "Quit") == 0) cui_quit(); return TRUE; @@ -217,7 +218,7 @@ main() { cui base = cui_panel_new(NULL, 0, 0, 40, 20); - cui mn_btn = cui_button_new(base, 1, 1, "File"); + cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); cui ck = cui_ckbox_new(base, cui_x2(mn_btn)+2, 1, "Show", FALSE); cui mv_btn = cui_button_new(base, cui_x2(ck) + 2, ck->y, "move"); cui mv_lb = cui_label_new(base, cui_x2(mv_btn) + 2, mv_btn->y, ""); diff -urN cui46/dialog.c cui47/dialog.c --- cui46/dialog.c 2014-01-30 22:00:00.000000000 +0900 +++ cui47/dialog.c 2014-01-31 22:20:00.000000000 +0900 @@ -34,6 +34,7 @@ cui_bind(p->btn1, CUI_EVT_BUTTON, cui_simple_dialog_hdr, obj); cui_bind(p->btn2, CUI_EVT_BUTTON, cui_simple_dialog_hdr, obj); + p->btn_result = "not yet"; return obj; } diff -urN cui46/fill.c cui47/fill.c --- cui46/fill.c 2014-01-31 01:10:00.000000000 +0900 +++ cui47/fill.c 2014-01-31 22:20:00.000000000 +0900 @@ -28,4 +28,16 @@ ((cui_label)obj)->attr = attr; } +int +cui_fill_attr_get(cui obj) +{ + return cui_label_attr_get(obj); +} + +void +cui_fill_attr_set(cui obj, int attr) +{ + cui_label_attr_set(obj, attr); +} + /* EOF */ diff -urN cui46/fill.h cui47/fill.h --- cui46/fill.h 2014-01-31 01:10:00.000000000 +0900 +++ cui47/fill.h 2014-01-31 22:20:00.000000000 +0900 @@ -9,5 +9,7 @@ cui cui_fill_new(cui parent, int x, int y, int w, int h, char *s, int attr); void cui_fill_init(cui obj, cui parent, int x, int y, int w, int h, char *s, int attr); +int cui_fill_attr_get(cui obj); +void cui_fill_attr_set(cui obj, int attr); #endif diff -urN cui46/label.c cui47/label.c --- cui46/label.c 2014-01-31 01:10:00.000000000 +0900 +++ cui47/label.c 2014-01-31 22:20:00.000000000 +0900 @@ -48,6 +48,12 @@ if(visi) cui_show(obj); } +int +cui_label_attr_get(cui obj) +{ + return ((cui_label)obj)->attr; +} + void cui_label_attr_set(cui obj, int attr) { diff -urN cui46/label.h cui47/label.h --- cui46/label.h 2014-01-30 23:50:00.000000000 +0900 +++ cui47/label.h 2014-01-31 22:20:00.000000000 +0900 @@ -14,6 +14,7 @@ void cui_label_init(cui obj, cui parent, int x, int y, char *s); char *cui_label_str_get(cui obj); void cui_label_str_set(cui obj, char *s); +int cui_label_attr_get(cui obj); void cui_label_attr_set(cui obj, int attr); #endif diff -urN cui46/menu.c cui47/menu.c --- cui46/menu.c 1970-01-01 09:00:00.000000000 +0900 +++ cui47/menu.c 2014-01-31 22:20:00.000000000 +0900 @@ -0,0 +1,84 @@ +#include "menu.h" +#include "handler.h" +#include + +cui +cui_menu_btn_new(cui parent, int x, int y, char *s) +{ + cui obj = cui_alloc(sizeof(struct cui_menu_btn)); + cui_menu_btn_init(obj, parent, x, y, s); + return obj; +} + +void +cui_menu_btn_init(cui obj, cui parent, int x, int y, char *s) +{ + cui_button btn = (cui_button)obj; + + cui_button_init(obj, parent, x, y, s); + cui_bind(obj, CUI_EVT_DRAW, cui_menu_btn_hdr, NULL); + btn->lb1->flags |= CUI_FLG_HIDE; + + obj->flags |= CUI_FLG_HIDE; + cui_label_str_set(btn->lb3, "|"); + btn->lb2->x -= 1; + btn->lb3->x -= 1; + obj->w = 0; + cui_wh_fit(obj, obj->children); + cui_label_attr_set(btn->lb2, CUI_ATTR_ULINE); + cui_label_attr_set(btn->lb3, CUI_ATTR_ULINE); + obj->flags &= ~CUI_FLG_HIDE; +} + +int +cui_menu_btn_hdr(cui obj, int evt, int val, void *prm) +{ + cui_button btn = (cui_button)obj; + int attr = CUI_ATTR_ULINE; + if(val == CUI_DRAW_FOCUS) attr |= CUI_ATTR_REVERSE; + cui_label_attr_set(btn->lb2, attr); + cui_label_attr_set(btn->lb3, attr); + return TRUE; +} + +cui +cui_menu_item_new(cui parent, int x, int y, char *s) +{ + cui obj = cui_alloc(sizeof(struct cui_menu_item)); + cui_menu_item_init(obj, parent, x, y, s); + return obj; +} + +void +cui_menu_item_init(cui obj, cui parent, int x, int y, char *s) +{ + cui_button btn = (cui_button)obj; + cui_menu_item mn_item = (cui_menu_item)obj; + + 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); +} + +void +cui_menu_item_adj(cui obj) +{ + cui_button btn = (cui_button)obj; + cui_menu_item mn_item = (cui_menu_item)obj; + + btn->lb3->x = obj->w-1; + mn_item->fill->w = btn->lb3->x - cui_x2(btn->lb2); +} + +int +cui_menu_item_hdr(cui obj, int evt, int val, void *prm) +{ + cui_button btn = (cui_button)obj; + cui_menu_item mn_item = (cui_menu_item)obj; + + cui_menu_btn_hdr(obj, evt, val, prm); + cui_fill_attr_set(mn_item->fill, cui_label_attr_get(btn->lb2)); + return TRUE; +} + +/* EOF */ diff -urN cui46/menu.h cui47/menu.h --- cui46/menu.h 1970-01-01 09:00:00.000000000 +0900 +++ cui47/menu.h 2014-01-31 22:20:00.000000000 +0900 @@ -0,0 +1,25 @@ +#ifndef __MENU_H__ +#define __MENU_H__ + +#include "button.h" +#include "fill.h" + +typedef struct cui_menu_btn{ + struct cui_button button; +} *cui_menu_btn; + +typedef struct cui_menu_item{ + struct cui_menu_btn mn_btn; + cui fill; +} *cui_menu_item; + +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); + +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); + +#endif