Add more clock types.
This commit is contained in:
parent
dfe953c6df
commit
80d2466c6f
|
@ -30,6 +30,9 @@ switched between Bar Beat Tick and Wallclock displays */
|
|||
|
||||
const float CLOCK_UPDATE_FREQ = 0.06f;
|
||||
|
||||
/* TODO: frames per second? */
|
||||
|
||||
|
||||
class Clock : public Fl_Widget
|
||||
{
|
||||
nframes_t _when;
|
||||
|
@ -52,10 +55,10 @@ class Clock : public Fl_Widget
|
|||
|
||||
public:
|
||||
|
||||
enum { BBT, HMS };
|
||||
enum { HMS = 0, BBT, Timecode, Sample, TYPE_MAX };
|
||||
|
||||
static void
|
||||
frame_to_HMS ( char *dst, int n, nframes_t frame )
|
||||
frame_to_Timecode ( char *dst, int n, nframes_t frame )
|
||||
{
|
||||
float S = (double)frame / timeline->sample_rate();
|
||||
|
||||
|
@ -66,6 +69,30 @@ public:
|
|||
snprintf( dst, n, "%02d:%02d:%02.0f:%02d", H, M, S, HS );
|
||||
}
|
||||
|
||||
static void
|
||||
frame_to_HMS ( char *dst, int n, nframes_t frame )
|
||||
{
|
||||
float S = (double)frame / timeline->sample_rate();
|
||||
|
||||
int M = S / 60; S -= M * 60;
|
||||
int H = M / 60; M -= H * 60;
|
||||
|
||||
snprintf( dst, n, "%02d:%02d:%05.3f", H, M, S );
|
||||
}
|
||||
|
||||
static void
|
||||
frame_to_Sample ( char *dst, int n, nframes_t frame )
|
||||
{
|
||||
snprintf( dst, n, "%lu", (unsigned long)frame );
|
||||
}
|
||||
|
||||
static void
|
||||
frame_to_BBT ( char *dst, int n, nframes_t frame )
|
||||
{
|
||||
snprintf( dst, n, "unimplemented" );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Clock ( int X, int Y, int W, int H, const char *L=0 )
|
||||
: Fl_Widget( X, Y, W, H, L )
|
||||
|
@ -104,6 +131,8 @@ public:
|
|||
{
|
||||
draw_box();
|
||||
|
||||
fl_push_clip( x(), y(), w(), h() );
|
||||
|
||||
char buf[15];
|
||||
*buf = '\0';
|
||||
|
||||
|
@ -113,7 +142,13 @@ public:
|
|||
frame_to_HMS( buf, sizeof( buf ), _when );
|
||||
break;
|
||||
case BBT:
|
||||
// frame_to_BBT( _buf, sizeof( buf ), frame );
|
||||
frame_to_BBT( buf, sizeof( buf ), _when );
|
||||
break;
|
||||
case Timecode:
|
||||
frame_to_Timecode( buf, sizeof( buf ), _when );
|
||||
break;
|
||||
case Sample:
|
||||
frame_to_Sample( buf, sizeof( buf ), _when );
|
||||
break;
|
||||
default:
|
||||
printf( "error: invalid clock type\n" );
|
||||
|
@ -140,14 +175,50 @@ public:
|
|||
fl_draw( buf, dx, dy, dw, dh - 9, FL_ALIGN_CENTER );
|
||||
|
||||
fl_font( FL_HELVETICA, 9 );
|
||||
fl_color( FL_RED );
|
||||
|
||||
const char *s = type() == HMS ? "HMS" : "BBT";
|
||||
const char *types[] = { "HMS", "BBT", "Timecode", "Sample" };
|
||||
|
||||
fl_color( FL_CYAN );
|
||||
|
||||
switch ( type() )
|
||||
{
|
||||
case Timecode:
|
||||
snprintf( buf, sizeof( buf ), "%.1f", 30.0 );
|
||||
fl_draw( buf, dx, dy, dw, dh, FL_ALIGN_BOTTOM );
|
||||
break;
|
||||
case Sample:
|
||||
snprintf( buf, sizeof( buf ), "%lu", (unsigned long)timeline->sample_rate() );
|
||||
fl_draw( buf, dx, dy, dw, dh, FL_ALIGN_BOTTOM );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
const char *s = types[ type() ];
|
||||
|
||||
fl_color( FL_RED );
|
||||
|
||||
fl_draw( s, dx + 4, dy, dw, dh, (Fl_Align)( FL_ALIGN_LEFT | FL_ALIGN_BOTTOM ) );
|
||||
|
||||
if ( label() )
|
||||
fl_draw( label(), dx, dy, dw, dh, (Fl_Align)( FL_ALIGN_RIGHT | FL_ALIGN_BOTTOM ) );
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
|
||||
int handle ( int m )
|
||||
{
|
||||
if ( m == FL_PUSH )
|
||||
{
|
||||
int t = type() + 1;
|
||||
|
||||
if ( t >= TYPE_MAX )
|
||||
t = 0;
|
||||
|
||||
type( t );
|
||||
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue