From 80d2466c6f9d0ad7016b164ada465eafb44ec093 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Thu, 24 Apr 2008 02:27:49 -0500 Subject: [PATCH] Add more clock types. --- Timeline/Clock.H | 81 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/Timeline/Clock.H b/Timeline/Clock.H index a8bcf2a..d327c9a 100644 --- a/Timeline/Clock.H +++ b/Timeline/Clock.H @@ -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(); + } } };