diff --git a/Loggable.C b/Loggable.C index 269e59a..d8483fd 100644 --- a/Loggable.C +++ b/Loggable.C @@ -361,7 +361,6 @@ Loggable::flush ( void ) if ( n > 1 ) fprintf( _fp, "}\n" ); - fflush( _fp ); } diff --git a/Track.C b/Track.C index 1d5bfcc..6c2df81 100644 --- a/Track.C +++ b/Track.C @@ -25,9 +25,7 @@ #include -Track_Widget * Track::_queued_widget = NULL; - - +queue Track::_delete_queue; @@ -202,7 +200,7 @@ Track::handle ( int m ) if ( r ) { - int retval = r->handle( m ); + int retval = r->dispatch( m ); if ( retval && m == FL_PUSH ) pushed = r; @@ -210,11 +208,11 @@ Track::handle ( int m ) if ( retval && m == FL_RELEASE ) pushed = NULL; - if ( _queued_widget ) + while ( _delete_queue.size() ) { -// remove( _queued_widget ); - delete _queued_widget; - _queued_widget = NULL; + + delete _delete_queue.front(); + _delete_queue.pop(); pushed = NULL; } diff --git a/Track.H b/Track.H index e161244..d49e65b 100644 --- a/Track.H +++ b/Track.H @@ -30,7 +30,8 @@ #include #include -using std::list; +#include +using namespace std; class Region; class Track_Widget; @@ -41,7 +42,7 @@ class Track : public Fl_Group, public Loggable Track *_prev; char *_name; - static Track_Widget * _queued_widget; + static queue _delete_queue; protected: @@ -118,9 +119,7 @@ public: void queue_delete ( Track_Widget *r ) { - assert( ! _queued_widget ); - - _queued_widget = r; + _delete_queue.push( r ); } virtual void snap ( Track_Widget *r ); diff --git a/Track_Widget.C b/Track_Widget.C index 03d883c..5a4d623 100644 --- a/Track_Widget.C +++ b/Track_Widget.C @@ -20,6 +20,7 @@ #include "Track_Widget.H" list Track_Widget::_selection; +Track_Widget * Track_Widget::_current; void Track_Widget::draw_label ( const char *label, Fl_Align align ) @@ -76,13 +77,38 @@ Track_Widget::draw_label ( const char *label, Fl_Align align ) } +int +Track_Widget::dispatch ( int m ) +{ + Track_Widget::_current = this; + + if ( selected() ) + { + Loggable::block_start(); + + int r = 0; + + + for ( list ::iterator i = _selection.begin(); i != _selection.end(); i++ ) + if ( *i != this ) + r |= (*i)->handle( m ); + + r |= handle( m ); + + Loggable::block_end(); + + return r; + } + else + return handle( m ); +} /* base hanlde just does basic dragging */ int Track_Widget::handle ( int m ) { - static int ox, oy; - static bool dragging = false; +/* static int ox, oy; */ +/* static bool dragging = false; */ int X = Fl::event_x(); int Y = Fl::event_y(); @@ -99,8 +125,9 @@ Track_Widget::handle ( int m ) return 1; case FL_PUSH: { - ox = x() - X; - oy = y() - Y; + +/* ox = x() - X; */ +/* oy = y() - Y; */ if ( Fl::event_state() & FL_CTRL && Fl::event_button() == 3 ) @@ -115,19 +142,30 @@ Track_Widget::handle ( int m ) return 1; } case FL_RELEASE: - if ( dragging ) + if ( _drag ) + { _log.release(); - dragging = false; + delete _drag; + _drag = NULL; + } + fl_cursor( FL_CURSOR_DEFAULT ); return 1; case FL_DRAG: { - if ( ! dragging ) + if ( ! _drag ) { - dragging = true; + _drag = new Drag( x() - X, y() - Y ); + _log.hold(); } + const int ox = _drag->x; +// _current->_drag->x; + +/* const int ox = _drag->x; */ +/* const int oy = _drag->y; */ + redraw(); if ( timeline->ts_to_x( timeline->xoffset ) + ox + X > _track->x() ) @@ -137,7 +175,8 @@ Track_Widget::handle ( int m ) // _offset = timeline->x_to_ts( nx ) + timeline->xoffset; offset( timeline->x_to_ts( nx ) + timeline->xoffset ); - _track->snap( this ); + if ( Track_Widget::_current == this ) + _track->snap( this ); } // _track->redraw(); diff --git a/Track_Widget.H b/Track_Widget.H index 0675a1d..9b9cbbb 100644 --- a/Track_Widget.H +++ b/Track_Widget.H @@ -31,7 +31,8 @@ using namespace std; class Track_Widget : public Loggable { - static list _selection; + static list _selection; /* all the widgets making up the selection */ + static Track_Widget * _current; /* the widget initiating events that affect the selection */ protected: @@ -44,6 +45,17 @@ protected: Fl_Color _color; /* color of waveform */ Fl_Color _box_color; /* color of background (box) */ + struct Drag + { + /* mouse coords at start of drag */ + int x; + int y; + + Drag( int X, int Y ) : x( X ), y( Y ) {} + }; + + Drag *_drag; + public: Track_Widget ( ) @@ -51,6 +63,8 @@ public: _track = NULL; _offset = _start = _end = 0; + + _drag = NULL; } virtual ~Track_Widget ( ) @@ -85,6 +99,8 @@ public: delete _selection.front(); } + static Track_Widget *current ( void ) { return _current; } + void offset ( nframes_t where ) { @@ -112,6 +128,8 @@ public: } + int dispatch ( int m ); + Fl_Group * parent ( void ) const { return _track; } int scroll_x ( void ) const { return timeline->ts_to_x( timeline->xoffset ); }