diff --git a/Timeline/Audio_Sequence.C b/Timeline/Audio_Sequence.C index 61279e9..7c2f2e3 100644 --- a/Timeline/Audio_Sequence.C +++ b/Timeline/Audio_Sequence.C @@ -159,7 +159,7 @@ Audio_Sequence::draw ( void ) /* if ( o->x() == (*r)->x() && o->w() == (*r)->w() ) */ /* printf( "complete superposition\n" ); */ - if ( (*r)->x() >= o->x() && (*r)->x() + (*r)->w() <= o->x() + o->w() ) + if ( o->contains( *r ) ) /* completely inside */ continue; @@ -195,7 +195,7 @@ Audio_Sequence::draw ( void ) if ( *o <= **r ) { - if ( (*r)->x() >= o->x() && (*r)->x() + (*r)->w() <= o->x() + o->w() ) + if ( o->contains( *r ) ) /* completely inside */ continue; diff --git a/Timeline/Sequence.C b/Timeline/Sequence.C index 58195c7..ff5f8ba 100644 --- a/Timeline/Sequence.C +++ b/Timeline/Sequence.C @@ -101,14 +101,13 @@ Sequence::overlaps ( Sequence_Widget *r ) for ( list ::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) { if ( *i == r ) continue; - if ( ! ( (*i)->start() > r->start() + r->length() || (*i)->start() + (*i)->length() < r->start() ) ) + if ( (*i)->overlaps( r ) ) return *i; } return NULL; } - void Sequence::draw ( void ) { diff --git a/Timeline/Sequence_Widget.H b/Timeline/Sequence_Widget.H index 640ad3c..4e93b47 100644 --- a/Timeline/Sequence_Widget.H +++ b/Timeline/Sequence_Widget.H @@ -314,6 +314,21 @@ public: int active_r ( void ) const { return _sequence->active_r(); } + + + +/** returns true if widget /w/ begins and ends completely within the range of this widget */ + bool contains ( const Sequence_Widget *w ) const + { + return w->start() >= start() && w->start() + w->length() <= start() + length(); + } + +/** returns true of widget /w/ overlaps this widget in any place */ + bool overlaps ( const Sequence_Widget *w ) const + { + return ! ( w->start() > start() + length() || w->start() + w->length() < start() ); + } + virtual Fl_Boxtype box ( void ) const { return FL_UP_BOX; } virtual Fl_Align align ( void ) const { return (Fl_Align)0; }