diff -urN cui64/scbar.c cui65/scbar.c --- cui64/scbar.c Fri Feb 7 22:00:00 2014 +++ cui65/scbar.c Sat Feb 8 22:00:00 2014 @@ -1,5 +1,6 @@ #include "scbar.h" #include "handler.h" +#include "key.h" #include cui @@ -26,11 +27,27 @@ } int +cui_scbar_thumb_pos_max(cui obj) +{ + return cui_scbar_pg_len(obj) - (2 + cui_scbar_thumb_len(obj)); +} + +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; + int pos_max = cui_scbar_thumb_pos_max(obj); + int add100 = 100 * p->max_v * (pos_max + 1) / pos_max - 100 * p->max_v; + return p->v * (pos_max +1) * 100 / (p->max_v*100 + add100); +} + +int +cui_scbar_thumb_pos_to_val(cui obj, int pos) +{ + cui_scbar p = (cui_scbar)obj; + int pos_max = cui_scbar_thumb_pos_max(obj); + int add100 = 100 * p->max_v * (pos_max + 1) / pos_max - 100 * p->max_v; + return (pos * (p->max_v*100 + add100) * 2 + (p->max_v*100 + add100)) / ((pos_max + 1) * 100 * 2); } void @@ -60,12 +77,16 @@ 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, "-"); } + p->thumb_drag = FALSE; + 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(p->thumb, CUI_EVT_KEY, cui_scbar_thumb_hdr, obj); + cui_bind(obj, CUI_EVT_DRAW, cui_scbar_hdr, NULL); } @@ -102,8 +123,71 @@ cui_handler_call(obj, CUI_EVT_BUTTON, p->v); } }else{ /* fb == p->thumb */ + if(0 <= val && val <= p->max_v){ + p->v = val; + cui_draw(obj); + cui_handler_call(obj, CUI_EVT_BUTTON, p->v); + } + } + return TRUE; +} + +int +cui_scbar_thumb_hdr(cui fb, int evt, int val, void *prm) +{ + cui obj = (cui)prm; + cui_scbar p = (cui_scbar)obj; + cui_fillbtn fillbtn = (cui_fillbtn)fb; + int pos, pos_max; + + /* evt == CUI_EVT_KEY */ + if(!p->thumb_drag){ + if(val != CUI_KEY_ENTER) return FALSE; + p->thumb_drag = TRUE; + p->bak = p->v; + fillbtn->v = TRUE; + cui_draw(obj); + return TRUE; } + + /* p->thumb_drag */ + + pos_max = cui_scbar_thumb_pos_max(obj); + + switch(val){ + case CUI_KEY_ESC: + if(p->v != p->bak) cui_handler_call(fb, CUI_EVT_BUTTON, p->bak); + case CUI_KEY_ENTER: + p->thumb_drag = FALSE; + fillbtn->v = FALSE; + cui_draw(obj); + break; + case CUI_KEY_UP: + if(p->hv == CUI_SCBAR_V){ + pos = fb->y - 1; + if(pos > 0) cui_handler_call(fb, CUI_EVT_BUTTON, cui_scbar_thumb_pos_to_val(obj, pos-1)); + } + break; + case CUI_KEY_DOWN: + if(p->hv == CUI_SCBAR_V){ + pos = fb->y - 1; + if(pos < pos_max) cui_handler_call(fb, CUI_EVT_BUTTON, cui_scbar_thumb_pos_to_val(obj, pos+1)); + } + break; + case CUI_KEY_LEFT: + if(p->hv == CUI_SCBAR_H){ + pos = fb->x - 1; + if(pos > 0) cui_handler_call(fb, CUI_EVT_BUTTON, cui_scbar_thumb_pos_to_val(obj, pos-1)); + } + break; + case CUI_KEY_RIGHT: + if(p->hv == CUI_SCBAR_H){ + pos = fb->x - 1; + if(pos < pos_max) cui_handler_call(fb, CUI_EVT_BUTTON, cui_scbar_thumb_pos_to_val(obj, pos+1)); + } + break; + } return TRUE; } diff -urN cui64/scbar.h cui65/scbar.h --- cui64/scbar.h Mon Feb 3 01:00:00 2014 +++ cui65/scbar.h Sat Feb 8 22:00:00 2014 @@ -11,11 +11,14 @@ int hv; /* CUI_SCBAR_H or CUI_SCBAR_V */ int max_v, v; cui dec, dec_pg, thumb, inc_pg, inc; + int thumb_drag; + int bak; } *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_thumb_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);