Try to use part of FLTK's DND system for inter-track region dragging.

pull/3/head
Jonathan Moore Liles 2008-03-08 18:38:34 -06:00
parent 9a01389624
commit e0e6cb7379
8 changed files with 37 additions and 32 deletions

View File

@ -55,18 +55,24 @@ Audio_Track::handle ( int m )
{
switch ( m )
{
case FL_DND_DRAG:
case FL_DND_ENTER:
case FL_ENTER:
// dump();
return 1;
case FL_DND_LEAVE:
case FL_DND_DRAG:
return Track::handle( m ) | 1;
/* case FL_DND_ENTER: */
/* case FL_DND_LEAVE: */
case FL_DND_RELEASE:
return 1;
case FL_PASTE:
{
const char *text = Fl::event_text();
if ( ! strcmp( text, "Region" ) )
return 0;
char *file;
if ( ! sscanf( text, "file://%a[^\r\n]\n", &file ) )

View File

@ -33,6 +33,8 @@ public:
{
}
const char *class_name ( void ) { return "Audio_Track"; }
int handle ( int m );
void dump ( void );
void remove_selected ( void );

View File

@ -27,11 +27,14 @@ class Control_Track : public Track
public:
Control_Track ( int X, int Y, int W, int H ) : Track( X, Y, W, H )
{
color( fl_darker( FL_GREEN ) );
}
const char *class_name ( void ) { return "Control_Track"; }
void
draw ( void )
{

View File

@ -380,16 +380,14 @@ Region::handle ( int m )
{
if ( Y > y() + h() )
{
if ( _track->next() )
if ( Y > _track->next()->y() )
_track->next()->add( this );
Fl::copy( class_name(), strlen( class_name() ), 0 );
Fl::dnd();
}
else
if ( Y < y() )
{
if ( _track->prev() )
if ( Y < _track->prev()->y() + _track->prev()->h() )
_track->prev()->add( this );
Fl::copy( class_name(), strlen( class_name() ), 0 );
Fl::dnd();
}
}

View File

@ -151,17 +151,11 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi
o->type( Fl_Pack::VERTICAL );
o->spacing( 0 );
Track *l = NULL;
for ( int i = 8; i--; )
{
// Track_Header *t = new Track_Header( 0, 0, W, 75 );
Track_Header *t = new Track_Header( 0, 0, W, 30 );
Track *o = new Audio_Track( 0, 0, 1, 100 );
o->prev( l );
if ( l )
l->next( o );
l = o;
// o->end();
t->track( o );
t->add( new Audio_Track( 0, 0, 1, 100 ) );

17
Track.C
View File

@ -26,6 +26,7 @@
queue <Track_Widget *> Track::_delete_queue;
Track_Widget *Track::pushed = NULL;
void
Track::sort ( void )
@ -240,17 +241,23 @@ done:
int
Track::handle ( int m )
{
static Track_Widget *pushed;
// static Track_Widget *pushed;
static Track_Widget *belowmouse;
switch ( m )
{
case FL_ENTER:
case FL_LEAVE:
case FL_DND_ENTER:
printf( "enter\n" );
if ( pushed && pushed->track()->class_name() == class_name() )
{
printf( "%s -> %s\n", pushed->track()->class_name(), class_name() );
add( pushed );
redraw();
}
case FL_DND_LEAVE:
return 1;
case FL_MOVE:
{
/* these aren't used, so don't bother doing lookups for them */
Track_Widget *r = event_widget();
if ( r != belowmouse )
@ -263,7 +270,7 @@ Track::handle ( int m )
r->handle( FL_ENTER );
}
return 1;
return 0;
}
default:
{

12
Track.H
View File

@ -38,18 +38,18 @@ class Track_Widget;
class Track : public Fl_Group, public Loggable
{
Track *_next;
Track *_prev;
char *_name;
static queue <Track_Widget *> _delete_queue;
static Track_Widget *pushed;
protected:
list <Track_Widget *> _widgets;
Track_Widget *event_widget ( void );
const char *class_name ( void ) { return "Track"; }
virtual const char *class_name ( void ) { return "Track"; }
void set ( char ** ) { return; }
@ -83,7 +83,6 @@ public:
Track ( int X, int Y, int W, int H ) : Fl_Group( X, Y, W, H )
{
_next = _prev = NULL;
_name = NULL;
box( FL_DOWN_BOX );
@ -102,11 +101,6 @@ public:
log_destroy();
}
Track *next ( void ) const { return _next; }
Track *prev ( void ) const { return _prev; }
void prev ( Track *t ) { _prev = t; }
void next ( Track *t ) { _next = t; }
const char * name ( void ) const { return _name; }
void name ( char *s ) { if ( _name ) free( _name ); _name = s; }

View File

@ -169,6 +169,7 @@ Track_Widget::handle ( int m )
return 1;
case FL_DRAG:
case FL_DND_DRAG:
{
if ( ! _drag )
{