diff --git a/Track.C b/Track.C index 1212803..ff61169 100644 --- a/Track.C +++ b/Track.C @@ -33,6 +33,20 @@ Track::sort ( void ) _widgets.sort( Track_Widget::sort_func ); } +/** return a pointer to the widget that /r/ overlaps, or NULL if none. */ +Track_Widget * +Track::overlaps ( Track_Widget *r ) +{ + for ( list ::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) + { + if ( *i == r ) continue; + if ( ! ( (*i)->offset() > r->offset() + r->length() || (*i)->offset() + (*i)->length() < r->offset() ) ) + return *i; + } + + return NULL; +} + void Track::draw ( void ) { @@ -55,10 +69,45 @@ Track::draw ( void ) for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) (*r)->draw_box( X, Y, W, H ); + /* draw crossfades */ + for ( list ::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ ) + { + Track_Widget *o = overlaps( *r ); + + if ( o ) + { + if ( *o < **r ) + { + Rectangle b( (*r)->x(), o->y(), (o->x() + o->w()) - (*r)->x(), o->h() ); + + Fl_Color c = fl_color_average( o->box_color(), (*r)->box_color(), 0.50f ); + c = fl_color_average( c, FL_YELLOW, 0.20f ); + + fl_push_clip( b.x, b.y, b.w, b.h ); + + draw_box( o->box(), b.x - 100, b.y, b.w + 200, b.h, c ); + +/* fl_color( FL_BLACK ); */ +/* fl_line_style( FL_DOT, 4 ); */ + +/* fl_line( b.x, b.y, b.x + b.w, b.y + b.h ); */ + +/* fl_line( b.x, b.y + b.h, b.x + b.w, b.y ); */ + +/* fl_line_style( FL_SOLID, 0 ); */ + + fl_pop_clip(); + + } + } + } + + /* 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 ); + fl_pop_clip(); } diff --git a/Track.H b/Track.H index dccbe61..e69fd9d 100644 --- a/Track.H +++ b/Track.H @@ -124,6 +124,8 @@ public: _delete_queue.push( r ); } + Track_Widget * overlaps ( Track_Widget *r ); + virtual void snap ( Track_Widget *r ); virtual int handle ( int m );