| @@ -190,6 +190,23 @@ Timeline::beats_per_minute ( nframes_t when, float bpm ) | |||||
| tempo_track->add( new Tempo_Point( when, bpm ) ); | tempo_track->add( new Tempo_Point( when, bpm ) ); | ||||
| } | } | ||||
| /** return the absolute pixel of the nearest measure line to /x/ */ | |||||
| int | |||||
| Timeline::nearest_line ( int ix ) | |||||
| { | |||||
| for ( int x = ix - 10; x < ix + 10; ++x ) | |||||
| { | |||||
| const int measure = ts_to_x( (double)(sample_rate * 60) / beats_per_minute( x_to_ts( x ) + xoffset )); | |||||
| // const int abs_x = ts_to_x( xoffset ) + x; | |||||
| if ( 0 == x % measure ) | |||||
| return x; | |||||
| } | |||||
| return -1; | |||||
| } | |||||
| /* draw appropriate measure lines inside the given bounding box */ | /* draw appropriate measure lines inside the given bounding box */ | ||||
| void | void | ||||
| Timeline::draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ) | Timeline::draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ) | ||||
| @@ -106,6 +106,8 @@ struct Timeline : public Fl_Group | |||||
| float beats_per_minute ( nframes_t when ) const; | float beats_per_minute ( nframes_t when ) const; | ||||
| int beats_per_bar ( nframes_t when ) const; | int beats_per_bar ( nframes_t when ) const; | ||||
| void beats_per_minute ( nframes_t when, float bpm ); | void beats_per_minute ( nframes_t when, float bpm ); | ||||
| int nearest_line ( int ix ); | |||||
| void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ); | void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ); | ||||
| void position ( int X ); | void position ( int X ); | ||||
| void draw ( void ); | void draw ( void ); | ||||
| @@ -119,6 +119,14 @@ Track::snap ( Track_Widget *r ) | |||||
| int rx1 = r->x(); | int rx1 = r->x(); | ||||
| int rx2 = r->x() + r->w(); | int rx2 = r->x() + r->w(); | ||||
| int nx = timeline->nearest_line( r->abs_x() ); | |||||
| if ( nx >= 0 ) | |||||
| { | |||||
| r->offset( timeline->x_to_ts( nx ) ); | |||||
| return; | |||||
| } | |||||
| for ( list <Track_Widget*>::iterator i = _widgets.begin(); i != _widgets.end(); i++ ) | for ( list <Track_Widget*>::iterator i = _widgets.begin(); i != _widgets.end(); i++ ) | ||||
| { | { | ||||
| const Track_Widget *w = (*i); | const Track_Widget *w = (*i); | ||||