diff --git a/Region.C b/Region.C index 5386660..94d7262 100644 --- a/Region.C +++ b/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; diff --git a/Scalebar.H b/Scalebar.H index c49ba9b..9dc0ff4 100644 --- a/Scalebar.H +++ b/Scalebar.H @@ -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() ); diff --git a/Timeline.H b/Timeline.H index 2946e0b..3457896 100644 --- a/Timeline.H +++ b/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() + } + } }; diff --git a/Track.C b/Track.C index 18f9fc3..b07a431 100644 --- a/Track.C +++ b/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 ::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 ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) - (*r)->draw( x(), y(), w(), h() ); + (*r)->draw( X, Y, W, H ); fl_pop_clip(); } diff --git a/Track_Widget.H b/Track_Widget.H index c505fac..5bf8445 100644 --- a/Track_Widget.H +++ b/Track_Widget.H @@ -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(); } diff --git a/main.C b/main.C index 37c9765..3559c85 100644 --- a/main.C +++ b/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" );