First pass at implementing fl_scroll optimization for timeline.
This commit is contained in:
parent
cee75218f3
commit
b6106fc6da
21
Region.C
21
Region.C
|
@ -92,12 +92,21 @@ Region::Region ( Clip *c )
|
|||
void
|
||||
Region::trim ( enum trim_e t, int X )
|
||||
{
|
||||
|
||||
redraw();
|
||||
|
||||
switch ( t )
|
||||
{
|
||||
case LEFT:
|
||||
{
|
||||
int d = X - x();
|
||||
|
||||
/* if ( d < 0 ) */
|
||||
/* // _track->damage( FL_DAMAGE_EXPOSE, x() + d, y(), 1 - d, h() ); */
|
||||
/* _track->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() ); */
|
||||
/* else */
|
||||
/* _track->damage( FL_DAMAGE_EXPOSE, x(), y(), d, h() ); */
|
||||
|
||||
long td = timeline->x_to_ts( d );
|
||||
|
||||
if ( td < 0 && _start < 0 - td )
|
||||
|
@ -106,11 +115,16 @@ Region::trim ( enum trim_e t, int X )
|
|||
_start += td;
|
||||
|
||||
_offset += td;
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
case RIGHT:
|
||||
{
|
||||
int d = (x() + w()) - X;
|
||||
|
||||
/* _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), d, h() ); */
|
||||
|
||||
long td = timeline->x_to_ts( d );
|
||||
|
||||
_end -= td;
|
||||
|
@ -120,9 +134,6 @@ Region::trim ( enum trim_e t, int X )
|
|||
return;
|
||||
|
||||
}
|
||||
|
||||
_track->redraw();
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -253,7 +264,9 @@ Region::handle ( int m )
|
|||
_track->prev()->add( this );
|
||||
}
|
||||
|
||||
_track->redraw();
|
||||
// _track->redraw();
|
||||
|
||||
// _track->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() );
|
||||
|
||||
ret = Track_Widget::handle( m );
|
||||
return ret | 1;
|
||||
|
|
|
@ -29,15 +29,19 @@ class Scalebar : public Fl_Scrollbar
|
|||
{
|
||||
double _zoom;
|
||||
|
||||
bool _zoom_changed;
|
||||
|
||||
public:
|
||||
|
||||
Scalebar ( int X, int Y, int W, int H ) : Fl_Scrollbar ( X, Y, W, H )
|
||||
{
|
||||
_zoom = 1.0f;
|
||||
_zoom_changed = true;
|
||||
|
||||
step( 1 );
|
||||
}
|
||||
|
||||
bool zoom_changed ( void ) const { return _zoom_changed; }
|
||||
double zoom ( void ) const { return _zoom; }
|
||||
double value ( void ) const { return Fl_Slider::value(); }
|
||||
|
||||
|
@ -57,7 +61,9 @@ public:
|
|||
while ( d-- )
|
||||
_zoom *= 2;
|
||||
|
||||
_zoom_changed = true;
|
||||
do_callback();
|
||||
_zoom_changed = false;
|
||||
|
||||
slider_size( w() / maximum() );
|
||||
|
||||
|
|
85
Timeline.H
85
Timeline.H
|
@ -106,8 +106,9 @@ struct Timeline : public Fl_Group
|
|||
|
||||
damage( FL_DAMAGE_SCROLL );
|
||||
|
||||
rulers->damage( FL_DAMAGE_SCROLL );
|
||||
tracks->damage( FL_DAMAGE_SCROLL );
|
||||
/* rulers->damage( FL_DAMAGE_SCROLL ); */
|
||||
/* tracks->damage( FL_DAMAGE_SCROLL ); */
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -121,8 +122,17 @@ struct Timeline : public Fl_Group
|
|||
|
||||
fl_push_clip( X, Y, W, H );
|
||||
|
||||
tl->tracks->redraw();
|
||||
tl->rulers->redraw();
|
||||
fl_color( rand() );
|
||||
fl_rectf( X, Y, X + W, Y + H );
|
||||
|
||||
// tl->tracks->redraw();
|
||||
|
||||
tl->draw_child( *tl->rulers );
|
||||
tl->draw_child( *tl->tracks );
|
||||
|
||||
|
||||
// tl->tracks->draw();
|
||||
// tl->rulers->draw();
|
||||
|
||||
/* FOR_CHILDREN_OF( tracks, o ) */
|
||||
/* { */
|
||||
|
@ -140,39 +150,52 @@ struct Timeline : public Fl_Group
|
|||
}
|
||||
|
||||
|
||||
/* void */
|
||||
/* draw ( void ) */
|
||||
/* { */
|
||||
/* int X, Y, W, H; */
|
||||
void
|
||||
draw ( void )
|
||||
{
|
||||
int X, Y, W, H;
|
||||
|
||||
/* X = x(); */
|
||||
/* Y = tracks->y(); */
|
||||
/* W = w(); */
|
||||
/* H = tracks->h(); */
|
||||
X = tracks->x() + Fl::box_dx( tracks->child( 0 )->box() ) + 1;
|
||||
Y = tracks->y();
|
||||
W = tracks->w() - Fl::box_dw( tracks->child( 0 )->box() ) - 2;
|
||||
H = tracks->h();
|
||||
|
||||
/* if ( damage() & FL_DAMAGE_ALL ) */
|
||||
/* { */
|
||||
/* draw_clip( this, X, Y, W, H ); */
|
||||
/* return; */
|
||||
/* } */
|
||||
|
||||
/* if ( damage() & FL_DAMAGE_SCROLL ) */
|
||||
/* { */
|
||||
/* fl_scroll( X, Y, W, H, _old_position - xoffset, Y, draw_clip, this ); */
|
||||
/* } */
|
||||
/* fl_color( FL_RED ); */
|
||||
/* fl_rect( X, Y, X + W, Y + H ); */
|
||||
|
||||
/* if ( damage() & FL_DAMAGE_CHILD ) */
|
||||
/* { */
|
||||
/* // Fl_Widget *o; */
|
||||
if ( damage() & FL_DAMAGE_ALL )
|
||||
{
|
||||
draw_clip( this, X, tracks->y(), W, tracks->h() );
|
||||
draw_clip( this, X, rulers->y(), W, rulers->h() );
|
||||
return;
|
||||
}
|
||||
|
||||
/* /\* FOR_CHILDREN_OF( tracks, o ) *\/ */
|
||||
/* /\* tracks->update_child( o ); *\/ */
|
||||
if ( damage() & FL_DAMAGE_SCROLL )
|
||||
{
|
||||
printf( "doing scroll\n" );
|
||||
int dx = ts_to_x( _old_position ) - ts_to_x( xoffset );
|
||||
|
||||
/* /\* FOR_CHILDREN_OF( rulers, o ) *\/ */
|
||||
/* /\* rulers->update_child( o ); *\/ */
|
||||
fl_scroll( X, tracks->y(), W, tracks->h(), dx, 0, draw_clip, this );
|
||||
fl_scroll( X, rulers->y(), W, rulers->h(), dx, 0, draw_clip, this );
|
||||
|
||||
/* // fl_pop_clip() */
|
||||
/* } */
|
||||
/* } */
|
||||
_old_position = 0;
|
||||
}
|
||||
|
||||
if ( damage() & FL_DAMAGE_CHILD )
|
||||
{
|
||||
Fl_Widget *o;
|
||||
FOR_CHILDREN_OF( this, o )
|
||||
this->update_child( *o );
|
||||
|
||||
/* FOR_CHILDREN_OF( tracks, o ) */
|
||||
/* tracks->update_child( o ); */
|
||||
|
||||
/* FOR_CHILDREN_OF( rulers, o ) */
|
||||
/* rulers->update_child( o ); */
|
||||
|
||||
// fl_pop_clip()
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
|
10
Track.C
10
Track.C
|
@ -43,18 +43,22 @@ Track::sort ( void )
|
|||
void
|
||||
Track::draw ( void )
|
||||
{
|
||||
fl_push_clip( x(), y(), w(), h() );
|
||||
|
||||
Fl_Group::draw();
|
||||
|
||||
timeline->draw_measure_lines( x(), y(), w(), h(), color() );
|
||||
|
||||
fl_push_clip( x(), y(), w(), h() );
|
||||
int X, Y, W, H;
|
||||
|
||||
fl_clip_box( x(), y(), w(), h(), X, Y, W, H );
|
||||
|
||||
for ( list <Track_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||
(*r)->draw_box( x(), y(), w(), h() );
|
||||
(*r)->draw_box( X, Y, W, H );
|
||||
|
||||
/* TODO: detect overlap and draw with transparency/crossfade */
|
||||
for ( list <Track_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||
(*r)->draw( x(), y(), w(), h() );
|
||||
(*r)->draw( X, Y, W, H );
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
|
|
@ -96,8 +96,13 @@ public:
|
|||
|
||||
virtual Fl_Boxtype box ( void ) const { return FL_UP_BOX; }
|
||||
|
||||
/* just draw a simple box */
|
||||
void
|
||||
redraw ( void )
|
||||
{
|
||||
_track->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() );
|
||||
}
|
||||
|
||||
/* just draw a simple box */
|
||||
virtual void
|
||||
draw_box ( int X, int Y, int W, int H )
|
||||
{
|
||||
|
@ -208,6 +213,8 @@ public:
|
|||
return 1;
|
||||
case FL_DRAG:
|
||||
{
|
||||
redraw();
|
||||
|
||||
if ( ox + X >= _track->x() )
|
||||
{
|
||||
int nx = ox + X;
|
||||
|
@ -217,7 +224,7 @@ public:
|
|||
_track->snap( this );
|
||||
}
|
||||
|
||||
_track->redraw();
|
||||
// _track->redraw();
|
||||
fl_cursor( FL_CURSOR_MOVE );
|
||||
|
||||
|
||||
|
@ -241,9 +248,9 @@ public:
|
|||
else
|
||||
pos += d;
|
||||
|
||||
timeline->xoffset = pos;
|
||||
timeline->position( timeline->ts_to_x( pos ) );
|
||||
|
||||
timeline->tracks->redraw();
|
||||
// timeline->tracks->redraw();
|
||||
}
|
||||
|
||||
|
||||
|
|
42
main.C
42
main.C
|
@ -55,16 +55,20 @@ cb_scroll ( Fl_Widget *w, void *v )
|
|||
{
|
||||
Scalebar *sb = (Scalebar*)w;
|
||||
|
||||
timeline->fpp = sb->zoom() * 256;
|
||||
timeline->fpp = max( min( timeline->fpp, 4096.0f ), (float)2 );
|
||||
if ( sb->zoom_changed() )
|
||||
{
|
||||
timeline->fpp = sb->zoom() * 256;
|
||||
timeline->fpp = max( min( timeline->fpp, 4096.0f ), (float)2 );
|
||||
|
||||
int maxx = timeline->ts_to_x( timeline->length );
|
||||
sb->range( 0, maxx );
|
||||
// sb->value( sb->value(), maxx
|
||||
// sb->slider_size( sb->w() / maxx );
|
||||
// ((Fl_Scrollbar*)sb)->value( sb->value(), 60, 10, maxx );
|
||||
int maxx = timeline->ts_to_x( timeline->length );
|
||||
sb->range( 0, maxx );
|
||||
|
||||
timeline->position( sb->value() );
|
||||
timeline->redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
timeline->position( sb->value() );
|
||||
}
|
||||
|
||||
/* timeline->xoffset = timeline->x_to_ts( sb->value() ); */
|
||||
/* // timeline->tracks->redraw(); */
|
||||
|
@ -72,17 +76,17 @@ cb_scroll ( Fl_Widget *w, void *v )
|
|||
|
||||
printf( "%lu\n", timeline->xoffset );
|
||||
|
||||
for ( int i = timeline->tracks->children(); i-- ; )
|
||||
{
|
||||
Fl_Group *track = (Fl_Group*)timeline->tracks->child( i );
|
||||
track->damage( FL_DAMAGE_SCROLL );
|
||||
}
|
||||
/* for ( int i = timeline->tracks->children(); i-- ; ) */
|
||||
/* { */
|
||||
/* Fl_Group *track = (Fl_Group*)timeline->tracks->child( i ); */
|
||||
/* track->damage( FL_DAMAGE_SCROLL ); */
|
||||
/* } */
|
||||
|
||||
for ( int i = timeline->rulers->children(); i-- ; )
|
||||
{
|
||||
Fl_Group *track = (Fl_Group*)timeline->rulers->child( i );
|
||||
track->damage( FL_DAMAGE_SCROLL );
|
||||
}
|
||||
/* for ( int i = timeline->rulers->children(); i-- ; ) */
|
||||
/* { */
|
||||
/* Fl_Group *track = (Fl_Group*)timeline->rulers->child( i ); */
|
||||
/* track->damage( FL_DAMAGE_SCROLL ); */
|
||||
/* } */
|
||||
|
||||
|
||||
|
||||
|
@ -100,7 +104,7 @@ cb_scroll ( Fl_Widget *w, void *v )
|
|||
int
|
||||
main ( int argc, char **argv )
|
||||
{
|
||||
Fl_Double_Window *main_window = new Fl_Double_Window( 0, 0, 800, 600 );
|
||||
Fl_Window *main_window = new Fl_Window( 0, 0, 800, 600 );
|
||||
|
||||
Fl::get_system_colors();
|
||||
Fl::scheme( "plastic" );
|
||||
|
|
Loading…
Reference in New Issue