#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;
	QueueInsert(c, Fs->last_ctrl);
	TaskDerivedValsUpdate;

	return c;
}

U0 TempoDel(CCtrl *c)
{
	QueueRemove(c);
	Free(c);
}
