#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()
{
  Bool old_preempt;
  CCtrl *c=CAlloc(sizeof(CCtrl));
  c->win_task=Fs;
  c->flags=CTRLF_SHOW|CTRLF_CAPTURE_LEFT_IP;
  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;
  old_preempt=Preempt(OFF);
  QueIns(c,Fs->last_ctrl);
  TaskDerivedValsUpdate;
  Preempt(old_preempt);
  return c;
}

U0 TempoDel(CCtrl *c)
{
  Bool old_preempt=Preempt(OFF);
  QueRem(c);
  Preempt(old_preempt);
  Free(c);
}
