diff --git a/timeline/src/Sequence_Widget.C b/timeline/src/Sequence_Widget.C index 350c49c..ea9a858 100644 --- a/timeline/src/Sequence_Widget.C +++ b/timeline/src/Sequence_Widget.C @@ -442,7 +442,7 @@ Sequence_Widget::handle ( int m ) if ( ! _drag ) { - begin_drag ( Drag( Y, x_to_offset( X ) ) ); + begin_drag ( Drag( X, Y, x_to_offset( X ), start() ) ); _log.hold(); } @@ -463,7 +463,7 @@ Sequence_Widget::handle ( int m ) const nframes_t of = timeline->x_to_offset( X ); int64_t s = (int64_t)of - _drag->offset; - + if ( s < 0 ) s = 0; @@ -473,29 +473,25 @@ Sequence_Widget::handle ( int m ) sequence()->snap( this ); if ( X >= sequence()->x() + sequence()->w() || - X <= sequence()->x() ) + X <= sequence()->drawable_x() ) { /* this drag needs to scroll */ - nframes_t pos = timeline->xoffset; + int64_t pos = s - ( _drag->mouse_offset - _drag->offset ); + - nframes_t d = timeline->x_to_ts( 100 ); + if ( X > sequence()->x() + sequence()->w() ) + pos -= timeline->x_to_ts( sequence()->drawable_w() ); - if ( X <= sequence()->x() ) - { + if ( s == 0 ) + pos = 0; - if ( pos > d ) - pos -= d; - else - pos = 0; - } - else - pos += d; - - timeline->xposition( timeline->ts_to_x( pos ) ); - -// timeline->update_length( start() + length() ); + if ( pos < 0 ) + pos = 0; + timeline->xposition(timeline->ts_to_x(pos)); + + /* timeline->redraw(); */ sequence()->damage( FL_DAMAGE_USER1 ); } diff --git a/timeline/src/Sequence_Widget.H b/timeline/src/Sequence_Widget.H index dd2dfee..210f72b 100644 --- a/timeline/src/Sequence_Widget.H +++ b/timeline/src/Sequence_Widget.H @@ -39,8 +39,9 @@ struct Drag // nframes_t start; int64_t offset; + int64_t mouse_offset; - Drag( int X, int Y, uint64_t offset=0 ) : x( X ), y( Y ), offset( offset ) { state = 0; } + Drag( int X, int Y, uint64_t offset=0, uint64_t mouse_offset = 0 ) : x( X ), y( Y ), offset( offset ), mouse_offset( mouse_offset ) { state = 0; } }; /* most common position description. /offset/ is only used by Regions, diff --git a/timeline/src/Timeline.C b/timeline/src/Timeline.C index 645bda2..ecd03b5 100644 --- a/timeline/src/Timeline.C +++ b/timeline/src/Timeline.C @@ -938,7 +938,21 @@ Timeline::prev_line ( nframes_t *frame, bool bar ) const nframes_t Timeline::x_to_offset ( int x ) const { - return x_to_ts( max( 0, x - Track::width() ) ) + xoffset; + int d = x - Track::width(); + + int64_t r; + + if ( d < 0 ) + r = (int64_t)xoffset - x_to_ts( 0 - d ); + else + r = (int64_t)xoffset + x_to_ts( d ); + + if ( r > JACK_MAX_FRAMES ) + return JACK_MAX_FRAMES; + else if ( r < 0 ) + return 0; + else + return r; } int @@ -1837,7 +1851,7 @@ Timeline::xposition ( int X ) { xoffset = x_to_ts( X ); - int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset ); + long dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset ); if ( dx ) damage( FL_DAMAGE_SCROLL );