@@ -100,6 +100,9 @@ public: | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( Fl::event_x() < drawable_x() ) | |||
return 0; | |||
Logger log( this ); | |||
if ( Fl::event_button1() ) | |||
@@ -726,8 +726,10 @@ Control_Sequence::handle ( int m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( test_press( FL_BUTTON1 ) && | |||
Fl::event_x() >= Track::width() ) | |||
if ( Fl::event_x() < drawable_x() ) | |||
return 0; | |||
if ( test_press( FL_BUTTON1 ) ) | |||
{ | |||
timeline->wrlock(); | |||
@@ -383,52 +383,62 @@ Sequence::handle ( int m ) | |||
return 1; | |||
case FL_ENTER: | |||
// DMESSAGE( "enter" ); | |||
if ( Sequence_Widget::pushed() ) | |||
if ( Fl::event_x() >= drawable_x() ) | |||
{ | |||
if ( Sequence_Widget::pushed()->sequence()->class_name() == class_name() ) | |||
if ( Sequence_Widget::pushed() ) | |||
{ | |||
/* accept objects dragged from other sequences of this type */ | |||
timeline->wrlock(); | |||
add( Sequence_Widget::pushed() ); | |||
timeline->unlock(); | |||
damage( FL_DAMAGE_USER1 ); | |||
fl_cursor( FL_CURSOR_MOVE ); | |||
if ( Sequence_Widget::pushed()->sequence()->class_name() == class_name() ) | |||
{ | |||
/* accept objects dragged from other sequences of this type */ | |||
timeline->wrlock(); | |||
add( Sequence_Widget::pushed() ); | |||
timeline->unlock(); | |||
damage( FL_DAMAGE_USER1 ); | |||
fl_cursor( FL_CURSOR_MOVE ); | |||
} | |||
else | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
} | |||
else | |||
fl_cursor( FL_CURSOR_DEFAULT ); | |||
if ( ! event_widget() ) | |||
fl_cursor( cursor() ); | |||
Fl_Group::handle( m ); | |||
return 1; | |||
} | |||
else | |||
if ( ! event_widget() ) | |||
fl_cursor( cursor() ); | |||
Fl_Group::handle( m ); | |||
return 1; | |||
{ | |||
return Fl_Group::handle(m); | |||
} | |||
case FL_DND_ENTER: | |||
case FL_DND_LEAVE: | |||
case FL_DND_RELEASE: | |||
return 1; | |||
case FL_MOVE: | |||
{ | |||
Sequence_Widget *r = event_widget(); | |||
if ( r != Sequence_Widget::belowmouse() ) | |||
if ( Fl::event_x() >= drawable_x() ) | |||
{ | |||
if ( Sequence_Widget::belowmouse() ) | |||
Sequence_Widget::belowmouse()->handle( FL_LEAVE ); | |||
Sequence_Widget::belowmouse( r ); | |||
if ( r ) | |||
r->handle( FL_ENTER ); | |||
Sequence_Widget *r = event_widget(); | |||
if ( r != Sequence_Widget::belowmouse() ) | |||
{ | |||
if ( Sequence_Widget::belowmouse() ) | |||
Sequence_Widget::belowmouse()->handle( FL_LEAVE ); | |||
Sequence_Widget::belowmouse( r ); | |||
if ( r ) | |||
r->handle( FL_ENTER ); | |||
} | |||
return 1; | |||
} | |||
return 1; | |||
} | |||
default: | |||
{ | |||
@@ -1667,81 +1667,84 @@ Timeline::handle ( int m ) | |||
{ | |||
case FL_PUSH: | |||
{ | |||
if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) ) | |||
if ( | |||
Fl::event_x() >= Track::width() && | |||
( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) )) | |||
{ | |||
assert( ! drag ); | |||
drag = new Drag( X, Y ); | |||
_selection.x = X; | |||
_selection.y = Y; | |||
if ( ! Fl::event_ctrl() ) | |||
select_none(); | |||
return 1; | |||
} | |||
else if ( test_press( FL_BUTTON3 ) ) | |||
{ | |||
menu_popup( menu ); | |||
return 1; | |||
} | |||
return 0; | |||
} | |||
case FL_DRAG: | |||
{ | |||
int ox = X - drag->x; | |||
int oy = Y - drag->y; | |||
if ( ox < 0 ) | |||
_selection.x = X; | |||
if ( oy < 0 ) | |||
_selection.y = Y; | |||
_selection.w = abs( ox ); | |||
_selection.h = abs( oy ); | |||
return 0; | |||
case FL_DRAG: | |||
{ | |||
int ox = X - drag->x; | |||
int oy = Y - drag->y; | |||
if ( range ) | |||
{ | |||
range_start( x_to_offset( _selection.x ) ); | |||
range_end( x_to_offset( _selection.x + _selection.w ) ); | |||
redraw(); | |||
} | |||
if ( ox < 0 ) | |||
_selection.x = X; | |||
if ( oy < 0 ) | |||
_selection.y = Y; | |||
redraw_overlay(); | |||
return 1; | |||
_selection.w = abs( ox ); | |||
_selection.h = abs( oy ); | |||
break; | |||
} | |||
case FL_RELEASE: | |||
if ( range ) | |||
{ | |||
delete drag; | |||
drag = NULL; | |||
range_start( x_to_offset( _selection.x ) ); | |||
range_end( x_to_offset( _selection.x + _selection.w ) ); | |||
redraw(); | |||
} | |||
if ( range ) | |||
{ | |||
range_start( x_to_offset( _selection.x ) ); | |||
range_end( x_to_offset( _selection.x + _selection.w ) ); | |||
redraw(); | |||
} | |||
else | |||
select( _selection ); | |||
redraw_overlay(); | |||
return 1; | |||
_selection.x = _selection.y =_selection.w = _selection.h = 0; | |||
break; | |||
} | |||
case FL_RELEASE: | |||
{ | |||
delete drag; | |||
drag = NULL; | |||
redraw_overlay(); | |||
return 1; | |||
if ( range ) | |||
{ | |||
range_start( x_to_offset( _selection.x ) ); | |||
range_end( x_to_offset( _selection.x + _selection.w ) ); | |||
redraw(); | |||
} | |||
default: | |||
return 0; | |||
break; | |||
} | |||
else | |||
select( _selection ); | |||
return 0; | |||
_selection.x = _selection.y =_selection.w = _selection.h = 0; | |||
redraw_overlay(); | |||
return 1; | |||
} | |||
default: | |||
return 0; | |||
break; | |||
} | |||
return 0; | |||
} | |||
} | |||
} | |||
/** retrun a pointer to the track named /name/, or NULL if no track is named /name/ */ | |||
Track * | |||
@@ -706,6 +706,8 @@ Track::select ( int X, int Y, int W, int H, | |||
Sequence *t = sequence(); | |||
X -= Track::width(); | |||
if ( ! ( t->y() > Y + H || t->y() + t->h() < Y ) ) | |||
t->select_range( X, W ); | |||
else | |||