diff -urN cui62/Makefile cui63/Makefile --- cui62/Makefile 2014-02-03 00:00:00.000000000 +0900 +++ cui63/Makefile 2014-02-03 01:00:00.000000000 +0900 @@ -1,7 +1,7 @@ CC = gcc -Wall TARG = cui_test -OBJS = cui.o focus.o etext.o menu.o dialog.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o +OBJS = cui.o focus.o etext.o menu.o dialog.o scbar.o fillbtn.o tab.o radio.o ckbox.o button.o lblfix.o fill.o label.o panel.o handler.o esc.o key.o rect.o all: $(TARG) diff -urN cui62/cui_test.c cui63/cui_test.c --- cui62/cui_test.c 2014-02-03 00:00:00.000000000 +0900 +++ cui63/cui_test.c 2014-02-03 01:00:00.000000000 +0900 @@ -13,6 +13,7 @@ #include "etext.h" #include "tab.h" #include "fillbtn.h" +#include "scbar.h" int joke_hdr(cui obj, int evt, int val, void *prm) @@ -277,14 +278,13 @@ } int -fb_hdr(cui obj, int evt, int val, void *prm) +sc_hdr(cui obj, int evt, int val, void *prm) { cui lb = (cui)prm; - static char buf[8]; - static int cnt = 0; + static char buf[16]; - usleep(100*1000); - sprintf(buf, "%d", cnt++); + usleep(50*1000); + sprintf(buf, "%d", val); cui_label_str_set(lb, buf); return TRUE; } @@ -295,7 +295,8 @@ cui bs = cui_panel_new(NULL, 0, 0, 42, 23); cui bs_bar = cui_base_new(bs, 1, 2, 0, 0); cui lb_bar = cui_label_new(bs_bar, 1, 1, "bar"); - cui fb = cui_fillbtn_new(bs_bar, 1, 2, 4, 4, "+"); + 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 lb_hoge = cui_label_new(bs, 4, 4, "hoge sheet"); cui base = cui_panel_new(bs, 1, 2, 40, 20); cui mn_btn = cui_menu_btn_new(base, 1, 1, "File"); @@ -319,7 +320,8 @@ cui_hide(bs_bar); cui_wh_fit(bs_bar); - cui_bind(fb, CUI_EVT_BUTTON, fb_hdr, lb_bar); + cui_bind(sc, CUI_EVT_BUTTON, sc_hdr, lb_bar); + cui_bind(sc2, CUI_EVT_BUTTON, sc_hdr, lb_bar); cui_hide(lb_hoge); cui_tab_new(bs, 1, 1, -1, (char *[]){"foo", "bar", "hoge", NULL}, (cui []){base, bs_bar, lb_hoge}, 0); diff -urN cui62/fillbtn.c cui63/fillbtn.c --- cui62/fillbtn.c 2014-02-03 00:00:00.000000000 +0900 +++ cui63/fillbtn.c 2014-02-03 01:00:00.000000000 +0900 @@ -45,4 +45,26 @@ return FALSE; } +void +cui_fillbtn_wh_set(cui obj, int w, int h) +{ + cui_fillbtn p = (cui_fillbtn)obj; + int bak = cui_hide_enter(obj); + cui_wh_set(obj, w, h); + cui_wh_set(p->fill, w, h); + cui_hide_exit(obj, bak); +} + +void +cui_fillbtn_w_set(cui obj, int w) +{ + cui_fillbtn_wh_set(obj, w, obj->h); +} + +void +cui_fillbtn_h_set(cui obj, int h) +{ + cui_fillbtn_wh_set(obj, obj->w, h); +} + /* EOF */ diff -urN cui62/fillbtn.h cui63/fillbtn.h --- cui62/fillbtn.h 2014-02-03 00:00:00.000000000 +0900 +++ cui63/fillbtn.h 2014-02-03 01:00:00.000000000 +0900 @@ -14,4 +14,8 @@ void cui_fillbtn_init(cui obj, cui parent, int x, int y, int w, int h, char *s); int cui_fillbtn_hdr(cui obj, int evt, int val, void *prm); +void cui_fillbtn_wh_set(cui obj, int w, int h); +void cui_fillbtn_w_set(cui obj, int w); +void cui_fillbtn_h_set(cui obj, int h); + #endif diff -urN cui62/scbar.c cui63/scbar.c --- cui62/scbar.c 1970-01-01 09:00:00.000000000 +0900 +++ cui63/scbar.c 2014-02-03 01:00:00.000000000 +0900 @@ -0,0 +1,157 @@ +#include "scbar.h" +#include "handler.h" +#include + +cui +cui_scbar_new(cui parent, int x, int y, int w, int h, int max_v, int v) +{ + cui obj = cui_alloc(sizeof(struct cui_scbar)); + cui_scbar_init(obj, parent, x, y, w, h, max_v, v); + return obj; +} + +int +cui_scbar_pg_len(cui obj) +{ + cui_scbar p = (cui_scbar)obj; + return p->hv == CUI_SCBAR_H ? obj->w : obj->h; +} + +int +cui_scbar_thumb_len(cui obj) +{ + cui_scbar p = (cui_scbar)obj; + int len = cui_scbar_pg_len(obj) - (2 + p->max_v); + return len < 1 ? 1 : len; +} + +int +cui_scbar_thumb_pos(cui obj) +{ + cui_scbar p = (cui_scbar)obj; + int len = cui_scbar_pg_len(obj) - (2 + cui_scbar_thumb_len(obj)); + return len * p->v / p->max_v; +} + +void +cui_scbar_init(cui obj, cui parent, int x, int y, int w, int h, int max_v, int v) +{ + cui_scbar p = (cui_scbar)obj; + int pos, len; + + cui_base_init(obj, parent, x, y, w, h); + p->hv = (w >= h) ? CUI_SCBAR_H : CUI_SCBAR_V; + p->max_v = max_v; + p->v = v; + pos = cui_scbar_thumb_pos(obj); + len = cui_scbar_thumb_len(obj); + if(p->hv == CUI_SCBAR_H){ + obj->h = 1; + p->dec = cui_fillbtn_new(obj, 0, 0, 1, 1, "|"); + p->dec_pg = cui_fillbtn_new(obj, 1, 0, pos, 1, "-"); + p->thumb = cui_fillbtn_new(obj, cui_x2(p->dec_pg), 0, len, 1, "="); + p->inc_pg = cui_fillbtn_new(obj, cui_x2(p->thumb), 0, obj->w-1 - cui_x2(p->thumb), 1, "-"); + p->inc = cui_fillbtn_new(obj, cui_x2(p->inc_pg), 0, 1, 1, "|"); + }else{ + obj->w = 1; + p->dec = cui_fillbtn_new(obj, 0, 0, 1, 1, "-"); + p->dec_pg = cui_fillbtn_new(obj, 0, 1, 1, pos, "|"); + p->thumb = cui_fillbtn_new(obj, 0, cui_y2(p->dec_pg), 1, len, "="); + p->inc_pg = cui_fillbtn_new(obj, 0, cui_y2(p->thumb), 1, obj->h-1 - cui_y2(p->thumb), "|"); + p->inc = cui_fillbtn_new(obj, 0, cui_y2(p->inc_pg), 1, 1, "-"); + } + cui_bind(p->dec, CUI_EVT_BUTTON, cui_scbar_btn_hdr, obj); + cui_bind(p->dec_pg, CUI_EVT_BUTTON, cui_scbar_btn_hdr, obj); + cui_bind(p->thumb, CUI_EVT_BUTTON, cui_scbar_btn_hdr, obj); + cui_bind(p->inc_pg, CUI_EVT_BUTTON, cui_scbar_btn_hdr, obj); + cui_bind(p->inc, CUI_EVT_BUTTON, cui_scbar_btn_hdr, obj); + + cui_bind(obj, CUI_EVT_DRAW, cui_scbar_hdr, NULL); +} + +int +cui_scbar_btn_hdr(cui fb, int evt, int val, void *prm) +{ + cui obj = (cui)prm; + cui_scbar p = (cui_scbar)obj; + + if(fb == p->dec){ + if(p->v > 0){ + p->v--; + cui_draw(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + }else if(fb == p->inc){ + if(p->v < p->max_v){ + p->v++; + cui_draw(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + }else if(fb == p->dec_pg){ + if(p->v > 0){ + p->v -= cui_scbar_pg_len(obj); + if(p->v < 0) p->v = 0; + cui_draw(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + }else if(fb == p->inc_pg){ + if(p->v < p->max_v){ + p->v += cui_scbar_pg_len(obj); + if(p->v > p->max_v) p->v = p->max_v; + cui_draw(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + }else{ /* fb == p->thumb */ + + } + return TRUE; +} + +int +cui_scbar_hdr(cui obj, int evt, int val, void *prm) +{ + /* evt == CUI_EVT_DRAW */ + + cui_scbar p = (cui_scbar)obj; + int pos = cui_scbar_thumb_pos(obj); + int len = cui_scbar_thumb_len(obj); + int bak; + + if(p->hv == CUI_SCBAR_H){ + bak = cui_hide_enter(p->dec_pg); + cui_fillbtn_w_set(p->dec_pg, pos); + cui_hide_exit(p->dec_pg, bak); + + bak = cui_hide_enter(p->thumb); + cui_x_set(p->thumb, cui_x2(p->dec_pg)); + cui_fillbtn_w_set(p->thumb, len); + cui_hide_exit(p->thumb, bak); + + bak = cui_hide_enter(p->inc_pg); + cui_x_set(p->inc_pg, cui_x2(p->thumb)); + cui_fillbtn_w_set(p->inc_pg, obj->w-1 - cui_x2(p->thumb)); + cui_hide_exit(p->inc_pg, bak); + + cui_x_set(p->inc, obj->w-1); + }else{ + + } + return TRUE; +} + +int +cui_scbar_val_get(cui obj) +{ + cui_scbar p = (cui_scbar)obj; + return p->v; +} + +void +cui_scbar_val_set(cui obj, int v) +{ + cui_scbar p = (cui_scbar)obj; + p->v = v; + cui_draw(obj); +} + +/* EOF */ diff -urN cui62/scbar.h cui63/scbar.h --- cui62/scbar.h 1970-01-01 09:00:00.000000000 +0900 +++ cui63/scbar.h 2014-02-03 01:00:00.000000000 +0900 @@ -0,0 +1,23 @@ +#ifndef __SCBAR_H__ +#define __SCBAR_H__ + +#include "fillbtn.h" + +#define CUI_SCBAR_H 0 +#define CUI_SCBAR_V 1 + +typedef struct cui_scbar{ + struct cui_base base; + int hv; /* CUI_SCBAR_H or CUI_SCBAR_V */ + int max_v, v; + cui dec, dec_pg, thumb, inc_pg, inc; +} *cui_scbar; + +cui cui_scbar_new(cui parent, int x, int y, int w, int h, int max_v, int v); +void cui_scbar_init(cui obj, cui parent, int x, int y, int w, int h, int max_v, int v); +int cui_scbar_btn_hdr(cui fb, int evt, int val, void *prm); +int cui_scbar_hdr(cui obj, int evt, int val, void *prm); +int cui_scbar_val_get(cui obj); +void cui_scbar_val_set(cui obj, int v); + +#endif