diff -urN cui44/Makefile cui45/Makefile --- cui44/Makefile 2014-01-31 02:30:00.000000000 +0900 +++ cui45/Makefile 2014-01-31 22:00:00.000000000 +0900 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o dialog.o ckbox.o button.o fill.o label.o panel.o handler.o esc.o key.o rect.o +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 all: $(TARG) diff -urN cui44/cui.c cui45/cui.c --- cui44/cui.c 2014-01-31 02:40:00.000000000 +0900 +++ cui45/cui.c 2014-01-31 22:00:00.000000000 +0900 @@ -268,12 +268,33 @@ } void +cui_xy_set(cui obj, int x, int y) +{ + cui_xywh_set(obj, x, y, obj->w, obj->h); +} + +void cui_w_set(cui obj, int w) { cui_xywh_set(obj, obj->x, obj->y, w, obj->h); } void +cui_wh_set(cui obj, int w, int h) +{ + cui_xywh_set(obj, obj->x, obj->y, w, h); +} + +void +cui_wh_fit(cui obj, cui child) +{ + if(child == NULL) return; + if(obj->w < cui_x2(child)) obj->w = cui_x2(child); + if(obj->h < cui_y2(child)) obj->h = cui_y2(child); + cui_wh_fit(obj, child->next); +} + +void cui_quit(void) { cui_running_set(FALSE); diff -urN cui44/cui.h cui45/cui.h --- cui44/cui.h 2014-01-31 02:40:00.000000000 +0900 +++ cui45/cui.h 2014-01-31 22:00:00.000000000 +0900 @@ -59,7 +59,10 @@ int cui_is_visible_rect(cui obj); void cui_xywh_set(cui obj, int x, int y, int w, int h); void cui_x_set(cui obj, int x); +void cui_xy_set(cui obj, int x, int y); void cui_w_set(cui obj, int w); +void cui_wh_set(cui obj, int w, int h); +void cui_wh_fit(cui obj, cui child); cui cui_focus_get(void); void cui_focus_set(cui obj); diff -urN cui44/cui_test.c cui45/cui_test.c --- cui44/cui_test.c 2014-01-31 02:40:00.000000000 +0900 +++ cui45/cui_test.c 2014-01-31 22:00:00.000000000 +0900 @@ -6,6 +6,7 @@ #include "label.h" #include "button.h" #include "ckbox.h" +#include "radio.h" #include "dialog.h" int @@ -110,17 +111,67 @@ return base; } +int +radio_hdr(cui obj, int evt, int val, void *prm) +{ + char *s = cui_radio_str_get(obj); + if(!val) return TRUE; + if(strcmp(s, "ON") == 0) cui_show((cui)prm); + else if(strcmp(s, "OFF") == 0) cui_hide((cui)prm); + else{ + cui lb = obj->parent->parent->children; + cui_label_str_set(lb, (char *)prm); + } + return TRUE; +} + +cui +radio_new(cui parent, int x, int y) +{ + cui panel, lb, grp, rd_on, rd_off, base, grp2, rd[4], lb2; + + panel = cui_panel_new(parent, x, y, 0, 0); + lb = cui_label_new(panel, 1, 1, "Radio"); + grp = cui_base_new(panel, lb->x+2, cui_y2(lb), 0, 0); + rd_on = cui_radio_new(grp, 0, 0, "ON", 0); + rd_off = cui_radio_new(grp, cui_x2(rd_on)+1, rd_on->y, "OFF", 1); + cui_wh_fit(grp, grp->children); + + base = cui_base_new(panel, grp->x, cui_y2(grp), 0, 0); + grp2 = cui_base_new(base, 0, 0, 0, 0); + rd[0] = cui_radio_new(grp2, 0, 0, "ABC", 0); + rd[1] = cui_radio_new(grp2, 0, 1, "KBS", 0); + rd[2] = cui_radio_new(grp2, 0, 2, "MBS", 0); + rd[3] = cui_radio_new(grp2, 0, 3, "OBC", 0); + cui_wh_fit(grp2, grp2->children); + lb2 = cui_label_new(base, cui_x2(grp2)+2, 0, " kHz"); + cui_wh_fit(base, base->children); + base->flags |= CUI_FLG_HIDE; + + cui_wh_fit(panel, panel->children); + panel->w += 1; + panel->h += 1; + cui_panel_adj(panel); + + cui_bind(rd_on, CUI_EVT_BUTTON, radio_hdr, base); + cui_bind(rd_off, CUI_EVT_BUTTON, radio_hdr, base); + cui_bind(rd[0], CUI_EVT_BUTTON, radio_hdr, "1008 kHz"); + cui_bind(rd[1], CUI_EVT_BUTTON, radio_hdr, "1143 kHz"); + cui_bind(rd[2], CUI_EVT_BUTTON, radio_hdr, "1179 kHz"); + cui_bind(rd[3], CUI_EVT_BUTTON, radio_hdr, "1314 kHz"); + return panel; +} + 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_simple_dialog_new(base, cui_x2(dlg), dlg->y, "Continue ?", "Yes", "No"); + radio_new(base, cui_x2(dlg)+1, dlg->y); cui_simple_dialog_new(base, dlg->x, cui_y2(dlg), "How are you ?", "^_^", "T_T"); - cui_simple_dialog_new(base, cui_x2(dlg), cui_y2(dlg), "(A1) (B2)", "C3", "D4"); - base->w = dlg->w * 2; - base->h = dlg->h * 2; + cui_wh_fit(base, base->children); + cui_bind(p->btn1, CUI_EVT_BUTTON, my_hdr, p); *res_dlg = p; return base; diff -urN cui44/panel.c cui45/panel.c --- cui44/panel.c 2014-01-31 01:10:00.000000000 +0900 +++ cui45/panel.c 2014-01-31 22:00:00.000000000 +0900 @@ -12,16 +12,34 @@ void cui_panel_init(cui obj, cui parent, int x, int y, int w, int h) { + cui_panel p = (cui_panel)obj; cui_base_init(obj, parent, x, y, w, h); + p->fill[0] = cui_fill_new(obj, 0, 0, 0, 0, "-", CUI_ATTR_NORMAL); + p->fill[1] = cui_fill_new(obj, 0, 0, 0, 0, "-", CUI_ATTR_NORMAL); + p->fill[2] = cui_fill_new(obj, 0, 0, 0, 0, "|", CUI_ATTR_NORMAL); + p->fill[3] = cui_fill_new(obj, 0, 0, 0, 0, "|", CUI_ATTR_NORMAL); + p->fill[4] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); + p->fill[5] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); + p->fill[6] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); + p->fill[7] = cui_fill_new(obj, 0, 0, 0, 0, "+", CUI_ATTR_NORMAL); + cui_panel_adj(obj); +} - cui_fill_new(obj, 1, 0, w-2, 1, "-", CUI_ATTR_NORMAL); - cui_fill_new(obj, 1, h-1, w-2, 1, "-", CUI_ATTR_NORMAL); - cui_fill_new(obj, 0, 1, 1, h-2, "|", CUI_ATTR_NORMAL); - cui_fill_new(obj, w-1, 1, 1, h-2, "|", CUI_ATTR_NORMAL); - cui_fill_new(obj, 0, 0, 1, 1, "+", CUI_ATTR_NORMAL); - cui_fill_new(obj, w-1, 0, 1, 1, "+", CUI_ATTR_NORMAL); - cui_fill_new(obj, w-1, h-1, 1, 1, "+", CUI_ATTR_NORMAL); - cui_fill_new(obj, 0, h-1, 1, 1, "+", CUI_ATTR_NORMAL); +void +cui_panel_adj(cui obj) +{ + cui_panel p = (cui_panel)obj; + int visi = cui_is_visible(obj); + if(visi) obj->flags |= CUI_FLG_HIDE; + cui_xywh_set(p->fill[0], 1, 0, obj->w-2, 1); + cui_xywh_set(p->fill[1], 1, obj->h-1, obj->w-2, 1); + cui_xywh_set(p->fill[2], 0, 1, 1, obj->h-2); + cui_xywh_set(p->fill[3], obj->w-1, 1, 1, obj->h-2); + cui_xywh_set(p->fill[4], 0, 0, 1, 1); + cui_xywh_set(p->fill[5], obj->w-1, 0, 1, 1); + cui_xywh_set(p->fill[6], obj->w-1, obj->h-1, 1, 1); + cui_xywh_set(p->fill[7], 0, obj->h-1, 1, 1); + if(visi) obj->flags &= ~CUI_FLG_HIDE; } /* EOF */ diff -urN cui44/panel.h cui45/panel.h --- cui44/panel.h 2014-01-30 05:30:00.000000000 +0900 +++ cui45/panel.h 2014-01-31 22:00:00.000000000 +0900 @@ -5,9 +5,11 @@ typedef struct cui_panel{ struct cui_base base; + cui fill[8]; } *cui_panel; cui cui_panel_new(cui parent, int x, int y, int w, int h); void cui_panel_init(cui obj, cui parent, int x, int y, int w, int h); +void cui_panel_adj(cui obj); #endif diff -urN cui44/radio.c cui45/radio.c --- cui44/radio.c 1970-01-01 09:00:00.000000000 +0900 +++ cui45/radio.c 2014-01-31 22:00:00.000000000 +0900 @@ -0,0 +1,70 @@ +#include "radio.h" +#include "handler.h" +#include "key.h" +#include + +cui +cui_radio_new(cui parent, int x, int y, char *s, int v) +{ + cui obj = cui_alloc(sizeof(struct cui_radio)); + cui_radio_init(obj, parent, x, y, s, v); + return obj; +} + +void +cui_radio_toggle(cui obj) +{ + cui_ckbox ck = (cui_ckbox)obj; + + ck->v = !ck->v; + cui_label_str_set(ck->lb1, ck->v ? "(O) " : "( ) "); + cui_handler_call(obj, obj->handler_list, CUI_EVT_BUTTON, ck->v); +} + +cui +cui_radio_sel_get(cui obj) +{ + cui_ckbox ck = (cui_ckbox)obj; + if(obj == NULL) return NULL; + if(ck->v) return obj; + return cui_radio_sel_get(obj->next); +} + +int +cui_radio_hdr(cui obj, int evt, int val, void *prm) +{ + cui_ckbox ck = (cui_ckbox)obj; + cui old; + + if(val != CUI_KEY_ENTER) return FALSE; + if(ck->v) return TRUE; + old = cui_radio_sel_get(obj->parent->children); + if(old) cui_radio_toggle(old); + cui_radio_toggle(obj); + return TRUE; +} + +void +cui_radio_init(cui obj, cui parent, int x, int y, char *s, int v) +{ + cui_ckbox ck = (cui_ckbox)obj; + cui_ckbox_init(obj, parent, x, y, s, v); + obj->flags |= CUI_FLG_HIDE; + cui_label_str_set(ck->lb1, v ? "(O) " : "( ) "); + obj->flags &= ~CUI_FLG_HIDE; + cui_bind(obj, CUI_EVT_KEY, cui_radio_hdr, NULL); +} + +char * +cui_radio_str_get(cui obj) +{ + return cui_ckbox_str_get(obj); +} + +void +cui_radio_str_set(cui obj, char *s) +{ + cui_ckbox_str_set(obj, s); +} + +/* EOF */ diff -urN cui44/radio.h cui45/radio.h --- cui44/radio.h 1970-01-01 09:00:00.000000000 +0900 +++ cui45/radio.h 2014-01-31 22:00:00.000000000 +0900 @@ -0,0 +1,19 @@ +#ifndef __RADIO_H__ +#define __RADIO_H__ + +#include "ckbox.h" + +typedef struct cui_radio{ + struct cui_ckbox ckbox; +} *cui_radio; + +cui cui_radio_new(cui parent, int x, int y, char *s, int v); +void cui_radio_toggle(cui obj); +cui cui_radio_sel_get(cui obj); +int cui_radio_hdr(cui obj, int evt, int val, void *prm); +void cui_radio_init(cui obj, cui parent, int x, int y, char *s, int v); +char *cui_radio_str_get(cui obj); +void cui_radio_str_set(cui obj, char *s); + + +#endif