Browse Source

Work on handling selection.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
4f2a6a28d1
5 changed files with 77 additions and 24 deletions
  1. +0
    -1
      Loggable.C
  2. +6
    -8
      Track.C
  3. +4
    -5
      Track.H
  4. +48
    -9
      Track_Widget.C
  5. +19
    -1
      Track_Widget.H

+ 0
- 1
Loggable.C View File

@@ -361,7 +361,6 @@ Loggable::flush ( void )
if ( n > 1 )
fprintf( _fp, "}\n" );


fflush( _fp );
}



+ 6
- 8
Track.C View File

@@ -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;
}



+ 4
- 5
Track.H View File

@@ -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 );


+ 48
- 9
Track_Widget.C View File

@@ -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();


+ 19
- 1
Track_Widget.H View File

@@ -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 ); }


Loading…
Cancel
Save