diff --git a/Timeline/Control_Point.H b/Timeline/Control_Point.H index 491c14e..d652451 100644 --- a/Timeline/Control_Point.H +++ b/Timeline/Control_Point.H @@ -124,6 +124,17 @@ public: log_create(); } + Control_Point ( const Control_Point &rhs ) + { + _offset = rhs._offset; + _y = rhs._y; + } + + Track_Widget *clone ( const Track_Widget *r ) + { + return new Control_Point( *(Control_Point*)r ); + } + ~Control_Point ( ) { // if ( _label ) delete[] _label; diff --git a/Timeline/Region.C b/Timeline/Region.C index 77b8b55..e73aeee 100644 --- a/Timeline/Region.C +++ b/Timeline/Region.C @@ -107,6 +107,12 @@ Region::Region ( const Region & rhs ) log_create(); } +Track_Widget * +Region::clone ( const Track_Widget *r ) +{ + return new Region( *(Region*)r ); +} + /* */ Region::Region ( Audio_File *c ) { diff --git a/Timeline/Region.H b/Timeline/Region.H index 82a20d2..ce8fa66 100644 --- a/Timeline/Region.H +++ b/Timeline/Region.H @@ -171,7 +171,7 @@ class Region : public Region_Base init(); } - bool current ( void ) const { return this == Track::belowmouse(); } + bool current ( void ) const { return this == belowmouse(); } public: @@ -185,6 +185,9 @@ public: return (Loggable *)r; } + + Track_Widget *clone ( const Track_Widget *r ); + ~Region ( ) { log_destroy(); diff --git a/Timeline/Tempo_Point.H b/Timeline/Tempo_Point.H index 9ae9ab6..e522720 100644 --- a/Timeline/Tempo_Point.H +++ b/Timeline/Tempo_Point.H @@ -123,6 +123,17 @@ public: log_create(); } + Tempo_Point ( const Tempo_Point &rhs ) + { + _offset = rhs._offset; + _tempo = rhs._tempo; + } + + Track_Widget *clone ( const Track_Widget *r ) + { + return new Tempo_Point( *(Tempo_Point*)r ); + } + ~Tempo_Point ( ) { if ( _label ) delete[] _label; diff --git a/Timeline/Time_Point.H b/Timeline/Time_Point.H index 83a72ff..b95a4ea 100644 --- a/Timeline/Time_Point.H +++ b/Timeline/Time_Point.H @@ -27,6 +27,12 @@ struct time_sig int beats_per_bar; int beat_type; + time_sig ( ) + { + beats_per_bar = 0; + beat_type = 0; + } + time_sig ( int bpb, int note ) { beats_per_bar = bpb; @@ -118,7 +124,6 @@ protected: } - public: /* for loggable */ @@ -140,6 +145,17 @@ public: log_create(); } + Time_Point ( const Time_Point &rhs ) + { + _offset = rhs._offset; + _time = rhs._time; + } + + Track_Widget *clone ( const Track_Widget *r ) + { + return new Time_Point( *(Time_Point*)r ); + } + ~Time_Point ( ) { if ( _label ) delete[] _label; diff --git a/Timeline/Track.C b/Timeline/Track.C index 07eef8a..85950f1 100644 --- a/Timeline/Track.C +++ b/Timeline/Track.C @@ -26,8 +26,6 @@ queue Track::_delete_queue; -Track_Widget *Track::_pushed = NULL; -Track_Widget *Track::_belowmouse = NULL; Track::Track ( int X, int Y, int W, int H ) : Fl_Widget( X, Y, W, H ) { @@ -87,11 +85,11 @@ Track::draw ( void ) fl_clip_box( x(), y(), w(), h(), X, Y, W, H ); - if ( pushed() && pushed()->track() == this ) + if ( Track_Widget::pushed() && Track_Widget::pushed()->track() == this ) { - /* make sure the pushed widget is above all others */ - remove( pushed() ); - add( pushed() ); + /* make sure the Track_Widget::pushed widget is above all others */ + remove( Track_Widget::pushed() ); + add( Track_Widget::pushed() ); } int xfades = 0; @@ -338,9 +336,9 @@ Track::handle ( int m ) { case FL_DND_ENTER: printf( "enter\n" ); - if ( pushed() && pushed()->track()->class_name() == class_name() ) + if ( Track_Widget::pushed() && Track_Widget::pushed()->track()->class_name() == class_name() ) { - add( pushed() ); + add( Track_Widget::pushed() ); redraw(); } case FL_DND_LEAVE: @@ -349,11 +347,11 @@ Track::handle ( int m ) { Track_Widget *r = event_widget(); - if ( r != belowmouse() ) + if ( r != Track_Widget::belowmouse() ) { - if ( belowmouse() ) - belowmouse()->handle( FL_LEAVE ); - _belowmouse = r; + if ( Track_Widget::belowmouse() ) + Track_Widget::belowmouse()->handle( FL_LEAVE ); + Track_Widget::belowmouse( r ); if ( r ) r->handle( FL_ENTER ); @@ -363,17 +361,24 @@ Track::handle ( int m ) } default: { - Track_Widget *r = pushed() ? pushed() : event_widget(); + Track_Widget *r = Track_Widget::pushed() ? Track_Widget::pushed() : event_widget(); if ( r ) { int retval = r->dispatch( m ); if ( retval && m == FL_PUSH ) - _pushed = r; + { + Track_Widget::original( r ); + Track_Widget::pushed( r->clone( r ) ); + } if ( retval && m == FL_RELEASE ) - _pushed = NULL; + { + /* FIXME: copy here */ + Track_Widget::pushed( NULL ); + Track_Widget::original( NULL ); + } Loggable::block_start(); @@ -384,12 +389,12 @@ Track::handle ( int m ) _delete_queue.pop(); - if ( pushed() == t ) - _pushed = NULL; - if ( belowmouse() == t ) + if ( Track_Widget::pushed() == t ) + Track_Widget::pushed( NULL ); + if ( Track_Widget::belowmouse() == t ) { - belowmouse()->handle( FL_LEAVE ); - _belowmouse = NULL; + Track_Widget::belowmouse()->handle( FL_LEAVE ); + Track_Widget::belowmouse( NULL ); } delete t; diff --git a/Timeline/Track.H b/Timeline/Track.H index 241ce1c..d8f3a41 100644 --- a/Timeline/Track.H +++ b/Timeline/Track.H @@ -46,8 +46,6 @@ class Track : public Fl_Widget, public Loggable char *_name; static queue _delete_queue; - static Track_Widget *_pushed; - static Track_Widget *_belowmouse; protected: @@ -91,9 +89,6 @@ public: Track ( int X, int Y, int W, int H ); virtual ~Track ( ); - static Track_Widget *pushed ( void ) { return _pushed; }; - static Track_Widget *belowmouse ( void ) { return _belowmouse; }; - const char * name ( void ) const { return _name; } void name ( char *s ) { if ( _name ) free( _name ); _name = s; label( _name ); } diff --git a/Timeline/Track_Widget.C b/Timeline/Track_Widget.C index e05d01f..01c4396 100644 --- a/Timeline/Track_Widget.C +++ b/Timeline/Track_Widget.C @@ -17,10 +17,21 @@ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ +/* TODO: + + What if we solve the continuous-modification/sync issue by making a + copy of the 'pushed' widget, and operating on that instead (hiding + the original), then when the widget is released, copy its data into + the original? + + */ #include "Track_Widget.H" list Track_Widget::_selection; -Track_Widget * Track_Widget::_current; +Track_Widget * Track_Widget::_current = NULL; +Track_Widget * Track_Widget::_pushed = NULL; +Track_Widget * Track_Widget::_original = NULL; +Track_Widget * Track_Widget::_belowmouse = NULL; void Track_Widget::draw_label ( const char *label, Fl_Align align, Fl_Color color ) diff --git a/Timeline/Track_Widget.H b/Timeline/Track_Widget.H index cbf32ce..efa0a9c 100644 --- a/Timeline/Track_Widget.H +++ b/Timeline/Track_Widget.H @@ -41,8 +41,15 @@ class Track_Widget : public Loggable { static list _selection; /* all the widgets making up the selection */ + + /* FIXME: is this not the same as /pushed/? */ static Track_Widget * _current; /* the widget initiating events that affect the selection */ + /* these are actually managed in the Track classes */ + static Track_Widget * _pushed; /* the widget receiving drag events (a copy) */ + static Track_Widget * _original; /* the original of the /pushed/ widget */ + static Track_Widget * _belowmouse; /* the widget below the mouse cursor */ + protected: Track *_track; /* track this region belongs to */ @@ -77,6 +84,15 @@ public: _selection.remove( this ); } + + Track_Widget ( const Track_Widget &rhs ) + { + _offset = rhs._offset; + _track = rhs._track; + } + + virtual Track_Widget *clone ( const Track_Widget *r ) = 0; + bool selected ( void ) { return ::find( _selection.begin(), _selection.end(), this ) != _selection.end(); @@ -107,7 +123,17 @@ public: delete _selection.front(); } - static Track_Widget *current ( void ) { return _current; } + static Track_Widget *current ( void ) { return Track_Widget::_current; } + + static Track_Widget *pushed ( void ) { return Track_Widget::_pushed; } + static Track_Widget *original ( void ) { return Track_Widget::_original; } + static Track_Widget *belowmouse ( void ) { return Track_Widget::_belowmouse; } + + static void pushed ( Track_Widget *w ) { Track_Widget::_pushed = w; } + static void original ( Track_Widget *w ) { Track_Widget::_original = w; } + static void belowmouse ( Track_Widget *w ) { Track_Widget::_belowmouse = w; } + +// static void pushed ( Track_Widget *w ) { Track_Widget::_pushed = w; } void offset ( nframes_t where ) diff --git a/Timeline/main.C b/Timeline/main.C index f00f8f8..ec96971 100644 --- a/Timeline/main.C +++ b/Timeline/main.C @@ -49,7 +49,7 @@ #include "Loggable.H" #include "Track_Header.H" -#include "const.h" +// #include "const.h" Timeline *timeline;