Timeline: Improve drag scrolling behavior.

This commit is contained in:
Jonathan Moore Liles 2015-09-29 22:10:37 -07:00
parent 97d149421f
commit aefc328c2d
3 changed files with 32 additions and 21 deletions

View File

@ -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 );
}

View File

@ -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,

View File

@ -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 );