Browse Source

Make rubberband selection work.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
ed25a70aef
5 changed files with 103 additions and 42 deletions
  1. +57
    -32
      Timeline.C
  2. +16
    -0
      Timeline.H
  3. +12
    -1
      Track.C
  4. +2
    -0
      Track.H
  5. +16
    -9
      Track_Widget.H

+ 57
- 32
Timeline.C View File

@@ -346,7 +346,7 @@ Timeline::draw ( void )
draw_child( *hscroll ); draw_child( *hscroll );
draw_child( *vscroll ); draw_child( *vscroll );


// redraw_overlay();
redraw_overlay();
return; return;
} }


@@ -392,23 +392,34 @@ Timeline::draw ( void )
void void
Timeline::draw_overlay ( void ) Timeline::draw_overlay ( void )
{ {
fl_color( FL_BLUE );
fl_line_style( FL_DOT, 4 );


// TODO: draw selection rectangle here!
fl_rect( _selection.x, _selection.y, _selection.w, _selection.h );


fl_line_style( FL_SOLID, 0 );


/* fl_color( FL_BLUE ); */
/* fl_line_style( FL_DOT, 4 ); */
}


/* fl_rect( 300, 400, 200, 300 ); */
// #include "Track_Widget.H"


/* fl_line_style( FL_SOLID, 0 ); */
/** select all widgets in inside rectangle /r/ */
void
Timeline::select( const Rectangle &r )
{
for ( int i = tracks->children(); i-- ; )
{
Track_Header *t = (Track_Header*)tracks->child( i );


if ( t->y() >= r.y && t->y() + t->h() <= r.y + r.h )
t->track()->select_range( r.x, r.w );
}
} }



int int
Timeline::handle ( int m ) Timeline::handle ( int m )
{ {
static Drag *drag = NULL;


switch ( m ) switch ( m )
{ {
@@ -418,43 +429,57 @@ Timeline::handle ( int m )
{ {
case FL_Delete: case FL_Delete:
{ {

/* for ( int i = tracks->children(); i--; ) */
/* { */
/* Track_Header *t = (Track_Header*)tracks->child( i ); */

/* t->track()->remove_selected(); */
/* } */

Track_Widget::delete_selected(); Track_Widget::delete_selected();


return 1; return 1;

} }

} }
}

/* case FL_MOUSEWHEEL: */
/* { */


/* // vscroll->deactivate(); */
return 0;
}
default:
{
int r = Fl_Overlay_Window::handle( m );


/* int r = Fl_Overlay_Window::handle( m ); */
if ( r )
return r;


/* /\* vscroll->activate(); *\/ */
const int X = Fl::event_x();
const int Y = Fl::event_y();


/* if ( r ) */
/* return r; */
switch ( m )
{
case FL_PUSH:
{
drag = new Drag( X - x(), Y - y() );
_selection.x = drag->x;
_selection.y = drag->y;
break;
}
case FL_DRAG:
{
_selection.w = X - drag->x;
_selection.h = Y - drag->y;
break;
}
case FL_RELEASE:
{
delete drag;
drag = NULL;


/* /\* if ( hscroll->handle( m ) ) *\/ */
/* /\* return 1; *\/ */
select( _selection );


/* /\* return vscroll->handle( m ); *\/ */
_selection.w = _selection.h = 0;
break;
}
default:
return 0;
break;
}


/* } */
default:
return Fl_Overlay_Window::handle( m );
redraw_overlay();
return 1;
}
} }


} }

+ 16
- 0
Timeline.H View File

@@ -49,6 +49,18 @@ class Time_Track;
#include <list> #include <list>
using std::list; using std::list;



struct Rectangle
{
int x;
int y;
int w;
int h;

Rectangle ( ) : x( 0 ), y( 0 ), w( 0 ), h( 0 ) {}
Rectangle ( int X, int Y, int W, int H ) : x( X ), y( Y ), w( W ), h( H ) {}
};

struct Timeline : public Fl_Overlay_Window struct Timeline : public Fl_Overlay_Window
{ {


@@ -57,6 +69,8 @@ struct Timeline : public Fl_Overlay_Window
int _old_xposition; int _old_xposition;
int _old_yposition; int _old_yposition;


Rectangle _selection;

bool _enable_measure_lines; bool _enable_measure_lines;


enum snap_flags_e { enum snap_flags_e {
@@ -117,4 +131,6 @@ struct Timeline : public Fl_Overlay_Window
void draw_overlay ( void ); void draw_overlay ( void );
int handle ( int m ); int handle ( int m );


void select( const Rectangle &r );

}; };

+ 12
- 1
Track.C View File

@@ -102,7 +102,7 @@ Track::remove_selected ( void )
Track_Widget * Track_Widget *
Track::event_widget ( void ) Track::event_widget ( void )
{ {
int ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() );
nframes_t ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() );
for ( list <Track_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ ) for ( list <Track_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ )
if ( ets > (*r)->offset() && ets < (*r)->offset() + (*r)->length() ) if ( ets > (*r)->offset() && ets < (*r)->offset() + (*r)->length() )
return (*r); return (*r);
@@ -110,6 +110,17 @@ Track::event_widget ( void )
return NULL; return NULL;
} }


void
Track::select_range ( int X, int W )
{
nframes_t sts = timeline->xoffset + timeline->x_to_ts( X - x() );
nframes_t ets = sts + timeline->x_to_ts( W );

for ( list <Track_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ )
if ( ! ( (*r)->offset() > ets || (*r)->offset() + (*r)->length() < sts ) )
(*r)->select();
}

void void
Track::add ( Track_Widget *r ) Track::add ( Track_Widget *r )
{ {


+ 2
- 0
Track.H View File

@@ -113,6 +113,8 @@ public:
void remove ( Track_Widget *r ); void remove ( Track_Widget *r );
void add ( Track_Widget *r ); void add ( Track_Widget *r );


void select_range ( int X, int W );

void remove_selected ( void ); void remove_selected ( void );


const list <Track_Widget *> widgets ( void ) const { return _widgets; } const list <Track_Widget *> widgets ( void ) const { return _widgets; }


+ 16
- 9
Track_Widget.H View File

@@ -27,6 +27,16 @@
#include <algorithm> #include <algorithm>
using namespace std; using namespace std;


struct Drag
{
/* mouse coords at start of drag */
int x;
int y;
int state;

Drag( int X, int Y ) : x( X ), y( Y ) { state = 0; }
};

/* Base class for virtual widget on a track */ /* Base class for virtual widget on a track */
class Track_Widget : public Loggable class Track_Widget : public Loggable
{ {
@@ -45,15 +55,6 @@ protected:
Fl_Color _color; /* color of waveform */ Fl_Color _color; /* color of waveform */
Fl_Color _box_color; /* color of background (box) */ Fl_Color _box_color; /* color of background (box) */


struct Drag
{
/* mouse coords at start of drag */
int x;
int y;
int state;

Drag( int X, int Y ) : x( X ), y( Y ) { state = 0; }
};


Drag *_drag; Drag *_drag;


@@ -84,12 +85,18 @@ public:


void select ( void ) void select ( void )
{ {
if ( selected() )
return;

_selection.push_back( this ); _selection.push_back( this );

redraw();
} }


void deselect ( void ) void deselect ( void )
{ {
_selection.remove( this ); _selection.remove( this );
redraw();
} }






Loading…
Cancel
Save