hschumann2/TempleOS-Source-Code
0847
1 2#define BTTN_BORDER 23 4#define BTF_DONT_FREE 15 6class CCtrlBttnState7{8 I64 state,num_states,flags;9 U8 *state_texts;10 CColorROPU32 *state_colors;11};12 13U0 DrawCtrlBttn(CDC *dc,CCtrl *c)14{15 CCtrlBttnState *s=c->state;16 I64 l;17 U8 *st;18 19 dc->color=BLACK;20 GrRect(dc,c->left,c->top,c->right-c->left+1,c->bottom-c->top+1);21 if (!(st=LstSub(s->state,s->state_texts)))22 st=s->state_texts;23 dc->color=s->state_colors[s->state];24 l=StrLen(st);25 GrRect(dc,c->left+BTTN_BORDER,c->top+BTTN_BORDER,26 c->right-c->left+1-BTTN_BORDER*2,27 c->bottom-c->top+1-BTTN_BORDER*2);28 dc->color=s->state_colors[s->state]^(WHITE<<16+WHITE);29 GrPrint(dc,(c->left+c->right+1-l*FONT_WIDTH)>>1,30 (c->top+c->bottom+1-FONT_HEIGHT)>>1,"%s",st);31}32 33U0 LeftClickCtrlBttn(CCtrl *c,I64,I64,Bool down)34{35 CCtrlBttnState *s=c->state;36 if (down) {37 s->state++;38 if (s->state==s->num_states)39 s->state=0;40 }41}42 43public CCtrl *CtrlBttnNew(I64 x,I64 y,I64 width=-1,I64 height=-1,44 I64 num_states=1,U8 *state_texts,45 I32 *state_colors,CCtrlBttnState *_s=NULL)46{//Create bttn ctrl. See ::/Apps/Strut/Strut.HC.47 CCtrl *res;48 CCtrlBttnState *s;49 I64 i,j,l;50 U8 *st;51 if (width<0) {52 l=1;53 for (i=0;i<num_states;i++)54 if (st=LstSub(i,state_texts)) {55 j=StrLen(st);56 if (j>l) l=j;57 }58 width=BTTN_BORDER*4+l*FONT_WIDTH;59 }60 if (height<0) height=BTTN_BORDER*4+FONT_HEIGHT;61 res=CAlloc(sizeof(CCtrl));62 if (_s) {63 s=_s;64 MemSet(s,0,sizeof(CCtrlBttnState));65 } else {66 s=CAlloc(sizeof(CCtrlBttnState));67 s->flags=BTF_DONT_FREE;68 }69 s->num_states=num_states;70 s->state_texts=state_texts;71 s->state_colors=state_colors;72 res->win_task=Fs;73 res->flags=CTRLF_SHOW;74 res->type=CTRLT_GENERIC;75 res->state=s;76 res->draw_it=&DrawCtrlBttn;77 res->left_click=&LeftClickCtrlBttn;78 res->left=x;79 res->top=y;80 res->right=res->left+width-1;81 res->bottom=res->top+height-1;82 QueIns(res,Fs->last_ctrl);83 return res;84}85 86public U0 CtrlBttnDel(CCtrl *c)87{//Free bttn ctrl.88 QueRem(c);89 if (!(c->flags&BTF_DONT_FREE))90 Free(c->state);91 Free(c);92}93 