diff -urN cui73/cui_test.c cui74/cui_test.c --- cui73/cui_test.c Mon Feb 10 01:00:00 2014 +++ cui74/cui_test.c Sun Feb 23 23:00:00 2014 @@ -261,6 +261,30 @@ } int +bs_hoge_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_DRAW */ + + struct cui_rect ar, br; + cui_rect a = &ar, b = &br, r; + cui_rects rs, ri; + int i; + char buf[4]; + + cui_rect_init(a, 2, 2, 10, 5); + cui_rect_init(b, 5, 5, 10, 5); + + rs = cui_rect_or(a, b); + for(ri=rs, i=0; ri; ri=ri->next, i++){ + sprintf(buf, "%d", i); + r = (cui_rect)ri; + cui_fill_rect(obj, r->x, r->y, r->w, r->h, buf, CUI_ATTR_NORMAL); + } + cui_rects_free(rs); + return TRUE; +} + +int main() { cui bs = cui_scpanel_new(NULL, 0, 0, 42, 23, "cui_test"); @@ -269,7 +293,7 @@ cui sc = cui_scbar_new(bs_bar, 1, 2, 20, 1, 30, 15); cui sc2 = cui_scbar_new(bs_bar, 1, 3, 20, 1, 10, 0); cui sc3 = cui_scbar_new(bs_bar, cui_x2(sc)+2, sc->y, 1, 16, 4, 2); - cui lb_hoge = cui_label_new(bs, 4, 4, "hoge sheet"); + cui bs_hoge = cui_base_new(bs, 1, 2, 50, 25); cui base = cui_base_new(bs, 1, 2, 40, 20); cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); cui etx = cui_etext_new(base, mn_btn->x, cui_y2(mn_btn), 8, "foo"); @@ -281,7 +305,7 @@ cui small = cui_scpanel_new(base, 2, 3, base->w - (2 * 2), base->h - (3 + 1), "title"); cui small2 = cui_scpanel_sheet_get(small); - cui tab_sheets[] = { base, bs_bar, lb_hoge }; + cui tab_sheets[] = { base, bs_bar, bs_hoge }; big_new(small2, 0, 0, &p); cui_wh_fit(small2); @@ -297,7 +321,9 @@ cui_bind(sc, CUI_EVT_BUTTON, sc_hdr, lb_bar); cui_bind(sc2, CUI_EVT_BUTTON, sc_hdr, lb_bar); cui_bind(sc3, CUI_EVT_BUTTON, sc_hdr, lb_bar); - cui_hide(lb_hoge); + + cui_bind(bs_hoge, CUI_EVT_DRAW, bs_hoge_hdr, NULL); + cui_hide(bs_hoge); cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", NULL}, tab_sheets, 0); diff -urN cui73/rect.c cui74/rect.c --- cui73/rect.c Thu Jan 30 23:00:00 2014 +++ cui74/rect.c Sun Feb 23 23:00:00 2014 @@ -1,4 +1,5 @@ #include "rect.h" +#include "cui.h" #include #include #include @@ -50,6 +51,200 @@ cui_rect_chk_empty(cui_rect r) { return r->w <= 0 || r->h <= 0; +} + +int +cui_rect_x2(cui_rect r) +{ + return r->x + r->w; +} + +int +cui_rect_y2(cui_rect r) +{ + return r->y + r->h; +} + +void +cui_rect_x1_set(cui_rect r, int x1) +{ + r->w += r->x - x1; + r->x = x1; +} + +void +cui_rect_y1_set(cui_rect r, int y1) +{ + r->h += r->y - y1; + r->y = y1; +} + +void +cui_rect_x2_set(cui_rect r, int x2) +{ + r->w = x2 - r->x; +} + +void +cui_rect_y2_set(cui_rect r, int y2) +{ + r->h = y2 - r->y; +} + +int +cui_rect_eq(cui_rect a, cui_rect b) +{ + return a->x == b->x && a->y == b->y && a->w == b->w && a->h == b->h; +} + +cui_rects +cui_rects_new(int x, int y, int w, int h, cui_rects next) +{ + cui_rects rs; + if((rs = malloc(sizeof(struct cui_rects))) == NULL) ERR("No Mem"); + cui_rects_init(rs, x, y, w, h, next); + return rs; +} + +cui_rects +cui_rects_new_rect(cui_rect r, cui_rects next) +{ + return cui_rects_new(r->x, r->y, r->w, r->h, next); +} + +void +cui_rects_init(cui_rects rs, int x, int y, int w, int h, cui_rects next) +{ + cui_rect r = (cui_rect)rs; + cui_rect_init(r, x, y, w, h); + rs->next = next; +} + +void +cui_rects_del_from(cui_rects rs, cui_rects *from) +{ + if(*from == NULL) return; + if(*from == rs){ + *from = rs->next; + rs->next = NULL; + return; + } + cui_rects_del_from(rs, &(*from)->next); +} + +void +cui_rects_free(cui_rects rs) +{ + if(rs == NULL) return; + cui_rects_free(rs->next); + free(rs); +} + +int +cui_rect_or_pat(cui_rect o, cui_rect i) +{ + int cnt_x = (o->x == i->x) + (cui_rect_x2(o) == cui_rect_x2(i)); + int cnt_y = (o->y == i->y) + (cui_rect_y2(o) == cui_rect_y2(i)); + int cnt = cnt_x + cnt_y; + switch(cnt){ + case 3: return 1; + case 1: return 4; + } + return cnt_x == cnt_y ? 3 : 2; +} + +cui_rects +cui_rect_or_div(cui_rect o, cui_rect i, int pat, cui_rects rs) +{ + cui_rect o2; + int cnt_x, div; + + switch(pat){ + case 1: + rs = cui_rects_new_rect(o, rs); + o = (cui_rect)rs; + if(o->x != i->x) cui_rect_x2_set(o, i->x); + else if(cui_rect_x2(o) != cui_rect_x2(i)) o->x = cui_rect_x2(i); + else if(o->y != i->y) cui_rect_y2_set(o, i->y); + else o->y = cui_rect_y2(i); /* o->y2 != i->y2 */ + break; + case 2: + rs = cui_rects_new_rect(o, rs); + o = (cui_rect)rs; + rs = cui_rects_new_rect(o, rs); + o2 = (cui_rect)rs; + + cnt_x = (o->x == o->x) + cui_rect_x2(o) == cui_rect_x2(i); + if(cnt_x){ + cui_rect_y2_set(o, i->y); + o2->y = cui_rect_y2(i); + }else{ + cui_rect_x2_set(o, i->x); + o2->x = cui_rect_x2(i); + } + break; + case -1: /* div */ + rs = cui_rects_new_rect(o, rs); + o = (cui_rect)rs; + rs = cui_rects_new_rect(o, rs); + o2 = (cui_rect)rs; + + if(o->y == i->y || cui_rect_y2(o) == cui_rect_y2(i)){ + div = o->y != i->y ? i->y : cui_rect_y2(i); + cui_rect_y2_set(o, div); + cui_rect_y1_set(o2, div); + }else{ /* o.x == i.x || o.x2 == i.x2 */ + div = o->x != i->x ? i->x : cui_rect_x2(i); + cui_rect_x2_set(o, div); + cui_rect_x1_set(o2, div); + } + break; + case 3: + rs = cui_rect_or_div(o, i, -1, rs); + o2 = (cui_rect)rs; + o = (cui_rect)rs->next; + if(o->y != i->y) o = o2; + cui_rects_del_from((cui_rects)o, &rs); + rs = cui_rect_or_div(o, i, 1, rs); + cui_rects_free((cui_rects)o); + break; + case 4: + rs = cui_rect_or_div(o, i, -1, rs); + o2 = (cui_rect)rs; + o = (cui_rect)rs->next; + if(o->y != i->y && o->x != i->x) o = o2; + cui_rects_del_from((cui_rects)o, &rs); + rs = cui_rect_or_div(o, i, 2, rs); + cui_rects_free((cui_rects)o); + break; + } + return rs; +} + +cui_rects +cui_rect_or(cui_rect a, cui_rect b) +{ + struct cui_rect recti; + cui_rect ri = (cui_rect)&recti, r, o; + int pat_a, pat_b, pat; + cui_rects rs = NULL; + + cui_rect_and(a, b, ri); + if(cui_rect_chk_empty(ri)){ + rs = cui_rects_new_rect(a, rs); + return cui_rects_new_rect(b, rs); + } + if(cui_rect_eq(a, ri)) return cui_rects_new_rect(b, rs); + if(cui_rect_eq(b, ri)) return cui_rects_new_rect(a, rs); + + pat_a = cui_rect_or_pat(a, ri); + pat_b = cui_rect_or_pat(b, ri); + + r = pat_a > pat_b ? a : b; + o = pat_a > pat_b ? b : a; + pat = pat_a > pat_b ? pat_b : pat_a; + rs = cui_rects_new_rect(r, rs); + return cui_rect_or_div(o, ri, pat, rs); } /* EOF */ diff -urN cui73/rect.h cui74/rect.h --- cui73/rect.h Thu Jan 30 23:00:00 2014 +++ cui74/rect.h Sun Feb 23 23:00:00 2014 @@ -5,10 +5,31 @@ int x, y, w, h; } *cui_rect; +typedef struct cui_rects *cui_rects; + +struct cui_rects{ + struct cui_rect r; + cui_rects next; +} ; + void cui_rect_init(cui_rect r, int x, int y, int w, int h); void cui_rect_wh_to_x2y2(cui_rect r); void cui_rect_x2y2_to_wh(cui_rect r); int cui_rect_and(cui_rect a, cui_rect b, cui_rect r); int cui_rect_chk_empty(cui_rect r); +int cui_rect_x2(cui_rect r); +int cui_rect_y2(cui_rect r); +void cui_rect_x1_set(cui_rect r, int x1); +void cui_rect_y1_set(cui_rect r, int y1); +void cui_rect_x2_set(cui_rect r, int x2); +void cui_rect_y2_set(cui_rect r, int y2); +int cui_rect_eq(cui_rect a, cui_rect b); + +cui_rects cui_rects_new(int x, int y, int w, int h, cui_rects next); +cui_rects cui_rects_new_rect(cui_rect r, cui_rects next); +void cui_rects_init(cui_rects rs, int x, int y, int w, int h, cui_rects next); +void cui_rects_del_from(cui_rects rs, cui_rects *from); +void cui_rects_free(cui_rects rs); +cui_rects cui_rect_or(cui_rect a, cui_rect b); #endif