@@ -361,7 +361,6 @@ Loggable::flush ( void ) | |||
if ( n > 1 ) | |||
fprintf( _fp, "}\n" ); | |||
fflush( _fp ); | |||
} | |||
@@ -25,9 +25,7 @@ | |||
#include <FL/fl_draw.H> | |||
Track_Widget * Track::_queued_widget = NULL; | |||
queue <Track_Widget *> 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; | |||
} | |||
@@ -30,7 +30,8 @@ | |||
#include <assert.h> | |||
#include <list> | |||
using std::list; | |||
#include <queue> | |||
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 <Track_Widget *> _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 ); | |||
@@ -20,6 +20,7 @@ | |||
#include "Track_Widget.H" | |||
list <Track_Widget *> 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 <Track_Widget *>::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(); | |||
@@ -31,7 +31,8 @@ using namespace std; | |||
class Track_Widget : public Loggable | |||
{ | |||
static list <Track_Widget *> _selection; | |||
static list <Track_Widget *> _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 ); } | |||