#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);
}