@@ -69,7 +69,7 @@ public: | |||
{ | |||
_sequence = sequence; | |||
_r->offset = when; | |||
_r->start = when; | |||
_label = strdup( name ); | |||
@@ -78,7 +78,7 @@ public: | |||
Annotation_Point ( const Annotation_Point &rhs ) | |||
{ | |||
_r->offset = rhs._r->offset; | |||
_r->start = rhs._r->start; | |||
_label = strdup( rhs._label ); | |||
} | |||
@@ -52,10 +52,10 @@ Annotation_Region::Annotation_Region ( Sequence *sequence, nframes_t when, const | |||
{ | |||
_sequence = sequence; | |||
_r->offset = when; | |||
_r->start = when; | |||
/* FIXME: hack */ | |||
_r->end = 400; | |||
_r->length = 400; | |||
_label = strdup( name ); | |||
@@ -64,7 +64,9 @@ Annotation_Region::Annotation_Region ( Sequence *sequence, nframes_t when, const | |||
Annotation_Region::Annotation_Region ( const Annotation_Region &rhs ) | |||
{ | |||
_r->offset = rhs._r->offset; | |||
_r->start = rhs._r->start; | |||
_r->length = rhs._r->length; | |||
_label = strdup( rhs._label ); | |||
} | |||
@@ -58,39 +58,62 @@ static Fl_Color fl_invert_color ( Fl_Color c ) | |||
} | |||
#if 0 | |||
/* perhaps use map? */ | |||
map_PRIM ( set ) | |||
void | |||
Audio_Region::get ( Log_Entry &e ) const | |||
{ | |||
/* if ( narg % 2 != 0 ) */ | |||
/* printf( "invalid number of arguments\n" ); */ | |||
int id = atoi( arg ); | |||
map_ARG_NEXT( arg, end ); | |||
e.add( ":source", _clip ? _clip->name() : "" ); | |||
e.add( ":gain", _scale ); | |||
e.add( ":fade-in-type", _fade_in.type ); | |||
e.add( ":fade-in-duration", _fade_in.length ); | |||
e.add( ":fade-out-type", _fade_out.type ); | |||
e.add( ":fade-out-duration", _fade_out.length ); | |||
e.add( ":color", (int)_box_color ); | |||
Logable *l = Loggable::find( id ); | |||
Sequence_Region::get( e ); | |||
char **sa = malloc( sizeof( char * ) * narg + 1 ); | |||
for ( int i = 0; i < narg; ++i ) | |||
sa[ i ] = strdup( map_ARG_NEXT( arg, end ) ); | |||
e.add( ":offset", _r->offset ); | |||
} | |||
l->set( sa ); | |||
void | |||
Audio_Region::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":gain" ) ) | |||
_scale = atof( v ); | |||
else if ( ! strcmp( s, ":color" ) ) | |||
_box_color = (Fl_Color)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-in-type" ) ) | |||
_fade_in.type = (Fade::fade_type_e)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-in-duration" ) ) | |||
_fade_in.length = atoll( v ); | |||
else if ( ! strcmp( s, ":fade-out-type" ) ) | |||
_fade_out.type = (Fade::fade_type_e)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-out-duration" ) ) | |||
_fade_out.length = atoll( v ); | |||
else if ( ! strcmp( s, ":offset" ) ) | |||
_r->offset = atoll( v ); | |||
else if ( ! strcmp( s, ":source" ) ) | |||
{ | |||
if ( ! ( _clip = Audio_File::from_file( v ) ) ) | |||
{ | |||
printf( "Grave error: could not open source \"%s\"\n", v ); | |||
} | |||
} | |||
} | |||
map_RESULT( "" ); | |||
Sequence_Region::set( e ); | |||
} | |||
#endif | |||
void | |||
Audio_Region::init ( void ) | |||
{ | |||
_sequence = NULL; | |||
_r->offset = 0; | |||
_r->start = 0; | |||
_r->end = 0; | |||
_scale = 1.0f; | |||
_clip = NULL; | |||
@@ -128,7 +151,7 @@ Audio_Region::Audio_Region ( Audio_File *c ) | |||
{ | |||
init(); | |||
_clip = c; | |||
_r->end = _clip->length(); | |||
_r->length = _clip->length(); | |||
log_create(); | |||
} | |||
@@ -139,9 +162,10 @@ Audio_Region::Audio_Region ( Audio_File *c, Sequence *t, nframes_t o ) | |||
{ | |||
init(); | |||
_clip = c; | |||
_r->end = _clip->length(); | |||
_sequence = t; | |||
_r->offset = o; | |||
_r->offset = 0; | |||
_r->start = o; | |||
_r->length = _clip->length(); | |||
sequence()->add( this ); | |||
@@ -172,7 +196,6 @@ int | |||
Audio_Region::handle ( int m ) | |||
{ | |||
static int ox, oy; | |||
static enum trim_e trimming; | |||
static bool copied = false; | |||
static nframes_t os; | |||
@@ -266,7 +289,7 @@ Audio_Region::handle ( int m ) | |||
ox = x() - X; | |||
oy = y() - Y; | |||
/* for panning */ | |||
os = _r->start; | |||
os = _r->offset; | |||
/* normalization and selection */ | |||
if ( Fl::event_button2() ) | |||
@@ -360,14 +383,10 @@ Audio_Region::handle ( int m ) | |||
int d = (ox + X) - x(); | |||
long td = timeline->x_to_ts( d ); | |||
nframes_t W = _r->end - _r->start; | |||
if ( td > 0 && os < td ) | |||
_r->start = 0; | |||
_r->offset = 0; | |||
else | |||
_r->start = os - td; | |||
_r->end = _r->start + W; | |||
_r->offset = os - td; | |||
sequence()->redraw(); | |||
return 1; | |||
@@ -390,6 +409,8 @@ Audio_Region::handle ( int m ) | |||
return Sequence_Widget::handle( m ); | |||
break; | |||
} | |||
return 0; | |||
} | |||
@@ -513,15 +534,14 @@ Audio_Region::draw ( void ) | |||
W += 4; | |||
int OX = scroll_x(); | |||
int ox = timeline->ts_to_x( _r->offset ); | |||
int ox = timeline->ts_to_x( _r->start ); | |||
if ( ox > OX + sequence()->w() || | |||
ox < OX && ox + abs_w() < OX ) | |||
/* not in viewport */ | |||
return; | |||
int rw = timeline->ts_to_x( _r->end - _r->start ); | |||
// nframes_t end = _r->offset + ( _r->end - _r->start ); | |||
int rw = timeline->ts_to_x( _r->length ); | |||
/* calculate waveform offset due to scrolling */ | |||
nframes_t offset = 0; | |||
@@ -545,7 +565,8 @@ Audio_Region::draw ( void ) | |||
// const nframes_t start = _r->start + offset + timeline->x_to_ts( X - rx ); | |||
nframes_t start = _r->start + offset; | |||
// nframes_t start = _r->start + offset; | |||
nframes_t start = _r->offset + offset; | |||
/* compensate for ??? */ | |||
if ( X - rx > 0 ) | |||
@@ -636,14 +657,10 @@ Audio_Region::draw ( void ) | |||
void | |||
Audio_Region::normalize ( void ) | |||
{ | |||
printf( "normalize: start=%lu end=%lu\n", _r->start, _r->end ); | |||
/* FIXME: figure out a way to do this via the peak server */ | |||
int peaks, channels; | |||
Peak *pbuf; | |||
if ( _clip->read_peaks( length(), _r->start, _r->end, &peaks, &pbuf, &channels ) && | |||
if ( _clip->read_peaks( length(), offset(), offset() + length(), &peaks, &pbuf, &channels ) && | |||
peaks ) | |||
_scale = pbuf->normalization_factor(); | |||
} | |||
@@ -710,10 +727,8 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe | |||
{ | |||
const Range r = _range; | |||
const nframes_t length = r.end - r.start; | |||
/* do nothing if we aren't covered by this frame range */ | |||
if ( pos > r.offset + length || pos + nframes < r.offset ) | |||
if ( pos > r.start + r.length || pos + nframes < r.start ) | |||
return 0; | |||
/* calculate offsets into file and sample buffer */ | |||
@@ -722,23 +737,23 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe | |||
cnt = nframes; | |||
if ( pos < r.offset ) | |||
if ( pos < r.start ) | |||
{ | |||
sofs = 0; | |||
ofs = r.offset - pos; | |||
ofs = r.start - pos; | |||
cnt -= ofs; | |||
} | |||
else | |||
{ | |||
ofs = 0; | |||
sofs = pos - r.offset; | |||
sofs = pos - r.start; | |||
} | |||
if ( ofs >= nframes ) | |||
return 0; | |||
// const nframes_t start = ofs + r.start + sofs; | |||
const nframes_t start = r.start + sofs; | |||
const nframes_t start = r.offset + sofs; | |||
const nframes_t len = min( cnt, nframes - ofs ); | |||
const nframes_t end = start + len; | |||
@@ -782,9 +797,9 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe | |||
/* do fade out if necessary */ | |||
// if ( start + cnt + fade.length > r.end ) | |||
if ( start + fade.length > r.end ) | |||
if ( start + fade.length > ( r.offset + r.length ) ) | |||
{ | |||
const nframes_t d = r.end - start; | |||
const nframes_t d = ( r.offset + r.length ) - start; | |||
assert( cnt <= nframes ); | |||
@@ -803,12 +818,12 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe | |||
nframes_t | |||
Audio_Region::write ( nframes_t nframes ) | |||
{ | |||
_range.end += nframes; | |||
_range.length += nframes; | |||
/* FIXME: too much? */ | |||
// _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), 10/* FIXME: guess */, h() ); | |||
if ( 0 == ( timeline->ts_to_x( _range.end ) % 20 ) ) | |||
if ( 0 == ( timeline->ts_to_x( _range.length ) % 20 ) ) | |||
{ | |||
nframes_t oldl = _clip->length(); | |||
@@ -851,7 +866,7 @@ Audio_Region::finalize ( nframes_t frame ) | |||
/* FIXME: should we attempt to truncate the file? */ | |||
_range.end = frame - _range.offset; | |||
_range.length = frame - _range.start - _range.offset; | |||
redraw(); | |||
@@ -102,53 +102,8 @@ private: | |||
protected: | |||
// const char *class_name ( void ) { return "Audio_Region"; } | |||
virtual void get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":source", _clip ? _clip->name() : "" ); | |||
e.add( ":gain", _scale ); | |||
e.add( ":fade-in-type", _fade_in.type ); | |||
e.add( ":fade-in-duration", _fade_in.length ); | |||
e.add( ":fade-out-type", _fade_out.type ); | |||
e.add( ":fade-out-duration", _fade_out.length ); | |||
e.add( ":color", (int)_box_color ); | |||
Sequence_Widget::get( e ); | |||
} | |||
void | |||
set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":gain" ) ) | |||
_scale = atof( v ); | |||
else if ( ! strcmp( s, ":color" ) ) | |||
_box_color = (Fl_Color)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-in-type" ) ) | |||
_fade_in.type = (Fade::fade_type_e)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-in-duration" ) ) | |||
_fade_in.length = atoll( v ); | |||
else if ( ! strcmp( s, ":fade-out-type" ) ) | |||
_fade_out.type = (Fade::fade_type_e)atoi( v ); | |||
else if ( ! strcmp( s, ":fade-out-duration" ) ) | |||
_fade_out.length = atoll( v ); | |||
else if ( ! strcmp( s, ":source" ) ) | |||
{ | |||
if ( ! ( _clip = Audio_File::from_file( v ) ) ) | |||
{ | |||
printf( "Grave error: could not open source \"%s\"\n", v ); | |||
} | |||
} | |||
} | |||
Sequence_Widget::set( e ); | |||
} | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
public: | |||
@@ -23,7 +23,7 @@ Control_Point::Control_Point ( Sequence *t, nframes_t when, float y ) | |||
{ | |||
_sequence = t; | |||
_y = y; | |||
_r->offset = when; | |||
_r->start = when; | |||
_box_color = FL_WHITE; | |||
log_create(); | |||
@@ -31,7 +31,7 @@ Control_Point::Control_Point ( Sequence *t, nframes_t when, float y ) | |||
Control_Point::Control_Point ( const Control_Point &rhs ) | |||
{ | |||
_r->offset = rhs._r->offset; | |||
_r->start = rhs._r->start; | |||
_y = rhs._y; | |||
} | |||
@@ -97,7 +97,7 @@ Sequence::overlaps ( Sequence_Widget *r ) | |||
for ( list <Sequence_Widget *>::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ ) | |||
{ | |||
if ( *i == r ) continue; | |||
if ( ! ( (*i)->offset() > r->offset() + r->length() || (*i)->offset() + (*i)->length() < r->offset() ) ) | |||
if ( ! ( (*i)->start() > r->start() + r->length() || (*i)->start() + (*i)->length() < r->start() ) ) | |||
return *i; | |||
} | |||
@@ -176,7 +176,7 @@ Sequence::event_widget ( void ) | |||
{ | |||
nframes_t ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ); | |||
for ( list <Sequence_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ ) | |||
if ( ets > (*r)->offset() && ets < (*r)->offset() + (*r)->length() ) | |||
if ( ets > (*r)->start() && ets < (*r)->start() + (*r)->length() ) | |||
return (*r); | |||
return NULL; | |||
@@ -189,7 +189,7 @@ Sequence::select_range ( int X, int W ) | |||
nframes_t ets = sts + timeline->x_to_ts( W ); | |||
for ( list <Sequence_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ ) | |||
if ( ! ( (*r)->offset() > ets || (*r)->offset() + (*r)->length() < sts ) ) | |||
if ( ! ( (*r)->start() > ets || (*r)->start() + (*r)->length() < sts ) ) | |||
(*r)->select(); | |||
} | |||
@@ -236,14 +236,14 @@ Sequence::snap ( Sequence_Widget *r ) | |||
if ( abs( rx1 - wx2 ) < snap_pixels ) | |||
{ | |||
r->offset( w->offset() + w->length() + 1 ); | |||
r->start( w->start() + w->length() + 1 ); | |||
return; | |||
} | |||
if ( abs( rx2 - wx1 ) < snap_pixels ) | |||
{ | |||
r->offset( ( w->offset() - r->length() ) - 1 ); | |||
r->start( ( w->start() - r->length() ) - 1 ); | |||
return; | |||
} | |||
@@ -252,10 +252,10 @@ Sequence::snap ( Sequence_Widget *r ) | |||
nframes_t f; | |||
if ( timeline->nearest_line( r->offset(), &f ) ) | |||
if ( timeline->nearest_line( r->start(), &f ) ) | |||
{ | |||
// printf( "snap frame is %lu\n", f ); | |||
r->offset( f ); | |||
r->start( f ); | |||
} | |||
} | |||
@@ -22,8 +22,7 @@ | |||
void | |||
Sequence_Point::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":x", _r->offset ); | |||
e.add( ":sequence", _sequence ); | |||
Sequence_Widget::get( e ); | |||
} | |||
void | |||
@@ -37,7 +36,7 @@ Sequence_Point::set ( Log_Entry &e ) | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( ":x", s ) ) | |||
if ( ! strcmp( ":start", s ) ) | |||
{ | |||
sequence()->sort(); | |||
} | |||
@@ -56,8 +56,6 @@ public: | |||
return sequence()->x() + sequence()->w() + abs_w(); | |||
else | |||
return x; | |||
} | |||
nframes_t length ( void ) const { return timeline->x_to_ts( abs_w() ); } | |||
@@ -20,6 +20,35 @@ | |||
#include "Sequence_Region.H" | |||
#include "Track.H" | |||
void | |||
Sequence_Region::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":color", (int)_box_color ); | |||
e.add( ":length", _r->length ); | |||
Sequence_Widget::get( e ); | |||
} | |||
void | |||
Sequence_Region::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":color" ) ) | |||
_box_color = (Fl_Color)atoll( v ); | |||
else if ( ! strcmp( s, ":length" ) ) | |||
_r->length = atoll( v ); | |||
} | |||
Sequence_Widget::set( e ); | |||
} | |||
void | |||
Sequence_Region::draw_box ( void ) | |||
@@ -53,14 +82,17 @@ Sequence_Region::trim ( enum trim_e t, int X ) | |||
long td = timeline->x_to_ts( d ); | |||
if ( td < 0 && _r->start < 0 - td ) | |||
td = 0 - _r->start; | |||
if ( td < 0 && _r->offset < 0 - td ) | |||
td = 0 - _r->offset; | |||
if ( td > 0 && td >= _r->length ) | |||
td = _r->length - timeline->x_to_ts( 1 ); | |||
if ( _r->start + td >= _r->end ) | |||
td = (_r->end - _r->start) - timeline->x_to_ts( 1 ); | |||
// td = _r->length - timeline->x_to_ts( 1 ); | |||
_r->start += td; | |||
_r->offset += td; | |||
_r->start += td; | |||
_r->length -= td; | |||
break; | |||
} | |||
case RIGHT: | |||
@@ -71,12 +103,12 @@ Sequence_Region::trim ( enum trim_e t, int X ) | |||
long td = timeline->x_to_ts( d ); | |||
// printf( "%li %li\n", td, _r->end - _r->start ); | |||
// printf( "%li %li\n", td, _r->length - _r->offset ); | |||
if ( td >= 0 && _r->end - _r->start < td ) | |||
_r->end = _r->start + timeline->x_to_ts( 1 ); | |||
if ( td >= 0 && _r->length < td ) | |||
_r->length = timeline->x_to_ts( 1 ); | |||
else | |||
_r->end -= td; | |||
_r->length -= td; | |||
break; | |||
} | |||
@@ -105,7 +137,7 @@ Sequence_Region::handle ( int m ) | |||
int ret; | |||
Logger _log( this ); | |||
//log_r->start(); | |||
//log_r->offset(); | |||
switch ( m ) | |||
{ | |||
@@ -23,36 +23,15 @@ | |||
#include "Sequence_Widget.H" | |||
/* Base class representing a /region/ of time on a /sequence/, with | |||
controls for the start and end points. */ | |||
controls for the offset and length points. */ | |||
class Sequence_Region : public Sequence_Widget | |||
{ | |||
protected: | |||
virtual void get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":color", (int)_box_color ); | |||
Sequence_Widget::get( e ); | |||
} | |||
void | |||
virtual set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":color" ) ) | |||
_box_color = (Fl_Color)atoll( v ); | |||
} | |||
Sequence_Widget::set( e ); | |||
} | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
Sequence_Region ( ) | |||
{ | |||
@@ -33,6 +33,58 @@ Sequence_Widget * Sequence_Widget::_pushed = NULL; | |||
Sequence_Widget * Sequence_Widget::_belowmouse = NULL; | |||
Fl_Color Sequence_Widget::_selection_color = FL_MAGENTA; | |||
void | |||
Sequence_Widget::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":start", _r->start ); | |||
// e.add( ":offset", _r->offset ); | |||
// e.add( ":length", _r->length ); | |||
e.add( ":sequence", _sequence ); | |||
e.add( ":selected", selected() ); | |||
} | |||
void | |||
Sequence_Widget::set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":start" ) ) | |||
_r->start = atoll( v ); | |||
// else if ( ! strcmp( s, ":offset" ) ) | |||
// _r->offset = atoll( v ); | |||
// else if ( ! strcmp( s, ":length" ) ) | |||
// _r->length = atoll( v ); | |||
else if ( ! strcmp( s, ":selected" ) ) | |||
{ | |||
if ( atoi( v ) ) | |||
select(); | |||
else | |||
deselect(); | |||
} | |||
else if ( ! strcmp( s, ":sequence" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Sequence *t = (Sequence*)Loggable::find( i ); | |||
assert( t ); | |||
t->add( this ); | |||
} | |||
// else | |||
// e.erase( i ); | |||
} | |||
if ( _sequence ) | |||
_sequence->redraw(); | |||
} | |||
void | |||
Sequence_Widget::draw_label ( const char *label, Fl_Align align, Fl_Color color ) | |||
{ | |||
@@ -172,7 +224,7 @@ Sequence_Widget::handle ( int m ) | |||
case FL_RELEASE: | |||
if ( _drag ) | |||
{ | |||
end_drag(); | |||
length_drag(); | |||
_log.release(); | |||
} | |||
@@ -194,15 +246,15 @@ Sequence_Widget::handle ( int m ) | |||
{ | |||
const nframes_t of = timeline->x_to_offset( X ); | |||
if ( of >= _drag->offset ) | |||
if ( of >= _drag->start ) | |||
{ | |||
_r->offset = of - _drag->offset; | |||
_r->start = of - _drag->start; | |||
if ( Sequence_Widget::_current == this ) | |||
sequence()->snap( this ); | |||
} | |||
else | |||
_r->offset = 0; | |||
_r->start = 0; | |||
} | |||
@@ -30,21 +30,21 @@ class Sequence_Widget; | |||
struct Drag | |||
{ | |||
/* mouse coords at start of drag */ | |||
/* mouse coords at offset of drag */ | |||
int x; | |||
int y; | |||
int state; | |||
nframes_t offset; | |||
nframes_t start; | |||
Drag( int X, int Y, nframes_t offset=0 ) : x( X ), y( Y ), offset( offset ) { state = 0; } | |||
Drag( int X, int Y, nframes_t start=0 ) : x( X ), y( Y ), start( start ) { state = 0; } | |||
}; | |||
struct Range | |||
{ | |||
nframes_t offset; /* where on the timeline */ | |||
nframes_t start; /* first sample from clip */ | |||
nframes_t end; /* last sample from clip */ | |||
nframes_t start; /* where on the timeline */ | |||
nframes_t offset; /* first sample from clip */ | |||
nframes_t length; /* total number of samples */ | |||
}; | |||
/* Base class for virtual widget on a track */ | |||
@@ -79,56 +79,8 @@ protected: | |||
Drag *_drag; | |||
virtual void get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":x", _r->offset ); | |||
e.add( ":l", _r->start ); | |||
e.add( ":r", _r->end ); | |||
e.add( ":sequence", _sequence ); | |||
e.add( ":selected", selected() ); | |||
} | |||
virtual void | |||
set ( Log_Entry &e ) | |||
{ | |||
for ( int i = 0; i < e.size(); ++i ) | |||
{ | |||
const char *s, *v; | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":x" ) ) | |||
_r->offset = atoll( v ); | |||
else if ( ! strcmp( s, ":l" ) ) | |||
_r->start = atoll( v ); | |||
else if ( ! strcmp( s, ":r" ) ) | |||
_r->end = atoll( v ); | |||
else if ( ! strcmp( s, ":selected" ) ) | |||
{ | |||
if ( atoi( v ) ) | |||
select(); | |||
else | |||
deselect(); | |||
} | |||
else if ( ! strcmp( s, ":sequence" ) ) | |||
{ | |||
int i; | |||
sscanf( v, "%X", &i ); | |||
Sequence *t = (Sequence*)Loggable::find( i ); | |||
assert( t ); | |||
t->add( this ); | |||
} | |||
// else | |||
// e.erase( i ); | |||
} | |||
if ( _sequence ) | |||
_sequence->redraw(); | |||
} | |||
virtual void get ( Log_Entry &e ) const; | |||
virtual void set ( Log_Entry &e ); | |||
public: | |||
@@ -138,7 +90,7 @@ public: | |||
_r = &_range; | |||
_r->offset = _r->start = _r->end = 0; | |||
_r->start = _r->offset = _r->length = 0; | |||
_drag = NULL; | |||
@@ -234,7 +186,7 @@ public: | |||
_r = new Range( _range ); | |||
} | |||
void end_drag ( void ) | |||
void length_drag ( void ) | |||
{ | |||
_range = *_r; | |||
delete _r; | |||
@@ -245,26 +197,26 @@ public: | |||
} | |||
void | |||
offset ( nframes_t where ) | |||
start ( nframes_t where ) | |||
{ | |||
if ( ! selected() ) | |||
{ | |||
redraw(); | |||
_r->offset = where; | |||
_r->start = where; | |||
} | |||
else | |||
{ | |||
long d = where - _r->offset; | |||
long d = where - _r->start; | |||
for ( list <Sequence_Widget *>::iterator i = _selection.begin(); i != _selection.end(); i++ ) | |||
{ | |||
(*i)->redraw(); | |||
if ( d < 0 ) | |||
(*i)->_r->offset -= 0 - d; | |||
(*i)->_r->start -= 0 - d; | |||
else | |||
(*i)->_r->offset += d; | |||
(*i)->_r->start += d; | |||
} | |||
} | |||
@@ -284,18 +236,18 @@ public: | |||
/* used by regions */ | |||
virtual int x ( void ) const | |||
{ | |||
return _r->offset < timeline->xoffset ? _sequence->x() : min( _sequence->x() + _sequence->w(), _sequence->x() + timeline->ts_to_x( _r->offset - timeline->xoffset ) ); | |||
return _r->start < timeline->xoffset ? _sequence->x() : min( _sequence->x() + _sequence->w(), _sequence->x() + timeline->ts_to_x( _r->start - timeline->xoffset ) ); | |||
} | |||
/* use this as x() when you need to draw lines between widgets */ | |||
int line_x ( void ) const | |||
{ | |||
return _r->offset < timeline->xoffset ? max( -32768, _sequence->x() - timeline->ts_to_x( timeline->xoffset - _r->offset )) : min( 32767, _sequence->x() + timeline->ts_to_x( _r->offset - timeline->xoffset ) ); | |||
return _r->start < timeline->xoffset ? max( -32768, _sequence->x() - timeline->ts_to_x( timeline->xoffset - _r->start )) : min( 32767, _sequence->x() + timeline->ts_to_x( _r->start - timeline->xoffset ) ); | |||
} | |||
virtual int w ( void ) const | |||
{ | |||
int tx = timeline->ts_to_x( _r->offset ); | |||
int tx = timeline->ts_to_x( _r->start ); | |||
int rw; | |||
if ( tx < scroll_x() ) | |||
@@ -306,8 +258,8 @@ public: | |||
return min( rw, _sequence->w() ); | |||
} | |||
int abs_x ( void ) const { return timeline->ts_to_x( _r->offset ); } | |||
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->end - _r->start ); } | |||
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); } | |||
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->length ); } | |||
Fl_Color color ( void ) const { return _color; } | |||
void color ( Fl_Color v ) { _color = v; } | |||
@@ -318,22 +270,21 @@ public: | |||
Sequence * sequence ( void ) const { return _sequence; } | |||
void sequence ( Sequence *t ) { _sequence = t; } | |||
nframes_t offset ( void ) const { return _r->offset; } | |||
// void offset ( nframes_t o ) { _r->offset = o; } | |||
void end ( nframes_t v ) { _r->end = v; } | |||
nframes_t end ( void ) const { return _r->end; } | |||
void start ( nframes_t v ) { _r->start = v; } | |||
nframes_t start ( void ) const { return _r->start; } | |||
// void start ( nframes_t o ) { _r->start = o; } | |||
void length ( nframes_t v ) { _r->length = v; } | |||
virtual nframes_t length ( void ) const { return _r->length; } | |||
void offset ( nframes_t v ) { _r->offset = v; } | |||
nframes_t offset ( void ) const { return _r->offset; } | |||
/** convert a screen x coord into an offset into the region */ | |||
/** convert a screen x coord into an start into the region */ | |||
nframes_t x_to_offset ( int X ) | |||
{ | |||
return timeline->x_to_ts( scroll_x() + ( X - _sequence->x() ) ) - _r->offset; | |||
return timeline->x_to_ts( scroll_x() + ( X - _sequence->x() ) ) - _r->start; | |||
} | |||
int active_r ( void ) const { return _sequence->active_r(); } | |||
virtual nframes_t length ( void ) const { return _r->end - _r->start; } | |||
virtual Fl_Boxtype box ( void ) const { return FL_UP_BOX; } | |||
virtual Fl_Align align ( void ) const { return (Fl_Align)0; } | |||
@@ -366,13 +317,13 @@ public: | |||
bool | |||
operator< ( const Sequence_Widget & rhs ) | |||
{ | |||
return _r->offset < rhs._r->offset; | |||
return _r->start < rhs._r->start; | |||
} | |||
bool | |||
operator<=( const Sequence_Widget & rhs ) | |||
{ | |||
return _r->offset <= rhs._r->offset; | |||
return _r->start <= rhs._r->start; | |||
} | |||
virtual void draw_label ( const char *label, Fl_Align align, Fl_Color color=(Fl_Color)0 ); | |||
@@ -25,7 +25,7 @@ | |||
void | |||
Tempo_Point::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":x", _r->offset ); | |||
e.add( ":start", _r->offset ); | |||
e.add( ":tempo", _tempo ); | |||
} | |||
@@ -38,7 +38,7 @@ Tempo_Point::set ( Log_Entry &e ) | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":x" ) ) | |||
if ( ! strcmp( s, ":start" ) ) | |||
_r->offset = atol( v ); | |||
else if ( ! strcmp( s, ":tempo" ) ) | |||
_tempo = atof( v ); | |||
@@ -24,7 +24,7 @@ | |||
void | |||
Time_Point::get ( Log_Entry &e ) const | |||
{ | |||
e.add( ":x", _r->offset ); | |||
e.add( ":start", _r->offset ); | |||
e.add( ":beats_per_bar", _time.beats_per_bar ); | |||
e.add( ":beat_type", _time.beat_type ); | |||
} | |||
@@ -38,7 +38,7 @@ Time_Point::set ( Log_Entry &e ) | |||
e.get( i, &s, &v ); | |||
if ( ! strcmp( s, ":x" ) ) | |||
if ( ! strcmp( s, ":start" ) ) | |||
_r->offset = atol( v ); | |||
else if ( ! strcmp( s, ":beats_per_bar" ) ) | |||
_time.beats_per_bar = atoi( v ); | |||