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