diff --git a/Region.C b/Region.C index 354ed0e..296416d 100644 --- a/Region.C +++ b/Region.C @@ -36,6 +36,8 @@ using namespace std; extern Timeline timeline; +Fl_Boxtype Region::_box = FL_PLASTIC_UP_BOX; + void Region::init ( void ) { @@ -296,6 +298,7 @@ Region::resize ( void ) // Fl_Widget::resize( X, y(), W, h() ); } +int measure = 40; /* X is the timeline offset, W is the width of the track */ void @@ -304,6 +307,8 @@ Region::draw ( int X, int Y, int W, int H ) if ( ! ( W > 0 && H > 0 ) ) return; + + if ( _offset > timeline.xoffset + timeline.x_to_ts( _track->w() ) || ( _offset < timeline.xoffset && _offset + (_end - _start) < timeline.xoffset ) ) @@ -331,12 +336,15 @@ Region::draw ( int X, int Y, int W, int H ) fl_push_clip( rx, Y, rw, H ); /* dirty hack to keep the box from flipping to vertical at small sizes */ - fl_draw_box( FL_PLASTIC_UP_BOX, rx - 10, Y, rw + 50, H, _box_color ); + fl_draw_box( box(), rx - 10, Y, rw + 50, H, _box_color ); + // fl_push_clip( x() + Fl::box_dx( box() ), y(), w() - Fl::box_dw( box() ), h() ); draw_waveform( rx, Y, rw, H, _clip, _start + offset, min( (_end - _start) - offset, _end), _scale, _color ); + timeline.draw_measure_lines( rx, Y, rw, H, _box_color ); + fl_color( FL_BLACK ); fl_line( rx, Y, rx, Y + H ); fl_line( rx + rw - 1, Y, rx + rw - 1, Y + H ); @@ -346,10 +354,10 @@ Region::draw ( int X, int Y, int W, int H ) fl_font( FL_HELVETICA, 14 ); fl_color( FL_BLACK ); - int bx = Fl::box_dx( FL_PLASTIC_UP_BOX ); - int by = Fl::box_dy( FL_PLASTIC_UP_BOX ); - int bw = Fl::box_dw( FL_PLASTIC_UP_BOX ); - int bh = Fl::box_dh( FL_PLASTIC_UP_BOX ); + int bx = Fl::box_dx( box() ); + int by = Fl::box_dy( box() ); + int bw = Fl::box_dw( box() ); + int bh = Fl::box_dh( box() ); int dx = min( 32767, timeline.ts_to_x( offset ) ); @@ -363,8 +371,8 @@ Region::draw ( int X, int Y, int W, int H ) //(Fl_Align)FL_ALIGN_LEFT | FL_ALIGN_BOTTOM ); - fl_color( FL_RED ); - fl_line( x(), y(), x(), y() + h() ); +/* fl_color( FL_RED ); */ +/* fl_line( x(), y(), x(), y() + h() ); */ } diff --git a/Region.H b/Region.H index 2ca2f56..880139b 100644 --- a/Region.H +++ b/Region.H @@ -87,9 +87,11 @@ class Region : public TrackWidget float _scale; /* amplitude adjustment */ + static Fl_Boxtype _box; static Fl_Color _selection_color; static Fl_Color selection_color ( void ) { return _selection_color; } static void selection_color ( Fl_Color v ) { _selection_color = v; } + static Fl_Boxtype box ( void ) { return _box; } enum trim_e { NO, LEFT, RIGHT }; void trim ( enum trim_e t, int X ); diff --git a/Timeline.H b/Timeline.H index 022b266..1791716 100644 --- a/Timeline.H +++ b/Timeline.H @@ -28,6 +28,8 @@ #include +#include + struct Timeline { Fl_Scroll *scroll; Fl_Pack *tracks; @@ -40,6 +42,9 @@ struct Timeline { nframes_t xoffset; + int _beats_per_bar; + float _beats_per_minute; + int ts_to_x( nframes_t ts ) { @@ -52,6 +57,31 @@ struct Timeline { { return x * fpp; } + + + float + beats_per_minute ( void ) const + { + // TODO: this should check a tempo map. + return _beats_per_minute; + } + + /* draw appropriate measure lines inside the given bounding box */ + void + draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ) + { + fl_line_style( FL_DASH, 2 ); + fl_color( fl_color_average( FL_BLACK, color, 0.65f ) ); + + int measure = ts_to_x( sample_rate * 60 / beats_per_minute() ); + + for ( int x = X; x < X + W; ++x ) + + if ( 0 == (ts_to_x( xoffset ) + x) % measure ) + fl_line( x, Y, x, Y + H ); + + fl_line_style( FL_SOLID, 0 ); + } }; extern Timeline timeline; diff --git a/Track.C b/Track.C index bde8092..cf0356c 100644 --- a/Track.C +++ b/Track.C @@ -29,6 +29,8 @@ Track::draw ( void ) { Fl_Group::draw(); + timeline.draw_measure_lines( x(), y(), w(), h(), color() ); + fl_push_clip( x(), y(), w(), h() ); for ( list ::iterator r = _regions.begin(); r != _regions.end(); r++ ) diff --git a/main.C b/main.C index 44d6c27..03a1c7b 100644 --- a/main.C +++ b/main.C @@ -113,7 +113,7 @@ main ( int argc, char **argv ) timeline.scroll = new Fl_Scroll( 0, 24, 800, 600 - (24 * 2) ); timeline.scroll->type( Fl_Scroll::VERTICAL ); timeline.fpp = 256; - + timeline._beats_per_minute = 120; timeline.sample_rate = 44100;