diff -urN cui118/Makefile cui119/Makefile --- cui118/Makefile Thu Apr 17 22:00:00 2014 +++ cui119/Makefile Fri Apr 18 22:00:00 2014 @@ -7,7 +7,7 @@ endif TARG = cui_test cui_srv -OBJS = cui.o arg.o readable.o select.o sock.o focus.o num.o etext.o menu.o dialog.o timer.o term.o scpanel.o tbar.o rszbox.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 dbg.o list.o +OBJS = cui.o arg.o readable.o select.o sock.o focus.o num.o etext.o menu.o dialog.o timer.o term.o scline.o scpanel.o tbar.o rszbox.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 dbg.o list.o all: $(TARG) diff -urN cui118/cui_test.c cui119/cui_test.c --- cui118/cui_test.c Thu Apr 17 22:00:00 2014 +++ cui119/cui_test.c Fri Apr 18 22:00:00 2014 @@ -17,6 +17,7 @@ #include "fillbtn.h" #include "scbar.h" #include "scpanel.h" +#include "scline.h" #include "term.h" #include "timer.h" #include "num.h" @@ -86,6 +87,7 @@ cui_y_set(obj, obj->y + 1); sprintf(buf, "%d", cui_gy(obj)); cui_label_str_set((cui)prm, buf); + cui_handler_call((cui)prm, CUI_EVT_RESIZE, TRUE); return TRUE; } @@ -218,6 +220,7 @@ cui item = cui_index_to_child(obj, val); char *s = cui_menu_item_str_get(item); cui_label_str_set((cui)prm, s); + cui_handler_call((cui)prm, CUI_EVT_RESIZE, TRUE); } cui_quit(); return TRUE; @@ -241,12 +244,22 @@ } int +mv_lb_hdr(cui obj, int evt, int val, void *prm) +{ + /* CUI_EVT_RESIZE */ + cui scl = (cui)prm; + cui_w_set(scl, obj->w); + return TRUE; +} + +int etx_hdr(cui obj, int evt, int val, void *prm) { static char buf[CUI_ETEXT_BSIZE * 2]; sprintf(buf, "'%s'", cui_etext_str_get(obj)); cui_label_str_set((cui)prm, buf); + cui_handler_call((cui)prm, CUI_EVT_RESIZE, TRUE); return TRUE; } @@ -450,7 +463,8 @@ cui etx = cui_etext_new(base, mn_btn->x, cui_y2(mn_btn), 8, "foo"); 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, ""); + cui scl = cui_scline_new(base, cui_x2(mv_btn) + 2, mv_btn->y, 0); + cui mv_lb = cui_label_new(cui_scline_view_get(scl), 0, 0, ""); cui_simple_dialog p; cui small = cui_scpanel_new(base, 2, 3, base->w - (2 * 2), base->h - (3 + 1), "title"); @@ -469,6 +483,9 @@ cui_bind(etx, CUI_EVT_BUTTON, etx_hdr, mv_lb); cui_bind(ck, CUI_EVT_BUTTON, my_hdr2, small); cui_bind(mv_btn, CUI_EVT_BUTTON, mv_hdr, mv_lb); + + cui_scline_sheet_set(scl, mv_lb); + cui_bind(mv_lb, CUI_EVT_RESIZE, mv_lb_hdr, scl); cui_hide(bs_bar); cui_wh_fit(bs_bar); diff -urN cui118/scline.c cui119/scline.c --- cui118/scline.c Thu Jan 1 09:00:00 1970 +++ cui119/scline.c Fri Apr 18 22:00:00 2014 @@ -0,0 +1,186 @@ +#include "scline.h" +#include "fillbtn.h" +#include "handler.h" +#include +#include +#include + +cui +cui_scline_new(cui parent, int x, int y, int w) +{ + cui obj = cui_alloc(sizeof(struct cui_scline)); + cui_scline_init(obj, parent, x, y, w); + return obj; +} + +static int +lx(cui obj) +{ + cui_scline p = (cui_scline)obj; + return p->sheet ? cui_lx(obj, cui_gx(p->sheet)) : 0; +} + +static int +lx2(cui obj) +{ + cui_scline p = (cui_scline)obj; + return p->sheet ? lx(obj) + p->sheet->w : 0; +} + +static int +onoff_get(cui obj, int sign) +{ + cui_scline p = (cui_scline)obj; + return sign < 0 ? + !(p->dec->flags & CUI_FLG_HIDE) : + !(p->inc->flags & CUI_FLG_HIDE); +} + +static void +onoff_set(cui obj, int sign, int v) +{ + cui_scline p = (cui_scline)obj; + + if(onoff_get(obj, sign) == v) return; + if(v){ + if(sign < 0){ + cui_x_set(p->view, p->view->x + 1); + cui_w_set(p->view, p->view->w - 1); + if(p->sheet) cui_x_set(p->sheet, p->sheet->x - 1); + }else{ + cui_w_set(p->view, p->view->w - 1); + } + cui_show(sign < 0 ? p->dec : p->inc); + }else{ + cui_hide(sign < 0 ? p->dec : p->inc); + if(sign < 0){ + if(p->sheet) cui_x_set(p->sheet, p->sheet->x + 1); + cui_w_set(p->view, p->view->w + 1); + cui_x_set(p->view, p->view->x - 1); + }else{ + cui_w_set(p->view, p->view->w +1); + } + } +} + +static void +adj(cui obj) +{ + cui_scline p = (cui_scline)obj; + + if(p->sheet == NULL) return; + if(p->sheet->w <= obj->w){ + onoff_set(obj, -1, FALSE); + onoff_set(obj, 1, FALSE); + cui_x_set(p->sheet, 0); + return; + } + if(lx(obj) >= 0){ + onoff_set(obj, -1, FALSE); + onoff_set(obj, 1, TRUE); + cui_x_set(p->sheet, 0); + }else if(lx2(obj) <= obj->w){ + onoff_set(obj, 1, FALSE); + onoff_set(obj, -1, TRUE); + cui_x_set(p->sheet, p->view->w - p->sheet->w); + }else{ + onoff_set(obj, -1, TRUE); + onoff_set(obj, 1, TRUE); + } +} + +void +cui_scline_init(cui obj, cui parent, int x, int y, int w) +{ + cui_scline p = (cui_scline)obj; + + cui_base_init(obj, parent, x, y, w, 1); + + p->dec = cui_fillbtn_new(obj, 0, 0, 1, 1, "<"); + cui_hide(p->dec); + + p->inc = cui_fillbtn_new(obj, w-1, 0, 1, 1, ">"); + cui_hide(p->inc); + + p->view = cui_base_new(obj, 0, 0, w, 1); + p->sheet = NULL; + + cui_bind(p->dec, CUI_EVT_BUTTON, cui_scline_hdr, p); + cui_bind(p->inc, CUI_EVT_BUTTON, cui_scline_hdr, p); + cui_bind(obj, CUI_EVT_RESIZE, cui_scline_hdr, p); + + p->step_cb = NULL; + p->step_prm = NULL; +} + +int +cui_scline_hdr(cui obj, int evt, int val, void *prm) +{ + cui ev_obj = obj; + cui_scline p = (cui_scline)prm; + int step, bak; + + obj = (cui)p; + + switch(evt){ + case CUI_EVT_RESIZE: + bak = cui_hide_enter(obj); + if(cui_x2(obj) > obj->parent->w) cui_w_set(obj, obj->parent->w - obj->x); + cui_x_set(p->inc, obj->w - 1); + cui_w_set(p->view, obj->w - onoff_get(obj, -1) - onoff_get(obj, 1)); + adj(obj); + cui_hide_exit(obj, bak); + break; + case CUI_EVT_BUTTON: + if(ev_obj == p->dec){ + if(lx(obj) < 0){ + step = p->step_cb ? (*p->step_cb)(-1, p->step_prm) : 1; + if(p->sheet) cui_x_set(p->sheet, p->sheet->x + step); + } + if(lx(obj) == 0) onoff_set(obj, -1, FALSE); + adj(obj); + }else if(ev_obj == p->inc){ + if(lx2(obj) > obj->w){ + step = p->step_cb ? (*p->step_cb)(1, p->step_prm) : 1; + if(p->sheet) cui_x_set(p->sheet, p->sheet->x - step); + } + if(lx2(obj) == obj->w) onoff_set(obj, 1, FALSE); + adj(obj); + }else return FALSE; + break; + default: + return FALSE; + } + return TRUE; +} + +cui +cui_scline_view_get(cui obj) +{ + cui_scline p = (cui_scline)obj; + return p->view; +} + +void +cui_scline_sheet_set(cui obj, cui sheet) +{ + cui_scline p = (cui_scline)obj; + p->sheet = sheet; +} + +cui +cui_scline_sheet_get(cui obj) +{ + cui_scline p = (cui_scline)obj; + return p->sheet; +} + +void +cui_scline_step_set(cui obj, int (*step_cb)(int, void *), void *step_prm) +{ + cui_scline p = (cui_scline)obj; + p->step_cb = step_cb; + p->step_prm = step_prm; +} + +/* EOF */ diff -urN cui118/scline.h cui119/scline.h --- cui118/scline.h Thu Jan 1 09:00:00 1970 +++ cui119/scline.h Fri Apr 18 22:00:00 2014 @@ -0,0 +1,25 @@ +#ifndef __SC_LINE_H__ +#define __SC_LINE_H__ + +#include "cui.h" + +typedef struct cui_scline{ + struct cui_base base; + cui view, sheet; + cui dec, inc; + + int (*step_cb)(int sign, void *); /* sign : dec=-1 , inc=1 */ + void *step_prm; +} *cui_scline; + +cui cui_scline_new(cui parent, int x, int y, int w); +void cui_scline_init(cui obj, cui parent, int x, int y, int w); +int cui_scline_hdr(cui obj, int evt, int val, void *prm); + +cui cui_scline_view_get(cui obj); +void cui_scline_sheet_set(cui obj, cui sheet); +cui cui_scline_sheet_get(cui obj); + +void cui_scline_step_set(cui obj, int (*step_cb)(int, void *), void *step_prm); + +#endif