From ad1462d61d0b3f729fe55f2e0bd27bcf2bc8b063 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Tue, 22 Apr 2008 16:23:23 -0500 Subject: [PATCH] Add clock widget. --- Timeline/Clock.H | 111 +++++++++++++++++++++++++++++++++++++++++++++++ Timeline/main.C | 25 +++++++++-- 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 Timeline/Clock.H diff --git a/Timeline/Clock.H b/Timeline/Clock.H new file mode 100644 index 0000000..d67368e --- /dev/null +++ b/Timeline/Clock.H @@ -0,0 +1,111 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program is free software; you can redistribute it and/or modify it */ +/* under the terms of the GNU General Public License as published by the */ +/* Free Software Foundation; either version 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, but WITHOUT */ +/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ +/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ +/* more details. */ +/* */ +/* You should have received a copy of the GNU General Public License along */ +/* with This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + + +/* Digital clock widget to show points on the timeline. May be +switched between Bar Beat Tick and Wallclock displays */ + +#include +#include + +#include "Timeline.H" +#include "types.h" + + +class Clock : public Fl_Widget +{ + enum { BBT, HMS }; + + nframes_t _when; + +public: + + 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, "%d:%d:%.1f", H, M, S ); + } + + Clock ( int X, int Y, int W, int H, const char *L=0 ) + : Fl_Widget( X, Y, W, H, L ) + { + _when = 0; + box( FL_BORDER_BOX ); + type( HMS ); + } + + void set ( nframes_t frame ) + { + if ( _when != frame ) + { + _when = frame; + redraw(); + } + } + + void draw ( void ) + { +// fl_rectf( x(), y(), w(), h(), color() ); + + draw_box(); + + char buf[15]; + + switch ( type() ) + { + case HMS: + frame_to_HMS( buf, sizeof( buf ), _when ); + break; + case BBT: +// frame_to_BBT( _buf, sizeof( buf ), frame ); + break; + default: + printf( "error: invalid clock type\n" ); + } + + fl_font( FL_COURIER, 24 ); + + Fl_Color c = FL_GREEN; + + fl_color( c ); + + const int dx = x() + Fl::box_dx( box() ); + const int dy = y() + Fl::box_dy( box() ); + const int dw = w() - Fl::box_dw( box() ); + const int dh = h() - Fl::box_dh( box() ); + + fl_draw( buf, dx, dy, dw, dh, FL_ALIGN_CENTER ); + + fl_font( FL_HELVETICA, 9 ); + fl_color( FL_RED ); + + const char *s = type() == HMS ? "HMS" : "BBT"; + + 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 ) ); + + } +}; diff --git a/Timeline/main.C b/Timeline/main.C index 72d3d24..e0cc103 100644 --- a/Timeline/main.C +++ b/Timeline/main.C @@ -54,6 +54,9 @@ #include "Engine.H" + +#include "Clock.H" + Engine *engine; Timeline *timeline; Transport *transport; @@ -63,6 +66,17 @@ void cb_undo ( Fl_Widget *w, void *v ) Loggable::undo(); } + +const float UPDATE_FREQ = 0.05f; + +static void +clock_update_cb ( void *w ) +{ + Fl::repeat_timeout( UPDATE_FREQ, clock_update_cb, w ); + + ((Clock *)w)->set( transport->frame ); +} + int main ( int argc, char **argv ) { @@ -86,15 +100,13 @@ main ( int argc, char **argv ) /* TODO: change to seesion dir */ - transport = new Transport( 0, 0, 300, 24 ); - main_window->add( transport ); /* we don't really need a pointer for this */ engine = new Engine; engine->init(); - timeline = new Timeline( 0, 24, main_window->w(), main_window->h() - 24, "Timeline" ); + timeline = new Timeline( 0, 100, main_window->w(), main_window->h() - 24, "Timeline" ); Loggable::open( "history" ); @@ -102,6 +114,13 @@ main ( int argc, char **argv ) o->shortcut( FL_CTRL + 'z' ); o->callback( cb_undo, 0 ); + { + Clock *o = new Clock( 400, 0, 200, 50, "PLAYHEAD" ); + o->color( fl_darker( FL_GRAY ) ); + + Fl::add_timeout( UPDATE_FREQ, clock_update_cb, o ); + } + main_window->end(); main_window->show( argc, argv );