#define TEMPO_SPACING 15 #define TEMPO_RANGE 80 #define TEMPO_BORDER 2 class TempoState { I64 tempo,stacatto; } tempo_state; U0 DrawTempoCtrl(CDC *dc,CCtrl *c) { TempoState *s=c->state; dc->color=LTGREEN; GrRect(dc, c->left,c->top,TEMPO_SPACING*3+2,TEMPO_SPACING*2+TEMPO_RANGE); dc->color=BLACK; GrRect(dc, c->left+TEMPO_BORDER,c->top+TEMPO_BORDER, TEMPO_SPACING*3+2-2*TEMPO_BORDER, TEMPO_SPACING*2+TEMPO_RANGE-2*TEMPO_BORDER); dc->color=WHITE; GrLine(dc,c->left+TEMPO_SPACING,c->top+TEMPO_SPACING, c->left+TEMPO_SPACING,c->top+TEMPO_SPACING+TEMPO_RANGE-1); GrLine(dc,c->left+2*TEMPO_SPACING+1,c->top+TEMPO_SPACING, c->left+2*TEMPO_SPACING+1,c->top+TEMPO_SPACING+TEMPO_RANGE-1); dc->color=LTGREEN; GrPrint(dc,c->left+TEMPO_SPACING-FONT_WIDTH/2, c->top+TEMPO_SPACING+TEMPO_RANGE+3,"%d",s->tempo*10/TEMPO_RANGE); GrPrint(dc,c->left+2*TEMPO_SPACING+1-FONT_WIDTH/2, c->top+TEMPO_SPACING+TEMPO_RANGE+3,"%d", s->stacatto*10/TEMPO_RANGE); GrRect(dc,c->left+TEMPO_SPACING-3, c->top+TEMPO_SPACING+TEMPO_RANGE-1-s->tempo-2,7,5); GrRect(dc,c->left+2*TEMPO_SPACING+1-3, c->top+TEMPO_SPACING+TEMPO_RANGE-1-s->stacatto-2,7,5); dc->color=YELLOW; GrRect(dc,c->left+TEMPO_SPACING-2, c->top+TEMPO_SPACING+TEMPO_RANGE-1-s->tempo-1,5,3); GrRect(dc,c->left+2*TEMPO_SPACING+1-2, c->top+TEMPO_SPACING+TEMPO_RANGE-1-s->stacatto-1,5,3); dc->color=GREEN; GrVPrint(dc,c->left+TEMPO_BORDER+2,c->top+TEMPO_SPACING+2,"Tempo"); GrVPrint(dc,c->right-TEMPO_BORDER-2-FONT_WIDTH, c->top+TEMPO_SPACING+2,"Stacatto"); } U0 UpdateDerivedTempoCtrl(CCtrl *c) { TempoState *s=c->state; c->right=c->left+TEMPO_SPACING*3+2; c->bottom=c->top+TEMPO_SPACING*2+TEMPO_RANGE; s->tempo =ClampI64(s->tempo,0,TEMPO_RANGE-1); s->stacatto=ClampI64(s->stacatto,0,TEMPO_RANGE-1); } U0 LeftClickTempo(CCtrl *c,I64 x,I64 y,Bool) { TempoState *s=c->state; if (x<(c->right+c->left)/2) s->tempo=TEMPO_RANGE-1-(y-(c->top+TEMPO_SPACING)); else s->stacatto=TEMPO_RANGE-1-(y-(c->top+TEMPO_SPACING)); if (c->update_derived_vals) (*c->update_derived_vals)(c); } CCtrl *TempoNew() { CCtrl *c=CAlloc(sizeof(CCtrl)); c->win_task=Fs; c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_MS; c->type=CTRLT_GENERIC; c->state=&tempo_state; c->draw_it=&DrawTempoCtrl; c->left_click=&LeftClickTempo; c->update_derived_vals=&UpdateDerivedTempoCtrl; c->left=396; c->top=96; QueIns(c,Fs->last_ctrl); TaskDerivedValsUpdate; return c; } U0 TempoDel(CCtrl *c) { QueRem(c); Free(c); }