Timeline: Rework widget hierarchy for track display. Also, adjust timeline locking.
This commit is contained in:
parent
44f0aa7f35
commit
e1d706b5ed
|
@ -60,7 +60,7 @@ protected:
|
||||||
|
|
||||||
Annotation_Sequence ( ) : Sequence ( 0 )
|
Annotation_Sequence ( ) : Sequence ( 0 )
|
||||||
{
|
{
|
||||||
color( fl_darker( FL_GREEN ) );
|
color( FL_DARK1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -72,16 +72,12 @@ public:
|
||||||
|
|
||||||
Annotation_Sequence ( Track *track ) : Sequence( track )
|
Annotation_Sequence ( Track *track ) : Sequence( track )
|
||||||
{
|
{
|
||||||
color( fl_darker( FL_GREEN ) );
|
color( FL_DARK1 );
|
||||||
|
|
||||||
log_create();
|
log_create();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Annotation_Sequence ( int X, int Y, int W, int H ) : Sequence ( 0 ) */
|
virtual ~Annotation_Sequence ( )
|
||||||
/* { */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
~Annotation_Sequence ( )
|
|
||||||
{
|
{
|
||||||
Loggable::block_start();
|
Loggable::block_start();
|
||||||
|
|
||||||
|
@ -108,12 +104,12 @@ public:
|
||||||
|
|
||||||
if ( Fl::event_button1() )
|
if ( Fl::event_button1() )
|
||||||
{
|
{
|
||||||
add( new Annotation_Point( this, x_to_offset( Fl::event_x() ), "mark" ) );
|
add( new Annotation_Point( this, x_to_offset( Fl::event_x() - drawable_x() ), "mark" ) );
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
if ( Fl::event_button3() && Fl::event_shift() )
|
if ( Fl::event_button3() && Fl::event_shift() )
|
||||||
{
|
{
|
||||||
Annotation_Region *r = new Annotation_Region( this, x_to_offset( Fl::event_x() ), "mark" );
|
Annotation_Region *r = new Annotation_Region( this, x_to_offset( Fl::event_x() - drawable_x() ), "mark" );
|
||||||
|
|
||||||
add( r );
|
add( r );
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ using namespace std;
|
||||||
|
|
||||||
#include "Engine/Audio_File.H" // for ::from_file()
|
#include "Engine/Audio_File.H" // for ::from_file()
|
||||||
#include "Transport.H" // for locate()
|
#include "Transport.H" // for locate()
|
||||||
|
#include "Track_Header.H"
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <unistd.h> // for symlink()
|
#include <unistd.h> // for symlink()
|
||||||
|
@ -44,10 +44,67 @@ using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
Audio_Sequence::name ( void ) const
|
||||||
|
{
|
||||||
|
return Sequence::name();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Audio_Sequence::name ( const char *s )
|
||||||
|
{
|
||||||
|
Sequence::name( s );
|
||||||
|
header()->name_input->value( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Audio_Sequence::cb_button ( Fl_Widget *w, void *v )
|
||||||
|
{
|
||||||
|
((Audio_Sequence*)v)->cb_button( w );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Audio_Sequence::cb_button ( Fl_Widget *w )
|
||||||
|
{
|
||||||
|
Logger log(this);
|
||||||
|
|
||||||
|
if ( w == header()->name_input )
|
||||||
|
{
|
||||||
|
Sequence::name( header()->name_input->value() );
|
||||||
|
}
|
||||||
|
else if ( w == header()->delete_button )
|
||||||
|
{
|
||||||
|
track()->remove( this );
|
||||||
|
}
|
||||||
|
else if ( w == header()->promote_button )
|
||||||
|
{
|
||||||
|
track()->sequence( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Audio_Sequence::init ( void )
|
||||||
|
{
|
||||||
|
labeltype( FL_NO_LABEL );
|
||||||
|
{
|
||||||
|
Audio_Sequence_Header *o = new Audio_Sequence_Header( x(), y(), Track::width(), 52 );
|
||||||
|
|
||||||
|
o->name_input->callback( cb_button, this );
|
||||||
|
o->delete_button->callback( cb_button, this );
|
||||||
|
o->promote_button->callback( cb_button, this );
|
||||||
|
|
||||||
|
Fl_Group::add( o );
|
||||||
|
}
|
||||||
|
|
||||||
|
resizable(0);
|
||||||
|
}
|
||||||
|
|
||||||
Audio_Sequence::Audio_Sequence ( Track *track, const char *name ) : Sequence( track )
|
Audio_Sequence::Audio_Sequence ( Track *track, const char *name ) : Sequence( track )
|
||||||
{
|
{
|
||||||
_track = track;
|
_track = track;
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
if ( name )
|
if ( name )
|
||||||
Audio_Sequence::name( name );
|
Audio_Sequence::name( name );
|
||||||
else
|
else
|
||||||
|
@ -71,10 +128,6 @@ Audio_Sequence::Audio_Sequence ( Track *track, const char *name ) : Sequence( tr
|
||||||
track->add( this );
|
track->add( this );
|
||||||
|
|
||||||
log_create();
|
log_create();
|
||||||
|
|
||||||
/* FIXME: temporary */
|
|
||||||
labeltype( FL_NO_LABEL );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -155,7 +208,7 @@ Audio_Sequence::draw ( void )
|
||||||
|
|
||||||
int xfades = 0;
|
int xfades = 0;
|
||||||
|
|
||||||
fl_push_clip( x(), y(), w(), h() );
|
fl_push_clip( drawable_x(), y(), drawable_w(), h() );
|
||||||
|
|
||||||
/* draw crossfades */
|
/* draw crossfades */
|
||||||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "Audio_Region.H"
|
#include "Audio_Region.H"
|
||||||
|
|
||||||
#include <FL/Fl_Input.H>
|
#include <FL/Fl_Input.H>
|
||||||
|
class Audio_Sequence_Header;
|
||||||
|
|
||||||
class Audio_Sequence : public Sequence
|
class Audio_Sequence : public Sequence
|
||||||
{
|
{
|
||||||
|
@ -36,18 +37,25 @@ protected:
|
||||||
|
|
||||||
Audio_Sequence ( ) : Sequence( 0 )
|
Audio_Sequence ( ) : Sequence( 0 )
|
||||||
{
|
{
|
||||||
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_widget_change ( nframes_t start, nframes_t length );
|
void handle_widget_change ( nframes_t start, nframes_t length );
|
||||||
|
|
||||||
void draw ( void );
|
void draw ( void );
|
||||||
int handle ( int m );
|
int handle ( int m );
|
||||||
|
|
||||||
|
static void cb_button ( Fl_Widget *w, void *v );
|
||||||
|
void cb_button ( Fl_Widget *w );
|
||||||
|
|
||||||
|
void init ( void );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
LOG_CREATE_FUNC( Audio_Sequence );
|
LOG_CREATE_FUNC( Audio_Sequence );
|
||||||
|
|
||||||
|
Audio_Sequence_Header * header ( void ) { return (Audio_Sequence_Header*)child(0); }
|
||||||
|
|
||||||
Audio_Sequence ( Track *track, const char *name = 0 );
|
Audio_Sequence ( Track *track, const char *name = 0 );
|
||||||
~Audio_Sequence ( );
|
~Audio_Sequence ( );
|
||||||
|
|
||||||
|
@ -67,6 +75,9 @@ public:
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void name ( const char *s );
|
||||||
|
virtual const char *name ( void ) const;
|
||||||
|
|
||||||
const Audio_Region *capture_region ( void ) const;
|
const Audio_Region *capture_region ( void ) const;
|
||||||
|
|
||||||
nframes_t play ( sample_t *buf, nframes_t frame, nframes_t nframes, int channels );
|
nframes_t play ( sample_t *buf, nframes_t frame, nframes_t nframes, int channels );
|
||||||
|
|
|
@ -72,14 +72,11 @@ void
|
||||||
Control_Point::draw_box ( void )
|
Control_Point::draw_box ( void )
|
||||||
{
|
{
|
||||||
if ( selected() )
|
if ( selected() )
|
||||||
{
|
|
||||||
fl_color( selection_color() );
|
fl_color( selection_color() );
|
||||||
fl_pie( x(), y(), w(), h(), 0, 360 );
|
else
|
||||||
}
|
fl_color( box_color() );
|
||||||
|
|
||||||
fl_color( box_color() );
|
fl_pie( x() - w() / 2, y() - h() / 2, w(), h(), 0, 360 );
|
||||||
|
|
||||||
fl_arc( x(), y(), w(), h(), 0, 360 );
|
|
||||||
|
|
||||||
if ( this == Sequence_Widget::belowmouse() ||
|
if ( this == Sequence_Widget::belowmouse() ||
|
||||||
this == Sequence_Widget::pushed() )
|
this == Sequence_Widget::pushed() )
|
||||||
|
@ -111,19 +108,11 @@ Control_Point::handle ( int m )
|
||||||
|
|
||||||
switch ( m )
|
switch ( m )
|
||||||
{
|
{
|
||||||
|
|
||||||
case FL_RELEASE:
|
case FL_RELEASE:
|
||||||
sequence()->sort();
|
|
||||||
redraw();
|
|
||||||
break;
|
|
||||||
case FL_ENTER:
|
|
||||||
case FL_LEAVE:
|
|
||||||
redraw();
|
redraw();
|
||||||
break;
|
break;
|
||||||
case FL_DRAG:
|
case FL_DRAG:
|
||||||
{
|
{
|
||||||
sequence()->sort();
|
|
||||||
|
|
||||||
if ( nselected() > 1 )
|
if ( nselected() > 1 )
|
||||||
// only allow horizontal movement when part of a selection...
|
// only allow horizontal movement when part of a selection...
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#include "Engine/Engine.H" // for lock()
|
#include "Engine/Engine.H" // for lock()
|
||||||
|
|
||||||
|
#include "Track_Header.H"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
using std::list;
|
using std::list;
|
||||||
|
|
||||||
|
@ -37,14 +39,26 @@ using std::list;
|
||||||
|
|
||||||
#include "string_util.h"
|
#include "string_util.h"
|
||||||
|
|
||||||
|
#include "FL/event_name.H"
|
||||||
|
#include "FL/test_press.H"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define DAMAGE_SEQUENCE FL_DAMAGE_USER1
|
||||||
|
#define DAMAGE_HEADER FL_DAMAGE_USER2
|
||||||
|
|
||||||
bool Control_Sequence::draw_with_grid = true;
|
bool Control_Sequence::draw_with_grid = true;
|
||||||
bool Control_Sequence::draw_with_polygon = true;
|
bool Control_Sequence::draw_with_polygon = true;
|
||||||
|
Fl_Widget * Control_Sequence::_highlighted = 0;
|
||||||
|
|
||||||
|
Control_Sequence::Control_Sequence ( ) : Sequence( 0 )
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0 )
|
Control_Sequence::Control_Sequence ( Track *track, const char *name ) : Sequence( 0 )
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
|
@ -52,6 +66,8 @@ Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0 )
|
||||||
|
|
||||||
mode( OSC );
|
mode( OSC );
|
||||||
|
|
||||||
|
this->name( name );
|
||||||
|
|
||||||
if ( track )
|
if ( track )
|
||||||
track->add( this );
|
track->add( this );
|
||||||
|
|
||||||
|
@ -61,8 +77,6 @@ Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0 )
|
||||||
|
|
||||||
Control_Sequence::~Control_Sequence ( )
|
Control_Sequence::~Control_Sequence ( )
|
||||||
{
|
{
|
||||||
// Fl::remove_timeout( &Control_Sequence::process_osc, this );
|
|
||||||
|
|
||||||
Loggable::block_start();
|
Loggable::block_start();
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
@ -84,11 +98,13 @@ Control_Sequence::~Control_Sequence ( )
|
||||||
_output = NULL;
|
_output = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( _osc_output )
|
if ( _osc_output() )
|
||||||
{
|
{
|
||||||
delete _osc_output;
|
OSC::Signal *t = _osc_output();
|
||||||
|
|
||||||
_osc_output = NULL;
|
_osc_output( NULL );
|
||||||
|
|
||||||
|
delete t;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( list<char*>::iterator i = _persistent_osc_connections.begin();
|
for ( list<char*>::iterator i = _persistent_osc_connections.begin();
|
||||||
|
@ -103,13 +119,103 @@ Control_Sequence::~Control_Sequence ( )
|
||||||
Loggable::block_end();
|
Loggable::block_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
Control_Sequence::name ( void ) const
|
||||||
|
{
|
||||||
|
return Sequence::name();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Control_Sequence::name ( const char *s )
|
||||||
|
{
|
||||||
|
char *n = track()->get_unique_control_name( s );
|
||||||
|
|
||||||
|
Sequence::name( n );
|
||||||
|
header()->name_input->value( n );
|
||||||
|
|
||||||
|
if ( mode() == CV )
|
||||||
|
update_port_name();
|
||||||
|
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Control_Sequence::update_port_name ( void )
|
||||||
|
{
|
||||||
|
engine->lock();
|
||||||
|
|
||||||
|
bool needs_activation = false;
|
||||||
|
if ( ! _output )
|
||||||
|
{
|
||||||
|
_output = new JACK::Port( engine, JACK::Port::Output, track()->name(), track()->ncontrols(), "cv" );
|
||||||
|
needs_activation = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( name() )
|
||||||
|
{
|
||||||
|
char n[1024];
|
||||||
|
snprintf( n, sizeof(n), "%s/%s-cv", track()->name(), name() );
|
||||||
|
|
||||||
|
_output->name( n );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( needs_activation )
|
||||||
|
{
|
||||||
|
if ( ! _output->activate() )
|
||||||
|
{
|
||||||
|
fl_alert( "Could not create JACK port for control output on track \"%s\"", track()->name() );
|
||||||
|
delete _output;
|
||||||
|
_output = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
engine->unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Control_Sequence::cb_button ( Fl_Widget *w, void *v )
|
||||||
|
{
|
||||||
|
((Control_Sequence*)v)->cb_button( w );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Control_Sequence::cb_button ( Fl_Widget *w )
|
||||||
|
{
|
||||||
|
Logger log(this);
|
||||||
|
|
||||||
|
if ( w == header()->name_input )
|
||||||
|
{
|
||||||
|
name( header()->name_input->value() );
|
||||||
|
}
|
||||||
|
else if ( w == header()->delete_button )
|
||||||
|
{
|
||||||
|
Fl::delete_widget( this );
|
||||||
|
}
|
||||||
|
/* else if ( w == header()->promote_button ) */
|
||||||
|
/* { */
|
||||||
|
/* track()->sequence( this ); */
|
||||||
|
/* } */
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Control_Sequence::init ( void )
|
Control_Sequence::init ( void )
|
||||||
{
|
{
|
||||||
|
labeltype( FL_NO_LABEL );
|
||||||
|
{
|
||||||
|
Control_Sequence_Header *o = new Control_Sequence_Header( x(), y(), Track::width(), 52 );
|
||||||
|
|
||||||
|
o->name_input->callback( cb_button, this );
|
||||||
|
o->delete_button->callback( cb_button, this );
|
||||||
|
/* o->promote_button->callback( cb_button, this ); */
|
||||||
|
Fl_Group::add( o );
|
||||||
|
}
|
||||||
|
resizable(0);
|
||||||
|
|
||||||
|
box( FL_NO_BOX );
|
||||||
|
|
||||||
_track = NULL;
|
_track = NULL;
|
||||||
_highlighted = false;
|
|
||||||
_output = NULL;
|
_output = NULL;
|
||||||
_osc_output = NULL;
|
__osc_output = NULL;
|
||||||
_mode = (Mode)-1;
|
_mode = (Mode)-1;
|
||||||
|
|
||||||
interpolation( Linear );
|
interpolation( Linear );
|
||||||
|
@ -130,15 +236,15 @@ Control_Sequence::get_unjournaled ( Log_Entry &e ) const
|
||||||
{
|
{
|
||||||
e.add( ":interpolation", _interpolation );
|
e.add( ":interpolation", _interpolation );
|
||||||
|
|
||||||
if ( _osc_output && _osc_output->connected() )
|
if ( _osc_output() && _osc_output()->connected() )
|
||||||
{
|
{
|
||||||
DMESSAGE( "OSC Output connections: %i", _osc_output->noutput_connections() );
|
DMESSAGE( "OSC Output connections: %i", _osc_output()->noutput_connections() );
|
||||||
|
|
||||||
for ( int i = 0; i < _osc_output->noutput_connections(); ++i )
|
for ( int i = 0; i < _osc_output()->noutput_connections(); ++i )
|
||||||
{
|
{
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
s = _osc_output->get_output_connection_peer_name_and_path(i);
|
s = _osc_output()->get_output_connection_peer_name_and_path(i);
|
||||||
|
|
||||||
e.add( ":osc-output", s );
|
e.add( ":osc-output", s );
|
||||||
|
|
||||||
|
@ -166,13 +272,6 @@ Control_Sequence::set ( Log_Entry &e )
|
||||||
|
|
||||||
assert( t );
|
assert( t );
|
||||||
|
|
||||||
_output = new JACK::Port( engine, JACK::Port::Output, t->name(), t->ncontrols(), "cv" );
|
|
||||||
|
|
||||||
if ( ! _output->activate() )
|
|
||||||
{
|
|
||||||
FATAL( "could not create JACK port" );
|
|
||||||
}
|
|
||||||
|
|
||||||
t->add( this );
|
t->add( this );
|
||||||
}
|
}
|
||||||
else if ( ! strcmp( ":name", s ) )
|
else if ( ! strcmp( ":name", s ) )
|
||||||
|
@ -205,34 +304,34 @@ Control_Sequence::mode ( Mode m )
|
||||||
{
|
{
|
||||||
_output->shutdown();
|
_output->shutdown();
|
||||||
|
|
||||||
delete _output;
|
JACK::Port *t = _output;
|
||||||
|
|
||||||
_output = NULL;
|
_output = NULL;
|
||||||
|
|
||||||
|
delete t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( OSC != m && mode() == OSC )
|
else if ( OSC != m && mode() == OSC )
|
||||||
{
|
{
|
||||||
if ( _osc_output )
|
if ( _osc_output() )
|
||||||
{
|
{
|
||||||
delete _osc_output;
|
OSC::Signal *t = _osc_output();
|
||||||
|
|
||||||
_osc_output = NULL;
|
_osc_output( NULL );
|
||||||
|
|
||||||
|
delete t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( CV == m && mode() != CV )
|
if ( CV == m && mode() != CV )
|
||||||
{
|
{
|
||||||
_output = new JACK::Port( engine, JACK::Port::Output, track()->name(), track()->ncontrols(), "cv" );
|
update_port_name();
|
||||||
|
|
||||||
if ( ! _output->activate() )
|
header()->outputs_indicator->label( "cv" );
|
||||||
{
|
|
||||||
fl_alert( "Could not create JACK port for control output on %s", track()->name() );
|
|
||||||
delete _output;
|
|
||||||
_output = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if ( OSC == m && mode() != OSC )
|
else if ( OSC == m && mode() != OSC )
|
||||||
{
|
{
|
||||||
|
/* FIXME: use name here... */
|
||||||
char *path;
|
char *path;
|
||||||
asprintf( &path, "/track/%s/control/%i", track()->name(), track()->ncontrols() );
|
asprintf( &path, "/track/%s/control/%i", track()->name(), track()->ncontrols() );
|
||||||
|
|
||||||
|
@ -242,11 +341,17 @@ Control_Sequence::mode ( Mode m )
|
||||||
|
|
||||||
path = s;
|
path = s;
|
||||||
|
|
||||||
_osc_output = timeline->osc->add_signal( path, OSC::Signal::Output, 0, 1, 0, NULL, NULL );
|
OSC::Signal *t = timeline->osc->add_signal( path, OSC::Signal::Output, 0, 1, 0, NULL, NULL );
|
||||||
|
|
||||||
free( path );
|
free( path );
|
||||||
|
|
||||||
|
_osc_output( t );
|
||||||
|
|
||||||
|
DMESSAGE( "osc_output: %p", _osc_output() );
|
||||||
|
|
||||||
connect_osc();
|
connect_osc();
|
||||||
|
|
||||||
|
header()->outputs_indicator->label( "osc" );
|
||||||
}
|
}
|
||||||
|
|
||||||
_mode = m;
|
_mode = m;
|
||||||
|
@ -255,27 +360,37 @@ Control_Sequence::mode ( Mode m )
|
||||||
void
|
void
|
||||||
Control_Sequence::draw_curve ( bool filled )
|
Control_Sequence::draw_curve ( bool filled )
|
||||||
{
|
{
|
||||||
const int bx = x();
|
const int bx = drawable_x();
|
||||||
const int by = y() + Fl::box_dy( box() );
|
const int by = y() + Fl::box_dy( box() );
|
||||||
const int bw = w();
|
const int bw = drawable_w();
|
||||||
const int bh = h() - Fl::box_dh( box() );
|
const int bh = h() - Fl::box_dh( box() );
|
||||||
|
|
||||||
list <Sequence_Widget *>::const_iterator e = _widgets.end();
|
/* make a copy of the list for drawing and sort it... */
|
||||||
|
list <Sequence_Widget *> wl;
|
||||||
|
|
||||||
|
std::copy( _widgets.begin(), _widgets.end(), std::back_inserter( wl ) );
|
||||||
|
|
||||||
|
//= new list <const Sequence_Widget *>(_widgets);
|
||||||
|
|
||||||
|
wl.sort( Sequence_Widget::sort_func );
|
||||||
|
|
||||||
|
list <Sequence_Widget *>::const_iterator e = wl.end();
|
||||||
e--;
|
e--;
|
||||||
|
|
||||||
if ( _widgets.size() )
|
if ( wl.size() )
|
||||||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); ; r++ )
|
for ( list <Sequence_Widget *>::const_iterator r = wl.begin(); ; r++ )
|
||||||
{
|
{
|
||||||
const int ry = (*r)->y();
|
const int ry = (*r)->y();
|
||||||
|
const int rx = (*r)->line_x();
|
||||||
|
|
||||||
if ( r == _widgets.begin() )
|
if ( r == wl.begin() )
|
||||||
{
|
{
|
||||||
if ( filled )
|
if ( filled )
|
||||||
fl_vertex( bx, bh + by );
|
fl_vertex( bx, bh + by );
|
||||||
fl_vertex( bx, ry );
|
fl_vertex( bx, ry );
|
||||||
}
|
}
|
||||||
|
|
||||||
fl_vertex( (*r)->line_x(), ry );
|
fl_vertex( rx, ry );
|
||||||
|
|
||||||
if ( r == e )
|
if ( r == e )
|
||||||
{
|
{
|
||||||
|
@ -291,9 +406,9 @@ Control_Sequence::draw_curve ( bool filled )
|
||||||
void
|
void
|
||||||
Control_Sequence::draw_box ( void )
|
Control_Sequence::draw_box ( void )
|
||||||
{
|
{
|
||||||
const int bx = x();
|
const int bx = drawable_x();
|
||||||
const int by = y();
|
const int by = y();
|
||||||
const int bw = w();
|
const int bw = drawable_w();
|
||||||
const int bh = h();
|
const int bh = h();
|
||||||
|
|
||||||
int X, Y, W, H;
|
int X, Y, W, H;
|
||||||
|
@ -301,7 +416,9 @@ Control_Sequence::draw_box ( void )
|
||||||
fl_clip_box( bx, by, bw, bh, X, Y, W, H );
|
fl_clip_box( bx, by, bw, bh, X, Y, W, H );
|
||||||
|
|
||||||
// fl_rectf( X, Y, W, H, fl_color_average( FL_BLACK, FL_BACKGROUND_COLOR, 0.3 ) );
|
// fl_rectf( X, Y, W, H, fl_color_average( FL_BLACK, FL_BACKGROUND_COLOR, 0.3 ) );
|
||||||
fl_rectf( X,Y,W,H, fl_color_average( FL_BLACK, FL_WHITE, 0.90 ) );
|
// fl_rectf( X,Y,W,H, fl_color_average( FL_BLACK, FL_WHITE, 0.90 ) );
|
||||||
|
fl_rectf( X,Y,W,H, FL_DARK1 );
|
||||||
|
|
||||||
|
|
||||||
if ( draw_with_grid )
|
if ( draw_with_grid )
|
||||||
{
|
{
|
||||||
|
@ -315,16 +432,12 @@ Control_Sequence::draw_box ( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
timeline->draw_measure_lines( X, Y, W, H );
|
timeline->draw_measure_lines( X, Y, W, H );
|
||||||
|
|
||||||
fl_color( FL_BLACK );
|
|
||||||
fl_line( x(), y(), x() + w(), y() );
|
|
||||||
fl_line( x(), y() + h() - 1, w(), y() + h() - 1 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Control_Sequence::draw ( void )
|
Control_Sequence::draw ( void )
|
||||||
{
|
{
|
||||||
fl_push_clip( x(), y(), w(), h() );
|
fl_push_clip( drawable_x(), y(), drawable_w(), h() );
|
||||||
|
|
||||||
const int bx = x();
|
const int bx = x();
|
||||||
const int by = y() + Fl::box_dy( box() );
|
const int by = y() + Fl::box_dy( box() );
|
||||||
|
@ -356,7 +469,7 @@ Control_Sequence::draw ( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
fl_color( fl_color_average( FL_WHITE, color, 0.5 ) );
|
fl_color( fl_color_average( FL_WHITE, color, 0.5 ) );
|
||||||
fl_line_style( FL_SOLID, 3 );
|
fl_line_style( FL_SOLID, 2 );
|
||||||
|
|
||||||
fl_begin_line();
|
fl_begin_line();
|
||||||
draw_curve( false );
|
draw_curve( false );
|
||||||
|
@ -365,15 +478,24 @@ Control_Sequence::draw ( void )
|
||||||
fl_line_style( FL_SOLID, 0 );
|
fl_line_style( FL_SOLID, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( interpolation() == None || _highlighted || Fl::focus() == this )
|
if ( interpolation() == None || _highlighted == this || Fl::focus() == this )
|
||||||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||||
(*r)->draw_box();
|
if ( (*r)->x() + (*r)->w() >= bx &&
|
||||||
|
(*r)->x() <= bw + bw )
|
||||||
|
(*r)->draw_box();
|
||||||
else
|
else
|
||||||
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
|
||||||
if ( (*r)->selected() )
|
if ( (*r)->selected() )
|
||||||
(*r)->draw_box();
|
if ( (*r)->x() + (*r)->w() >= bx &&
|
||||||
|
(*r)->x() <= bw + bw )
|
||||||
|
(*r)->draw_box();
|
||||||
|
|
||||||
fl_pop_clip();
|
fl_pop_clip();
|
||||||
|
|
||||||
|
if ( damage() & ~DAMAGE_SEQUENCE )
|
||||||
|
{
|
||||||
|
Fl_Group::draw_children();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "FL/menu_popup.H"
|
#include "FL/menu_popup.H"
|
||||||
|
@ -389,6 +511,8 @@ Control_Sequence::menu_cb ( const Fl_Menu_ *m )
|
||||||
{
|
{
|
||||||
char picked[1024];
|
char picked[1024];
|
||||||
|
|
||||||
|
DMESSAGE( "Control_Sequence: menu_cb" );
|
||||||
|
|
||||||
if ( ! m->mvalue() ) // || m->mvalue()->flags & FL_SUBMENU_POINTER || m->mvalue()->flags & FL_SUBMENU )
|
if ( ! m->mvalue() ) // || m->mvalue()->flags & FL_SUBMENU_POINTER || m->mvalue()->flags & FL_SUBMENU )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -406,7 +530,7 @@ Control_Sequence::menu_cb ( const Fl_Menu_ *m )
|
||||||
char *peer_and_path;
|
char *peer_and_path;
|
||||||
asprintf( &peer_and_path, "%s:%s", peer_name, path );
|
asprintf( &peer_and_path, "%s:%s", peer_name, path );
|
||||||
|
|
||||||
if ( ! _osc_output->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) )
|
if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) )
|
||||||
{
|
{
|
||||||
_persistent_osc_connections.push_back( peer_and_path );
|
_persistent_osc_connections.push_back( peer_and_path );
|
||||||
|
|
||||||
|
@ -414,7 +538,7 @@ Control_Sequence::menu_cb ( const Fl_Menu_ *m )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
timeline->osc->disconnect_signal( _osc_output, peer_name, path );
|
timeline->osc->disconnect_signal( _osc_output(), peer_name, path );
|
||||||
|
|
||||||
for ( std::list<char*>::iterator i = _persistent_osc_connections.begin();
|
for ( std::list<char*>::iterator i = _persistent_osc_connections.begin();
|
||||||
i != _persistent_osc_connections.end();
|
i != _persistent_osc_connections.end();
|
||||||
|
@ -443,12 +567,7 @@ Control_Sequence::menu_cb ( const Fl_Menu_ *m )
|
||||||
|
|
||||||
else if ( ! strcmp( picked, "/Rename" ) )
|
else if ( ! strcmp( picked, "/Rename" ) )
|
||||||
{
|
{
|
||||||
const char *s = fl_input( "Input new name for control sequence:", name() );
|
((Fl_Sometimes_Input*)header()->name_input)->take_focus();
|
||||||
|
|
||||||
if ( s )
|
|
||||||
name( s );
|
|
||||||
|
|
||||||
redraw();
|
|
||||||
}
|
}
|
||||||
else if ( !strcmp( picked, "/Remove" ) )
|
else if ( !strcmp( picked, "/Remove" ) )
|
||||||
{
|
{
|
||||||
|
@ -478,35 +597,33 @@ Control_Sequence::connect_osc ( void )
|
||||||
i != _persistent_osc_connections.end();
|
i != _persistent_osc_connections.end();
|
||||||
++i )
|
++i )
|
||||||
{
|
{
|
||||||
if ( ! timeline->osc->connect_signal( _osc_output, *i ) )
|
if ( ! timeline->osc->connect_signal( _osc_output(), *i ) )
|
||||||
{
|
{
|
||||||
// MESSAGE( "Failed to connect output %s to ", _osc_output->path(), *i );
|
// MESSAGE( "Failed to connect output %s to ", _osc_output->path(), *i );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MESSAGE( "Connected output %s to %s", _osc_output->path(), *i );
|
MESSAGE( "Connected output %s to %s", _osc_output()->path(), *i );
|
||||||
|
|
||||||
// tooltip( _osc_connected_path );
|
// tooltip( _osc_connected_path );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Control_Sequence::process_osc ( void *v )
|
|
||||||
{
|
|
||||||
((Control_Sequence*)v)->process_osc();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Control_Sequence::process_osc ( void )
|
Control_Sequence::process_osc ( void )
|
||||||
{
|
{
|
||||||
if ( _osc_output && _osc_output->connected() )
|
if ( mode() != OSC )
|
||||||
|
return;
|
||||||
|
|
||||||
|
header()->outputs_indicator->value( _osc_output() && _osc_output()->connected() );
|
||||||
|
|
||||||
|
if ( _osc_output() && _osc_output()->connected() )
|
||||||
{
|
{
|
||||||
sample_t buf[1];
|
sample_t buf[1];
|
||||||
|
|
||||||
play( buf, (nframes_t)transport->frame, (nframes_t) 1 );
|
play( buf, (nframes_t)transport->frame, (nframes_t) 1 );
|
||||||
_osc_output->value( (float)buf[0] );
|
_osc_output()->value( (float)buf[0] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,7 +661,7 @@ Control_Sequence::peer_callback( const char *name, const OSC::Signal *sig )
|
||||||
|
|
||||||
peer_menu->add( s, 0, NULL, (void*)( sig ),
|
peer_menu->add( s, 0, NULL, (void*)( sig ),
|
||||||
FL_MENU_TOGGLE |
|
FL_MENU_TOGGLE |
|
||||||
( _osc_output->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) );
|
( _osc_output()->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) );
|
||||||
|
|
||||||
free( path );
|
free( path );
|
||||||
|
|
||||||
|
@ -568,18 +685,38 @@ Control_Sequence::handle ( int m )
|
||||||
switch ( m )
|
switch ( m )
|
||||||
{
|
{
|
||||||
case FL_ENTER:
|
case FL_ENTER:
|
||||||
_highlighted = true;
|
break;
|
||||||
fl_cursor( cursor() );
|
|
||||||
redraw();
|
|
||||||
return 1;
|
|
||||||
case FL_LEAVE:
|
case FL_LEAVE:
|
||||||
_highlighted = false;
|
_highlighted = 0;
|
||||||
redraw();
|
damage( DAMAGE_SEQUENCE );
|
||||||
return 1;
|
fl_cursor( FL_CURSOR_DEFAULT );
|
||||||
|
break;
|
||||||
|
case FL_MOVE:
|
||||||
|
if ( Fl::event_x() > drawable_x() )
|
||||||
|
{
|
||||||
|
if ( _highlighted != this )
|
||||||
|
{
|
||||||
|
_highlighted = this;
|
||||||
|
damage( DAMAGE_SEQUENCE );
|
||||||
|
fl_cursor( FL_CURSOR_CROSS );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( _highlighted == this )
|
||||||
|
{
|
||||||
|
_highlighted = 0;
|
||||||
|
damage( DAMAGE_SEQUENCE );
|
||||||
|
fl_cursor( FL_CURSOR_DEFAULT );
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger log(this);
|
||||||
|
|
||||||
|
|
||||||
int r = Sequence::handle( m );
|
int r = Sequence::handle( m );
|
||||||
|
|
||||||
if ( r )
|
if ( r )
|
||||||
|
@ -589,43 +726,52 @@ Control_Sequence::handle ( int m )
|
||||||
{
|
{
|
||||||
case FL_PUSH:
|
case FL_PUSH:
|
||||||
{
|
{
|
||||||
Logger log( this );
|
if ( test_press( FL_BUTTON1 ) &&
|
||||||
|
Fl::event_x() >= Track::width() )
|
||||||
if ( Fl::event_button1() )
|
|
||||||
{
|
{
|
||||||
Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() ), (float)(Fl::event_y() - y()) / h() );
|
timeline->wrlock();
|
||||||
|
|
||||||
|
Control_Point *r = new Control_Point( this, timeline->xoffset + timeline->x_to_ts( Fl::event_x() - drawable_x() ), (float)(Fl::event_y() - y()) / h() );
|
||||||
|
|
||||||
add( r );
|
add( r );
|
||||||
|
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else if ( Fl::event_button3() && ! ( Fl::event_state() & ( FL_ALT | FL_SHIFT | FL_CTRL ) ) )
|
else if ( test_press( FL_BUTTON3 ) &&
|
||||||
|
Fl::event_x() < Track::width() )
|
||||||
{
|
{
|
||||||
|
Fl_Menu_Button *menu = new Fl_Menu_Button( 0, 0, 0, 0, "Control Sequence" );
|
||||||
|
|
||||||
Fl_Menu_Button menu( 0, 0, 0, 0, "Control Sequence" );
|
menu->clear();
|
||||||
|
|
||||||
menu.clear();
|
|
||||||
|
|
||||||
if ( mode() == OSC )
|
if ( mode() == OSC )
|
||||||
{
|
{
|
||||||
add_osc_peers_to_menu( &menu, "Connect To" );
|
add_osc_peers_to_menu( menu, "Connect To" );
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.add( "Interpolation/None", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == None ? FL_MENU_VALUE : 0 ) );
|
menu->add( "Interpolation/None", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == None ? FL_MENU_VALUE : 0 ) );
|
||||||
menu.add( "Interpolation/Linear", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == Linear ? FL_MENU_VALUE : 0 ) );
|
menu->add( "Interpolation/Linear", 0, 0, 0, FL_MENU_RADIO | ( interpolation() == Linear ? FL_MENU_VALUE : 0 ) );
|
||||||
menu.add( "Mode/Control Voltage (JACK)", 0, 0, 0 ,FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) );
|
menu->add( "Mode/Control Voltage (JACK)", 0, 0, 0 ,FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) );
|
||||||
menu.add( "Mode/Control Signal (OSC)", 0, 0, 0 , FL_MENU_RADIO | ( mode() == OSC ? FL_MENU_VALUE : 0 ) );
|
menu->add( "Mode/Control Signal (OSC)", 0, 0, 0 , FL_MENU_RADIO | ( mode() == OSC ? FL_MENU_VALUE : 0 ) );
|
||||||
|
|
||||||
menu.add( "Rename", 0, 0, 0 );
|
menu->add( "Rename", 0, 0, 0 );
|
||||||
menu.add( "Color", 0, 0, 0 );
|
menu->add( "Color", 0, 0, 0 );
|
||||||
menu.add( "Remove", 0, 0, 0 );
|
menu->add( "Remove", 0, 0, 0 );
|
||||||
|
|
||||||
menu.callback( &Control_Sequence::menu_cb, (void*)this);
|
menu->callback( &Control_Sequence::menu_cb, (void*)this);
|
||||||
|
|
||||||
menu_popup( &menu, x(), y() );
|
menu_popup( menu );
|
||||||
|
|
||||||
|
delete menu;
|
||||||
|
|
||||||
|
// redraw();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
// class JACK::Port;
|
// class JACK::Port;
|
||||||
#include "OSC/Endpoint.H"
|
#include "OSC/Endpoint.H"
|
||||||
|
|
||||||
|
class Control_Sequence_Header;
|
||||||
|
|
||||||
class Control_Sequence : public Sequence
|
class Control_Sequence : public Sequence
|
||||||
{
|
{
|
||||||
/* not permitted */
|
/* not permitted */
|
||||||
|
@ -44,22 +46,35 @@ public:
|
||||||
MIDI
|
MIDI
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static void cb_button ( Fl_Widget *w, void *v );
|
||||||
|
void cb_button ( Fl_Widget *w );
|
||||||
|
|
||||||
JACK::Port *_output;
|
JACK::Port *_output;
|
||||||
|
|
||||||
/* these are used to cache the saved osc connection until the
|
/* these are used to cache the saved osc connection until the
|
||||||
* session is loaded, at which time we will reconnect */
|
* session is loaded, at which time we will reconnect */
|
||||||
std::list<char*> _persistent_osc_connections;
|
std::list<char*> _persistent_osc_connections;
|
||||||
/* osc output port */
|
/* osc output port */
|
||||||
OSC::Signal *_osc_output;
|
volatile void *__osc_output;
|
||||||
|
|
||||||
|
OSC::Signal *_osc_output ( void ) const
|
||||||
|
{
|
||||||
|
return (OSC::Signal *)__osc_output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _osc_output ( OSC::Signal * s)
|
||||||
|
{
|
||||||
|
__osc_output = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void peer_callback( const char *name, const OSC::Signal *sig, void *v );
|
static void peer_callback( const char *name, const OSC::Signal *sig, void *v );
|
||||||
void peer_callback( const char *name, const OSC::Signal *sig );
|
void peer_callback( const char *name, const OSC::Signal *sig );
|
||||||
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix );
|
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix );
|
||||||
|
|
||||||
bool _highlighted;
|
static Fl_Widget *_highlighted;
|
||||||
|
|
||||||
Curve_Type _interpolation;
|
Curve_Type _interpolation;
|
||||||
|
|
||||||
|
@ -76,27 +91,26 @@ private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
Control_Sequence ( );
|
||||||
|
|
||||||
virtual void get ( Log_Entry &e ) const;
|
virtual void get ( Log_Entry &e ) const;
|
||||||
virtual void get_unjournaled ( Log_Entry &e ) const;
|
virtual void get_unjournaled ( Log_Entry &e ) const;
|
||||||
void set ( Log_Entry &e );
|
void set ( Log_Entry &e );
|
||||||
|
|
||||||
Control_Sequence ( ) : Sequence( 0 )
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void draw_box ( void );
|
void draw_box ( void );
|
||||||
void draw ( void );
|
void draw ( void );
|
||||||
int handle ( int m );
|
int handle ( int m );
|
||||||
|
|
||||||
|
void update_port_name ( void );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
Control_Sequence_Header * header ( void ) { return (Control_Sequence_Header*)child(0); }
|
||||||
|
|
||||||
|
virtual void name ( const char *s );
|
||||||
|
virtual const char *name ( void ) const;
|
||||||
|
|
||||||
static void process_osc ( void *v );
|
|
||||||
void process_osc ( void );
|
void process_osc ( void );
|
||||||
|
|
||||||
void connect_osc ( void );
|
void connect_osc ( void );
|
||||||
|
|
||||||
static bool draw_with_polygon;
|
static bool draw_with_polygon;
|
||||||
|
@ -104,13 +118,17 @@ public:
|
||||||
|
|
||||||
LOG_CREATE_FUNC( Control_Sequence );
|
LOG_CREATE_FUNC( Control_Sequence );
|
||||||
|
|
||||||
Control_Sequence ( Track * );
|
Control_Sequence ( Track *, const char *name = 0 );
|
||||||
~Control_Sequence ( );
|
~Control_Sequence ( );
|
||||||
|
|
||||||
Fl_Cursor cursor ( void ) const { return FL_CURSOR_CROSS; }
|
Fl_Cursor cursor ( void ) const { return FL_CURSOR_CROSS; }
|
||||||
|
|
||||||
Curve_Type interpolation ( void ) const { return _interpolation; }
|
Curve_Type interpolation ( void ) const { return _interpolation; }
|
||||||
void interpolation ( Curve_Type v ) { _interpolation = v; }
|
void interpolation ( Curve_Type v )
|
||||||
|
{
|
||||||
|
_interpolation = v;
|
||||||
|
damage( FL_DAMAGE_USER1 );
|
||||||
|
}
|
||||||
|
|
||||||
Mode mode ( void ) const { return _mode; }
|
Mode mode ( void ) const { return _mode; }
|
||||||
void mode ( Mode v );
|
void mode ( Mode v );
|
||||||
|
|
|
@ -20,6 +20,40 @@
|
||||||
#include "Cursor_Sequence.H"
|
#include "Cursor_Sequence.H"
|
||||||
#include "Cursor_Point.H"
|
#include "Cursor_Point.H"
|
||||||
#include "Timeline.H"
|
#include "Timeline.H"
|
||||||
|
#include "Track.H"
|
||||||
|
|
||||||
|
Cursor_Sequence::Cursor_Sequence( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
||||||
|
{
|
||||||
|
_cursor_color = FL_CYAN;
|
||||||
|
|
||||||
|
labeltype(FL_NO_LABEL);
|
||||||
|
|
||||||
|
box( FL_FLAT_BOX );
|
||||||
|
|
||||||
|
{ Fl_Box *o = new Fl_Box( X, Y, Track::width(), H );
|
||||||
|
o->align( FL_ALIGN_RIGHT | FL_ALIGN_INSIDE );
|
||||||
|
o->labelsize( 12 );
|
||||||
|
o->labeltype( FL_NORMAL_LABEL );
|
||||||
|
Fl_Group::add( o );
|
||||||
|
}
|
||||||
|
|
||||||
|
resizable(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Cursor_Sequence::label ( const char *s )
|
||||||
|
{
|
||||||
|
Sequence::label(s);
|
||||||
|
child(0)->label(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
Cursor_Sequence::label ( void ) const
|
||||||
|
{
|
||||||
|
return Sequence::label();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Cursor_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
Cursor_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
||||||
|
|
|
@ -36,6 +36,9 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
void label ( const char * s );
|
||||||
|
const char *label ( void ) const;
|
||||||
|
|
||||||
Sequence_Widget *active_cursor ( void );
|
Sequence_Widget *active_cursor ( void );
|
||||||
|
|
||||||
Fl_Color cursor_color ( void ) const { return _cursor_color; }
|
Fl_Color cursor_color ( void ) const { return _cursor_color; }
|
||||||
|
@ -43,11 +46,7 @@ public:
|
||||||
|
|
||||||
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
||||||
|
|
||||||
Cursor_Sequence ( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
Cursor_Sequence ( int X, int Y, int W, int H );
|
||||||
{
|
|
||||||
_cursor_color = FL_CYAN;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void handle_widget_change ( nframes_t start, nframes_t length );
|
void handle_widget_change ( nframes_t start, nframes_t length );
|
||||||
int handle ( int m );
|
int handle ( int m );
|
||||||
|
|
|
@ -66,7 +66,9 @@ OSC_Thread::process ( void )
|
||||||
{
|
{
|
||||||
usleep( 100 * 1000 );
|
usleep( 100 * 1000 );
|
||||||
|
|
||||||
|
/* lock(); */
|
||||||
timeline->process_osc();
|
timeline->process_osc();
|
||||||
|
/* unlock(); */
|
||||||
}
|
}
|
||||||
|
|
||||||
DMESSAGE( "OSC Thread stopping." );
|
DMESSAGE( "OSC Thread stopping." );
|
||||||
|
|
|
@ -128,6 +128,14 @@ Project::write_info ( void )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Project::undo ( void )
|
||||||
|
{
|
||||||
|
timeline->wrlock();
|
||||||
|
Loggable::undo();
|
||||||
|
timeline->unlock();
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Project::read_info ( int *version, nframes_t *sample_rate, char **creation_date, char **created_by )
|
Project::read_info ( int *version, nframes_t *sample_rate, char **creation_date, char **created_by )
|
||||||
{
|
{
|
||||||
|
@ -195,7 +203,10 @@ Project::close ( void )
|
||||||
if ( ! save() )
|
if ( ! save() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
timeline->wrlock();
|
||||||
Loggable::close();
|
Loggable::close();
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
// write_info();
|
// write_info();
|
||||||
|
|
||||||
_is_open = false;
|
_is_open = false;
|
||||||
|
@ -300,11 +311,13 @@ Project::open ( const char *name )
|
||||||
if ( ! engine )
|
if ( ! engine )
|
||||||
make_engine();
|
make_engine();
|
||||||
|
|
||||||
|
timeline->wrlock();
|
||||||
{
|
{
|
||||||
Block_Timer timer( "Replayed journal" );
|
Block_Timer timer( "Replayed journal" );
|
||||||
if ( ! Loggable::open( "history" ) )
|
if ( ! Loggable::open( "history" ) )
|
||||||
return E_INVALID;
|
return E_INVALID;
|
||||||
}
|
}
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
/* /\* really a good idea? *\/ */
|
/* /\* really a good idea? *\/ */
|
||||||
/* timeline->sample_rate( rate ); */
|
/* timeline->sample_rate( rate ); */
|
||||||
|
|
|
@ -36,6 +36,7 @@ class Project
|
||||||
static const char *_errstr[];
|
static const char *_errstr[];
|
||||||
|
|
||||||
static void make_engine ( void );
|
static void make_engine ( void );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -60,6 +61,6 @@ public:
|
||||||
static int open ( const char *name );
|
static int open ( const char *name );
|
||||||
static bool open ( void ) { return _is_open; }
|
static bool open ( void ) { return _is_open; }
|
||||||
static bool create ( const char *name, const char *template_name );
|
static bool create ( const char *name, const char *template_name );
|
||||||
|
static void undo ( void );
|
||||||
static const char *created_on ( void ) { return _created_on; }
|
static const char *created_on ( void ) { return _created_on; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -39,7 +39,7 @@ queue <Sequence_Widget *> Sequence::_delete_queue;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Sequence::Sequence ( Track *track, const char *name ) : Fl_Widget( 0, 0, 0, 0 ), Loggable( true )
|
Sequence::Sequence ( Track *track, const char *name ) : Fl_Group( 0, 0, 0, 0 ), Loggable( true )
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ Sequence::Sequence ( Track *track, const char *name ) : Fl_Widget( 0, 0, 0, 0 ),
|
||||||
// log_create();
|
// log_create();
|
||||||
}
|
}
|
||||||
|
|
||||||
Sequence::Sequence ( int X, int Y, int W, int H ) : Fl_Widget( X, Y, W, H ), Loggable( false )
|
Sequence::Sequence ( int X, int Y, int W, int H ) : Fl_Group( X, Y, W, H ), Loggable( false )
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
@ -67,9 +67,11 @@ Sequence::init ( void )
|
||||||
color( FL_BACKGROUND_COLOR );
|
color( FL_BACKGROUND_COLOR );
|
||||||
align( FL_ALIGN_LEFT );
|
align( FL_ALIGN_LEFT );
|
||||||
|
|
||||||
|
end();
|
||||||
// clear_visible_focus();
|
// clear_visible_focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Sequence::~Sequence ( )
|
Sequence::~Sequence ( )
|
||||||
{
|
{
|
||||||
DMESSAGE( "destroying sequence" );
|
DMESSAGE( "destroying sequence" );
|
||||||
|
@ -86,6 +88,18 @@ Sequence::~Sequence ( )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
Sequence::drawable_w ( void ) const
|
||||||
|
{
|
||||||
|
return w() - Track::width();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Sequence::drawable_x ( void ) const
|
||||||
|
{
|
||||||
|
return x() + Track::width();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sequence::log_children ( void ) const
|
Sequence::log_children ( void ) const
|
||||||
{
|
{
|
||||||
|
@ -120,11 +134,7 @@ Sequence::x_to_offset ( int X )
|
||||||
void
|
void
|
||||||
Sequence::sort ( void )
|
Sequence::sort ( void )
|
||||||
{
|
{
|
||||||
timeline->wrlock();
|
|
||||||
|
|
||||||
_widgets.sort( Sequence_Widget::sort_func );
|
_widgets.sort( Sequence_Widget::sort_func );
|
||||||
|
|
||||||
timeline->unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** return a pointer to the widget that /r/ overlaps, or NULL if none. */
|
/** return a pointer to the widget that /r/ overlaps, or NULL if none. */
|
||||||
|
@ -145,6 +155,7 @@ void
|
||||||
Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
||||||
{
|
{
|
||||||
sort();
|
sort();
|
||||||
|
timeline->damage_sequence();
|
||||||
// timeline->update_length( start + length );
|
// timeline->update_length( start + length );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,7 +175,7 @@ Sequence::widget_at ( nframes_t ts, int Y )
|
||||||
Sequence_Widget *
|
Sequence_Widget *
|
||||||
Sequence::event_widget ( void )
|
Sequence::event_widget ( void )
|
||||||
{
|
{
|
||||||
nframes_t ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() );
|
nframes_t ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - drawable_x() );
|
||||||
return widget_at( ets, Fl::event_y() );
|
return widget_at( ets, Fl::event_y() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,12 +191,9 @@ Sequence::add ( Sequence_Widget *r )
|
||||||
// r->track()->redraw();
|
// r->track()->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
timeline->wrlock();
|
|
||||||
|
|
||||||
r->sequence( this );
|
r->sequence( this );
|
||||||
_widgets.push_back( r );
|
|
||||||
|
|
||||||
timeline->unlock();
|
_widgets.push_back( r );
|
||||||
|
|
||||||
handle_widget_change( r->start(), r->length() );
|
handle_widget_change( r->start(), r->length() );
|
||||||
}
|
}
|
||||||
|
@ -193,12 +201,8 @@ Sequence::add ( Sequence_Widget *r )
|
||||||
void
|
void
|
||||||
Sequence::remove ( Sequence_Widget *r )
|
Sequence::remove ( Sequence_Widget *r )
|
||||||
{
|
{
|
||||||
timeline->wrlock();
|
|
||||||
|
|
||||||
_widgets.remove( r );
|
_widgets.remove( r );
|
||||||
|
|
||||||
timeline->unlock();
|
|
||||||
|
|
||||||
handle_widget_change( r->start(), r->length() );
|
handle_widget_change( r->start(), r->length() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,13 +263,23 @@ void
|
||||||
Sequence::draw_box ( void )
|
Sequence::draw_box ( void )
|
||||||
{
|
{
|
||||||
/* draw the box with the ends cut off. */
|
/* draw the box with the ends cut off. */
|
||||||
Fl_Widget::draw_box( box(), x() - Fl::box_dx( box() ) - 1, y(), w() + Fl::box_dw( box() ) + 2, h(), color() );
|
Fl_Group::draw_box( box(), x() - Fl::box_dx( box() ) - 1, y(), w() + Fl::box_dw( box() ) + 2, h(), color() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sequence::draw ( void )
|
Sequence::draw ( void )
|
||||||
{
|
{
|
||||||
fl_push_clip( x(), y(), w(), h() );
|
if ( damage() & ~FL_DAMAGE_USER1 )
|
||||||
|
{
|
||||||
|
Fl_Boxtype b = box();
|
||||||
|
box( FL_NO_BOX );
|
||||||
|
|
||||||
|
Fl_Group::draw();
|
||||||
|
|
||||||
|
box( b );
|
||||||
|
}
|
||||||
|
|
||||||
|
fl_push_clip( drawable_x(), y(), drawable_w(), h() );
|
||||||
|
|
||||||
draw_box();
|
draw_box();
|
||||||
|
|
||||||
|
@ -353,17 +367,17 @@ Sequence::handle ( int m )
|
||||||
/* garbage from overlay window */
|
/* garbage from overlay window */
|
||||||
return 0;
|
return 0;
|
||||||
case FL_FOCUS:
|
case FL_FOCUS:
|
||||||
Fl_Widget::handle( m );
|
Fl_Group::handle( m );
|
||||||
redraw();
|
redraw();
|
||||||
return 1;
|
return 1;
|
||||||
case FL_UNFOCUS:
|
case FL_UNFOCUS:
|
||||||
Fl_Widget::handle( m );
|
Fl_Group::handle( m );
|
||||||
redraw();
|
redraw();
|
||||||
return 1;
|
return 1;
|
||||||
case FL_LEAVE:
|
case FL_LEAVE:
|
||||||
// DMESSAGE( "leave" );
|
// DMESSAGE( "leave" );
|
||||||
fl_cursor( FL_CURSOR_DEFAULT );
|
fl_cursor( FL_CURSOR_DEFAULT );
|
||||||
Fl_Widget::handle( m );
|
Fl_Group::handle( m );
|
||||||
return 1;
|
return 1;
|
||||||
case FL_DND_DRAG:
|
case FL_DND_DRAG:
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -374,19 +388,25 @@ Sequence::handle ( int m )
|
||||||
if ( Sequence_Widget::pushed()->sequence()->class_name() == class_name() )
|
if ( Sequence_Widget::pushed()->sequence()->class_name() == class_name() )
|
||||||
{
|
{
|
||||||
/* accept objects dragged from other sequences of this type */
|
/* accept objects dragged from other sequences of this type */
|
||||||
|
|
||||||
|
timeline->wrlock();
|
||||||
|
|
||||||
add( Sequence_Widget::pushed() );
|
add( Sequence_Widget::pushed() );
|
||||||
redraw();
|
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
|
damage( FL_DAMAGE_USER1 );
|
||||||
|
|
||||||
fl_cursor( FL_CURSOR_MOVE );
|
fl_cursor( FL_CURSOR_MOVE );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fl_cursor( (Fl_Cursor)1 );
|
fl_cursor( FL_CURSOR_DEFAULT );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ( ! event_widget() )
|
if ( ! event_widget() )
|
||||||
fl_cursor( cursor() );
|
fl_cursor( cursor() );
|
||||||
|
|
||||||
Fl_Widget::handle( m );
|
Fl_Group::handle( m );
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
case FL_DND_ENTER:
|
case FL_DND_ENTER:
|
||||||
|
@ -443,6 +463,8 @@ Sequence::handle ( int m )
|
||||||
|
|
||||||
Loggable::block_start();
|
Loggable::block_start();
|
||||||
|
|
||||||
|
timeline->wrlock();
|
||||||
|
|
||||||
while ( _delete_queue.size() )
|
while ( _delete_queue.size() )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -460,6 +482,8 @@ Sequence::handle ( int m )
|
||||||
delete t;
|
delete t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
Loggable::block_end();
|
Loggable::block_end();
|
||||||
|
|
||||||
if ( m == FL_PUSH )
|
if ( m == FL_PUSH )
|
||||||
|
@ -475,7 +499,7 @@ Sequence::handle ( int m )
|
||||||
Sequence_Widget::select_none();
|
Sequence_Widget::select_none();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Fl_Widget::handle( m );
|
return Fl_Group::handle( m );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ class Sequence_Widget;
|
||||||
|
|
||||||
/* This is the base class for all track types. */
|
/* This is the base class for all track types. */
|
||||||
|
|
||||||
class Sequence : public Fl_Widget, public Loggable
|
class Sequence : public Fl_Group, public Loggable
|
||||||
{
|
{
|
||||||
|
|
||||||
/* not permitted */
|
/* not permitted */
|
||||||
|
@ -100,6 +100,9 @@ public:
|
||||||
void sort ( void );
|
void sort ( void );
|
||||||
void clear ( void );
|
void clear ( void );
|
||||||
|
|
||||||
|
int drawable_x ( void ) const;
|
||||||
|
int drawable_w ( void ) const;
|
||||||
|
|
||||||
const Sequence_Widget *next ( nframes_t from ) const;
|
const Sequence_Widget *next ( nframes_t from ) const;
|
||||||
const Sequence_Widget *prev ( nframes_t from ) const;
|
const Sequence_Widget *prev ( nframes_t from ) const;
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ Sequence_Widget::Sequence_Widget ( const Sequence_Widget &rhs ) : Loggable( rhs
|
||||||
_sequence = rhs._sequence;
|
_sequence = rhs._sequence;
|
||||||
|
|
||||||
_range = rhs._range;
|
_range = rhs._range;
|
||||||
|
_dragging_range = rhs._dragging_range;
|
||||||
_r = &_range;
|
_r = &_range;
|
||||||
|
|
||||||
_color = rhs._color;
|
_color = rhs._color;
|
||||||
|
@ -79,6 +80,7 @@ Sequence_Widget::operator= ( const Sequence_Widget &rhs )
|
||||||
|
|
||||||
_r = &_range;
|
_r = &_range;
|
||||||
_range = rhs._range;
|
_range = rhs._range;
|
||||||
|
_dragging_range = rhs._dragging_range;
|
||||||
_sequence = rhs._sequence;
|
_sequence = rhs._sequence;
|
||||||
_box_color = rhs._box_color;
|
_box_color = rhs._box_color;
|
||||||
_color = rhs._color;
|
_color = rhs._color;
|
||||||
|
@ -157,7 +159,7 @@ Sequence_Widget::set ( Log_Entry &e )
|
||||||
if ( _sequence )
|
if ( _sequence )
|
||||||
{
|
{
|
||||||
_sequence->handle_widget_change( _r->start, _r->length );
|
_sequence->handle_widget_change( _r->start, _r->length );
|
||||||
_sequence->redraw();
|
_sequence->damage( FL_DAMAGE_USER1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +170,12 @@ Sequence_Widget::begin_drag ( const Drag &d )
|
||||||
|
|
||||||
timeline->rdlock();
|
timeline->rdlock();
|
||||||
|
|
||||||
_r = new Range( _range );
|
/* copy current values */
|
||||||
|
|
||||||
|
_dragging_range = _range;
|
||||||
|
|
||||||
|
/* tell display to use temporary */
|
||||||
|
_r = &_dragging_range;
|
||||||
|
|
||||||
timeline->unlock();
|
timeline->unlock();
|
||||||
}
|
}
|
||||||
|
@ -176,20 +183,21 @@ Sequence_Widget::begin_drag ( const Drag &d )
|
||||||
void
|
void
|
||||||
Sequence_Widget::end_drag ( void )
|
Sequence_Widget::end_drag ( void )
|
||||||
{
|
{
|
||||||
|
/* swap in the new value */
|
||||||
|
/* go back to playback and display using same values */
|
||||||
|
|
||||||
timeline->wrlock();
|
timeline->wrlock();
|
||||||
|
|
||||||
/* swap in the new value */
|
_range = _dragging_range;
|
||||||
_range = *_r;
|
|
||||||
|
|
||||||
timeline->unlock();
|
|
||||||
|
|
||||||
delete _r;
|
|
||||||
_r = &_range;
|
_r = &_range;
|
||||||
|
|
||||||
delete _drag;
|
delete _drag;
|
||||||
_drag = NULL;
|
_drag = NULL;
|
||||||
|
|
||||||
|
/* this will result in a sort */
|
||||||
sequence()->handle_widget_change( _r->start, _r->length );
|
sequence()->handle_widget_change( _r->start, _r->length );
|
||||||
|
|
||||||
|
timeline->unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** set position of widget on the timeline. */
|
/** set position of widget on the timeline. */
|
||||||
|
@ -392,7 +400,10 @@ Sequence_Widget::handle ( int m )
|
||||||
/* deletion */
|
/* deletion */
|
||||||
if ( test_press( FL_BUTTON3 + FL_CTRL ) )
|
if ( test_press( FL_BUTTON3 + FL_CTRL ) )
|
||||||
{
|
{
|
||||||
|
timeline->wrlock();
|
||||||
remove();
|
remove();
|
||||||
|
timeline->unlock();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) )
|
else if ( test_press( FL_BUTTON1 ) || test_press( FL_BUTTON1 + FL_CTRL ) )
|
||||||
|
@ -476,18 +487,17 @@ Sequence_Widget::handle ( int m )
|
||||||
|
|
||||||
// timeline->update_length( start() + length() );
|
// timeline->update_length( start() + length() );
|
||||||
|
|
||||||
/* FIXME: why isn't this enough? */
|
sequence()->damage( FL_DAMAGE_USER1 );
|
||||||
sequence()->redraw();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! selected() || _selection.size() == 1 )
|
if ( ! selected() || _selection.size() == 1 )
|
||||||
{
|
{
|
||||||
/* track jumping */
|
/* track jumping */
|
||||||
if ( Y > y() + h() || Y < y() )
|
if ( Y > _sequence->y() + _sequence->h() || Y < _sequence->y() )
|
||||||
{
|
{
|
||||||
Track *t = timeline->track_under( Y );
|
Track *t = timeline->track_under( Y );
|
||||||
|
|
||||||
fl_cursor( (Fl_Cursor)1 );
|
fl_cursor( FL_CURSOR_HAND );
|
||||||
|
|
||||||
if ( t )
|
if ( t )
|
||||||
t->handle( FL_ENTER );
|
t->handle( FL_ENTER );
|
||||||
|
|
|
@ -141,7 +141,9 @@ protected:
|
||||||
|
|
||||||
Sequence *_sequence; /* track this region belongs to */
|
Sequence *_sequence; /* track this region belongs to */
|
||||||
|
|
||||||
Range _range; /* range for playback */
|
Range _range; /* always used by RT/osc threads */
|
||||||
|
Range _dragging_range; /* used when dragging */
|
||||||
|
|
||||||
Range *_r; /* range for editing / display (points to the same thing as above, except for when dragging etc) */
|
Range *_r; /* range for editing / display (points to the same thing as above, except for when dragging etc) */
|
||||||
|
|
||||||
Fl_Color _color; /* color of waveform */
|
Fl_Color _color; /* color of waveform */
|
||||||
|
@ -199,8 +201,9 @@ public:
|
||||||
|
|
||||||
int get_x( nframes_t frame ) const
|
int get_x( nframes_t frame ) const
|
||||||
{
|
{
|
||||||
return frame < timeline->xoffset ? _sequence->x() : min( _sequence->x() + _sequence->w(), _sequence->x() + timeline->ts_to_x( frame - timeline->xoffset ) );
|
return frame < timeline->xoffset ?
|
||||||
|
_sequence->drawable_x() :
|
||||||
|
min( _sequence->drawable_x() + _sequence->drawable_w(), _sequence->drawable_x() + timeline->ts_to_x( frame - timeline->xoffset ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int x ( void ) const
|
virtual int x ( void ) const
|
||||||
|
@ -211,7 +214,9 @@ public:
|
||||||
/* use this as x() when you need to draw lines between widgets */
|
/* use this as x() when you need to draw lines between widgets */
|
||||||
int line_x ( void ) const
|
int line_x ( void ) const
|
||||||
{
|
{
|
||||||
return _r->start < timeline->xoffset ? max( -32767, _sequence->x() - timeline->ts_to_x( timeline->xoffset - _r->start )) : min( 32767, _sequence->x() + timeline->ts_to_x( _r->start - timeline->xoffset ) );
|
return _r->start < timeline->xoffset ?
|
||||||
|
max( -32767, _sequence->drawable_x() - timeline->ts_to_x( timeline->xoffset - _r->start )) :
|
||||||
|
min( 32767, _sequence->drawable_x() + timeline->ts_to_x( _r->start - timeline->xoffset ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int w ( void ) const
|
virtual int w ( void ) const
|
||||||
|
@ -224,7 +229,7 @@ public:
|
||||||
else
|
else
|
||||||
rw = abs_w();
|
rw = abs_w();
|
||||||
|
|
||||||
return min( rw, _sequence->w() );
|
return min( rw, _sequence->drawable_w() );
|
||||||
}
|
}
|
||||||
|
|
||||||
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); }
|
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); }
|
||||||
|
@ -271,7 +276,7 @@ public:
|
||||||
/** convert a screen x coord into an start into the region */
|
/** convert a screen x coord into an start into the region */
|
||||||
nframes_t x_to_offset ( int X )
|
nframes_t x_to_offset ( int X )
|
||||||
{
|
{
|
||||||
return timeline->x_to_ts( scroll_x() + ( X - _sequence->x() ) ) - _r->start;
|
return timeline->x_to_ts( scroll_x() + ( X - _sequence->drawable_x() ) ) - _r->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
int active_r ( void ) const { return _sequence->active_r(); }
|
int active_r ( void ) const { return _sequence->active_r(); }
|
||||||
|
@ -299,11 +304,11 @@ public:
|
||||||
|
|
||||||
if ( ! (align() & FL_ALIGN_INSIDE) )
|
if ( ! (align() & FL_ALIGN_INSIDE) )
|
||||||
{
|
{
|
||||||
// FIXME: to better..
|
// FIXME: do better..
|
||||||
_sequence->redraw();
|
_sequence->damage( FL_DAMAGE_USER1 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_sequence->damage( FL_DAMAGE_ALL, x(), y(), w(), h() );
|
_sequence->damage( FL_DAMAGE_USER1, x(), y(), w(), h() );
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void draw_box ( void );
|
virtual void draw_box ( void );
|
||||||
|
|
|
@ -249,7 +249,7 @@ Loggable::progress_callback( &TLE::progress_cb, this );} {}
|
||||||
label {Non DAW : Timeline}
|
label {Non DAW : Timeline}
|
||||||
callback {if ( Fl::event_key() != FL_Escape )
|
callback {if ( Fl::event_key() != FL_Escape )
|
||||||
timeline->command_quit();} open
|
timeline->command_quit();} open
|
||||||
xywh {559 209 1025 770} type Double resizable
|
xywh {262 208 1025 770} type Double resizable
|
||||||
class TLE_Window xclass Non_DAW size_range {900 300 0 0} visible
|
class TLE_Window xclass Non_DAW size_range {900 300 0 0} visible
|
||||||
} {
|
} {
|
||||||
Fl_Group {} {
|
Fl_Group {} {
|
||||||
|
@ -396,7 +396,7 @@ Project::compact();}
|
||||||
} {
|
} {
|
||||||
MenuItem {} {
|
MenuItem {} {
|
||||||
label Undo
|
label Undo
|
||||||
callback {Loggable::undo();}
|
callback {Project::undo();}
|
||||||
xywh {5 5 40 25} shortcut 0x4007a divider
|
xywh {5 5 40 25} shortcut 0x4007a divider
|
||||||
}
|
}
|
||||||
MenuItem {} {
|
MenuItem {} {
|
||||||
|
@ -719,34 +719,38 @@ ab.run();}
|
||||||
} {
|
} {
|
||||||
Fl_Button solo_blinker {
|
Fl_Button solo_blinker {
|
||||||
label SOLO selected
|
label SOLO selected
|
||||||
xywh {800 33 50 15} box BORDER_BOX down_box BORDER_BOX color 74 selection_color 92 labelfont 1 labelsize 11 labelcolor 32 deactivate
|
xywh {800 33 50 15} box BORDER_BOX down_box BORDER_BOX color 74 selection_color 92 labelfont 1 labelsize 11 labelcolor 32
|
||||||
code0 {\#include "FL/Fl_Blink_Button.H"}
|
code0 {\#include "FL/Fl_Blink_Button.H"}
|
||||||
code1 {o->box( FL_ASYM_BOX );}
|
code1 {o->box( FL_ASYM_BOX );}
|
||||||
code2 {o->down_box( FL_ASYM_BOX );}
|
code2 {o->down_box( FL_ASYM_BOX );}
|
||||||
|
code3 {o->ignore_input( true );}
|
||||||
class Fl_Blink_Button
|
class Fl_Blink_Button
|
||||||
}
|
}
|
||||||
Fl_Button rec_blinker {
|
Fl_Button rec_blinker {
|
||||||
label REC selected
|
label REC selected
|
||||||
xywh {800 53 50 15} box BORDER_BOX down_box BORDER_BOX color 72 selection_color 88 labelfont 1 labelsize 11 labelcolor 32 deactivate
|
xywh {800 53 50 15} box BORDER_BOX down_box BORDER_BOX color 72 selection_color 88 labelfont 1 labelsize 11 labelcolor 32
|
||||||
code0 {\#include "FL/Fl_Blink_Button.H"}
|
code0 {\#include "FL/Fl_Blink_Button.H"}
|
||||||
code1 {o->box( FL_ASYM_BOX );}
|
code1 {o->box( FL_ASYM_BOX );}
|
||||||
code2 {o->down_box( FL_ASYM_BOX );}
|
code2 {o->down_box( FL_ASYM_BOX );}
|
||||||
|
code3 {o->ignore_input( true );}
|
||||||
class Fl_Blink_Button
|
class Fl_Blink_Button
|
||||||
}
|
}
|
||||||
Fl_Button selected_blinker {
|
Fl_Button selected_blinker {
|
||||||
label SEL selected
|
label SEL selected
|
||||||
xywh {745 53 50 15} box BORDER_BOX down_box BORDER_BOX color 13 selection_color 5 labelfont 1 labelsize 11 labelcolor 32 deactivate
|
xywh {745 53 50 15} box BORDER_BOX down_box BORDER_BOX color 13 selection_color 5 labelfont 1 labelsize 11 labelcolor 32
|
||||||
code0 {\#include "FL/Fl_Blink_Button.H"}
|
code0 {\#include "FL/Fl_Blink_Button.H"}
|
||||||
code1 {o->box( FL_ASYM_BOX );}
|
code1 {o->box( FL_ASYM_BOX );}
|
||||||
code2 {o->down_box( FL_ASYM_BOX );}
|
code2 {o->down_box( FL_ASYM_BOX );}
|
||||||
|
code3 {o->ignore_input( true );}
|
||||||
class Fl_Blink_Button
|
class Fl_Blink_Button
|
||||||
}
|
}
|
||||||
Fl_Button seek_blinker {
|
Fl_Button seek_blinker {
|
||||||
label SEEK selected
|
label SEEK selected
|
||||||
xywh {745 33 50 15} box BORDER_BOX down_box BORDER_BOX color 10 selection_color 2 labelfont 1 labelsize 11 labelcolor 32 deactivate
|
xywh {745 33 50 15} box BORDER_BOX down_box BORDER_BOX color 10 selection_color 2 labelfont 1 labelsize 11 labelcolor 32
|
||||||
code0 {\#include "FL/Fl_Blink_Button.H"}
|
code0 {\#include "FL/Fl_Blink_Button.H"}
|
||||||
code1 {o->box( FL_ASYM_BOX );}
|
code1 {o->box( FL_ASYM_BOX );}
|
||||||
code2 {o->down_box( FL_ASYM_BOX );}
|
code2 {o->down_box( FL_ASYM_BOX );}
|
||||||
|
code3 {o->ignore_input( true );}
|
||||||
class Fl_Blink_Button
|
class Fl_Blink_Button
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -995,7 +999,7 @@ if ( logo_box->image() )
|
||||||
((Fl_Shared_Image*)logo_box->image())->release();
|
((Fl_Shared_Image*)logo_box->image())->release();
|
||||||
logo_box->image( NULL );
|
logo_box->image( NULL );
|
||||||
}} open
|
}} open
|
||||||
private xywh {1240 261 520 775} type Double modal visible
|
private xywh {1242 261 520 775} type Double modal visible
|
||||||
} {
|
} {
|
||||||
Fl_Value_Output {} {
|
Fl_Value_Output {} {
|
||||||
label {Sample Rate}
|
label {Sample Rate}
|
||||||
|
|
|
@ -18,6 +18,22 @@
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
||||||
#include "Tempo_Sequence.H"
|
#include "Tempo_Sequence.H"
|
||||||
|
#include "Track.H"
|
||||||
|
|
||||||
|
Tempo_Sequence::Tempo_Sequence ( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
||||||
|
{
|
||||||
|
box( FL_FLAT_BOX );
|
||||||
|
|
||||||
|
{ Fl_Box *o = new Fl_Box( X, Y, Track::width(), H );
|
||||||
|
o->align( FL_ALIGN_RIGHT | FL_ALIGN_INSIDE );
|
||||||
|
o->labelsize( 12 );
|
||||||
|
o->labeltype( FL_NORMAL_LABEL );
|
||||||
|
o->label( "Tempo" );
|
||||||
|
Fl_Group::add( o );
|
||||||
|
}
|
||||||
|
|
||||||
|
resizable(0);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Tempo_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
Tempo_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
||||||
|
|
|
@ -35,10 +35,7 @@ public:
|
||||||
|
|
||||||
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
||||||
|
|
||||||
Tempo_Sequence ( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
Tempo_Sequence ( int X, int Y, int W, int H );
|
||||||
{
|
|
||||||
// box( FL_DOWN_BOX );
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_widget_change ( nframes_t start, nframes_t length );
|
void handle_widget_change ( nframes_t start, nframes_t length );
|
||||||
int handle ( int m );
|
int handle ( int m );
|
||||||
|
|
|
@ -18,6 +18,25 @@
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
||||||
#include "Time_Sequence.H"
|
#include "Time_Sequence.H"
|
||||||
|
#include "Track.H"
|
||||||
|
#include <FL/Fl_Box.H>
|
||||||
|
|
||||||
|
Time_Sequence::Time_Sequence ( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
||||||
|
{
|
||||||
|
box( FL_FLAT_BOX );
|
||||||
|
|
||||||
|
{ Fl_Box *o = new Fl_Box( X, Y, Track::width(), H );
|
||||||
|
o->align( FL_ALIGN_RIGHT | FL_ALIGN_INSIDE );
|
||||||
|
o->labelsize( 12 );
|
||||||
|
o->labeltype( FL_NORMAL_LABEL );
|
||||||
|
o->label( "Time" );
|
||||||
|
Fl_Group::add( o );
|
||||||
|
}
|
||||||
|
|
||||||
|
resizable(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Time_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
Time_Sequence::handle_widget_change ( nframes_t start, nframes_t length )
|
||||||
|
|
|
@ -39,10 +39,7 @@ public:
|
||||||
|
|
||||||
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
Fl_Cursor cursor ( void ) const { return FL_CURSOR_DEFAULT; }
|
||||||
|
|
||||||
Time_Sequence ( int X, int Y, int W, int H ) : Sequence ( X, Y, W, H )
|
Time_Sequence ( int X, int Y, int W, int H );
|
||||||
{
|
|
||||||
// box( FL_UP_BOX );
|
|
||||||
}
|
|
||||||
|
|
||||||
time_sig
|
time_sig
|
||||||
time ( nframes_t when )
|
time ( nframes_t when )
|
||||||
|
|
|
@ -321,7 +321,7 @@ Timeline::cb_scroll ( Fl_Widget *w )
|
||||||
|
|
||||||
if ( _old_yposition != panzoomer->y_value() )
|
if ( _old_yposition != panzoomer->y_value() )
|
||||||
{
|
{
|
||||||
tracks->position( tracks->x(), (rulers->y() + rulers->h()) - panzoomer->y_value() );
|
tracks->position( tracks->x(), track_window->y() - (int)panzoomer->y_value() );
|
||||||
damage( FL_DAMAGE_SCROLL );
|
damage( FL_DAMAGE_SCROLL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,6 +615,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
|
|
||||||
/* menu->add( "Add Track", 0, 0, 0 ); */
|
/* menu->add( "Add Track", 0, 0, 0 ); */
|
||||||
|
|
||||||
|
int ruler_height = 0;
|
||||||
|
|
||||||
menu->add( "Add audio track", 'a', 0, 0 );
|
menu->add( "Add audio track", 'a', 0, 0 );
|
||||||
menu->add( "Tempo from edit (beat)", 't', 0, 0 );
|
menu->add( "Tempo from edit (beat)", 't', 0, 0 );
|
||||||
menu->add( "Tempo from edit (bar)", FL_CTRL + 't', 0, 0 );
|
menu->add( "Tempo from edit (bar)", FL_CTRL + 't', 0, 0 );
|
||||||
|
@ -637,17 +639,15 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Pack *o = new Fl_Pack( X + Track::width(), Y, (W - Track::width()), 1, "rulers" );
|
Fl_Pack *o = new Fl_Pack( X, Y, W, 1, "rulers" );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
|
|
||||||
{
|
{
|
||||||
Tempo_Sequence *o = new Tempo_Sequence( 0, 0, 800, 18 );
|
Tempo_Sequence *o = new Tempo_Sequence( 0, 0, 800, 18 );
|
||||||
|
|
||||||
o->color( FL_GRAY );
|
o->color( FL_DARK1 );
|
||||||
|
|
||||||
o->labelsize( 12 );
|
/* o->label( "Tempo" ); */
|
||||||
o->label( "Tempo" );
|
|
||||||
o->align( FL_ALIGN_LEFT );
|
|
||||||
|
|
||||||
tempo_track = o;
|
tempo_track = o;
|
||||||
}
|
}
|
||||||
|
@ -655,11 +655,9 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
{
|
{
|
||||||
Time_Sequence *o = new Time_Sequence( 0, 24, 800, 18 );
|
Time_Sequence *o = new Time_Sequence( 0, 24, 800, 18 );
|
||||||
|
|
||||||
o->color( fl_lighter( FL_GRAY ) );
|
o->color( FL_DARK2 );
|
||||||
|
|
||||||
o->labelsize( 12 );
|
/* o->name( "Time" ); */
|
||||||
o->label( "Time" );
|
|
||||||
o->align( FL_ALIGN_LEFT );
|
|
||||||
|
|
||||||
time_track = o;
|
time_track = o;
|
||||||
}
|
}
|
||||||
|
@ -667,11 +665,9 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
{
|
{
|
||||||
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
||||||
|
|
||||||
o->color( FL_GRAY );
|
o->color( FL_DARK1 );
|
||||||
|
|
||||||
o->labelsize( 12 );
|
|
||||||
o->label( "Edit" );
|
o->label( "Edit" );
|
||||||
o->align( FL_ALIGN_LEFT );
|
|
||||||
o->cursor_color( FL_YELLOW );
|
o->cursor_color( FL_YELLOW );
|
||||||
|
|
||||||
edit_cursor_track = o;
|
edit_cursor_track = o;
|
||||||
|
@ -680,11 +676,9 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
{
|
{
|
||||||
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
||||||
|
|
||||||
o->color( fl_lighter( FL_GRAY ) );
|
o->color( FL_DARK2 );
|
||||||
|
|
||||||
o->labelsize( 12 );
|
|
||||||
o->label( "Punch" );
|
o->label( "Punch" );
|
||||||
o->align( FL_ALIGN_LEFT );
|
|
||||||
o->cursor_color( FL_RED );
|
o->cursor_color( FL_RED );
|
||||||
|
|
||||||
punch_cursor_track = o;
|
punch_cursor_track = o;
|
||||||
|
@ -693,11 +687,9 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
{
|
{
|
||||||
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
Cursor_Sequence *o = new Cursor_Sequence( 0, 24, 800, 18 );
|
||||||
|
|
||||||
o->color( FL_GRAY );
|
o->color( FL_DARK1 );
|
||||||
|
|
||||||
o->labelsize( 12 );
|
|
||||||
o->label( "Playback" );
|
o->label( "Playback" );
|
||||||
o->align( FL_ALIGN_LEFT );
|
|
||||||
o->cursor_color( FL_GREEN );
|
o->cursor_color( FL_GREEN );
|
||||||
|
|
||||||
play_cursor_track = o;
|
play_cursor_track = o;
|
||||||
|
@ -715,16 +707,22 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
/* } */
|
/* } */
|
||||||
|
|
||||||
rulers = o;
|
rulers = o;
|
||||||
o->size( o->w(), o->child( 0 )->h() * o->children() );
|
|
||||||
o->end();
|
o->end();
|
||||||
|
|
||||||
|
ruler_height = o->child( 0 )->h() * o->children();
|
||||||
|
|
||||||
|
DMESSAGE( "Ruler height: %i", ruler_height );
|
||||||
|
|
||||||
|
o->size( o->w(), ruler_height );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Tile *o = new Fl_Tile( X, rulers->y() + rulers->h(), W, H - rulers->h() );
|
Fl_Tile *o = new Fl_Tile( X, rulers->y() + ruler_height, W, H - rulers->h() );
|
||||||
o->box(FL_FLAT_BOX);
|
o->box(FL_FLAT_BOX);
|
||||||
o->when( FL_WHEN_RELEASE );
|
o->when( FL_WHEN_RELEASE );
|
||||||
{
|
{
|
||||||
Fl_Group *o = new Fl_Group( X, rulers->y() + rulers->h(), W, ( H - rulers->h() ) - 50 );
|
Fl_Group *o = new Fl_Group( X, rulers->y() + rulers->h(), W, ( H - rulers->h() ) - 50 );
|
||||||
|
o->box(FL_FLAT_BOX);
|
||||||
{
|
{
|
||||||
_fpp = 8;
|
_fpp = 8;
|
||||||
Fl_Pack *o = new Fl_Pack( X, rulers->y() + rulers->h(), W, 1 );
|
Fl_Pack *o = new Fl_Pack( X, rulers->y() + rulers->h(), W, 1 );
|
||||||
|
@ -733,7 +731,7 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
|
|
||||||
tracks = o;
|
tracks = o;
|
||||||
o->end();
|
o->end();
|
||||||
resizable( o );
|
/* Fl_Group::current()->resizable( o ); */
|
||||||
}
|
}
|
||||||
|
|
||||||
o->end();
|
o->end();
|
||||||
|
@ -753,14 +751,13 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
o->type( FL_HORIZONTAL );
|
o->type( FL_HORIZONTAL );
|
||||||
o->callback( cb_scroll, this );
|
o->callback( cb_scroll, this );
|
||||||
|
|
||||||
//resizable(o);
|
|
||||||
panzoomer = o;
|
panzoomer = o;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fl_Box *spacebox = new Fl_Box( 0,0,1,1 );
|
Fl_Box *spacebox = new Fl_Box( 0,0,1,1 );
|
||||||
|
|
||||||
o->end();
|
o->end();
|
||||||
o->resizable( spacebox);
|
o->resizable( spacebox );
|
||||||
|
|
||||||
spacebox->resize( X, rulers->y() + ( ( H - rulers->h() ) - 50 ),
|
spacebox->resize( X, rulers->y() + ( ( H - rulers->h() ) - 50 ),
|
||||||
W, 125 );
|
W, 125 );
|
||||||
|
@ -768,19 +765,14 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : BASE( X, Y, W
|
||||||
o->position( panzoomer->x(), panzoomer->y(),
|
o->position( panzoomer->x(), panzoomer->y(),
|
||||||
panzoomer->x(), track_window->y() + track_window->h() );
|
panzoomer->x(), track_window->y() + track_window->h() );
|
||||||
|
|
||||||
resizable(o);
|
|
||||||
tile = o;
|
tile = o;
|
||||||
|
resizable(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* rulers go above tracks... */
|
/* rulers go above tracks... */
|
||||||
add( rulers );
|
add( rulers );
|
||||||
|
|
||||||
/* make sure scrollbars are on top */
|
/* redraw(); */
|
||||||
/* add( panzoomer ); */
|
|
||||||
|
|
||||||
// vscroll->range( 0, tracks->h() );
|
|
||||||
|
|
||||||
redraw();
|
|
||||||
|
|
||||||
end();
|
end();
|
||||||
|
|
||||||
|
@ -1112,7 +1104,7 @@ Timeline::draw_measure_lines ( int X, int Y, int W, int H )
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Timeline::draw_clip ( void * v, int X, int Y, int W, int H )
|
Timeline::draw_clip_rulers ( void * v, int X, int Y, int W, int H )
|
||||||
{
|
{
|
||||||
Timeline *tl = (Timeline *)v;
|
Timeline *tl = (Timeline *)v;
|
||||||
|
|
||||||
|
@ -1120,9 +1112,25 @@ Timeline::draw_clip ( void * v, int X, int Y, int W, int H )
|
||||||
|
|
||||||
tl->draw_box();
|
tl->draw_box();
|
||||||
|
|
||||||
|
tl->draw_child( *tl->rulers );
|
||||||
|
|
||||||
|
fl_pop_clip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Timeline::draw_clip_tracks ( void * v, int X, int Y, int W, int H )
|
||||||
|
{
|
||||||
|
Timeline *tl = (Timeline *)v;
|
||||||
|
|
||||||
|
fl_push_clip( X, Y, W, H );
|
||||||
|
|
||||||
|
tl->draw_box();
|
||||||
|
|
||||||
|
fl_damage_t pzd = tl->panzoomer->damage();
|
||||||
|
|
||||||
tl->draw_child( *tl->tile );
|
tl->draw_child( *tl->tile );
|
||||||
|
|
||||||
tl->draw_child( *tl->rulers );
|
tl->panzoomer->damage( pzd );
|
||||||
|
|
||||||
tl->draw_cursors();
|
tl->draw_cursors();
|
||||||
|
|
||||||
|
@ -1137,7 +1145,7 @@ Timeline::resize ( int X, int Y, int W, int H )
|
||||||
|
|
||||||
tile->resizable()->resize( X,
|
tile->resizable()->resize( X,
|
||||||
tile->y() + tile->h() - 150,
|
tile->y() + tile->h() - 150,
|
||||||
W, 125 );
|
W, 125 );
|
||||||
|
|
||||||
/* why is THIS necessary? */
|
/* why is THIS necessary? */
|
||||||
panzoomer->resize( X,
|
panzoomer->resize( X,
|
||||||
|
@ -1150,12 +1158,12 @@ Timeline::resize ( int X, int Y, int W, int H )
|
||||||
W,
|
W,
|
||||||
tile->h() - 50);
|
tile->h() - 50);
|
||||||
|
|
||||||
rulers->resize( X + Track::width(),
|
/* /\* rulers->resize( X, *\/ */
|
||||||
rulers->y(),
|
/* /\* rulers->y(), *\/ */
|
||||||
W - Track::width(),
|
/* /\* W, *\/ */
|
||||||
rulers->h() );
|
/* /\* rulers->h() ); *\/ */
|
||||||
|
|
||||||
tile->redraw();
|
/* tile->redraw(); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1245,7 +1253,7 @@ Timeline::draw ( void )
|
||||||
adjust_panzoomer();
|
adjust_panzoomer();
|
||||||
|
|
||||||
int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset );
|
int dx = ts_to_x( _old_xposition ) - ts_to_x( xoffset );
|
||||||
int dy = _old_yposition - panzoomer->y_value();
|
int dy = _old_yposition - (int)panzoomer->y_value();
|
||||||
|
|
||||||
int c = damage();
|
int c = damage();
|
||||||
|
|
||||||
|
@ -1253,30 +1261,37 @@ Timeline::draw ( void )
|
||||||
|
|
||||||
if ( c & FL_DAMAGE_SCROLL )
|
if ( c & FL_DAMAGE_SCROLL )
|
||||||
{
|
{
|
||||||
/* if ( dx && dy ) */
|
|
||||||
/* { */
|
|
||||||
/* /\* FIXME: scrolling both at once is... problematic *\/ */
|
|
||||||
|
|
||||||
/* c |= FL_DAMAGE_ALL; */
|
|
||||||
/* } */
|
|
||||||
/* else */
|
|
||||||
{
|
{
|
||||||
/* draw_child( *rulers ); */
|
/* draw_child( *rulers ); */
|
||||||
|
|
||||||
Y = track_window->y();
|
Y = track_window->y();
|
||||||
H = track_window->h();
|
H = track_window->h();
|
||||||
|
|
||||||
if ( dy )
|
|
||||||
fl_scroll( X, Y, Track::width(), H, 0, dy, draw_clip, this );
|
|
||||||
|
|
||||||
if ( dx )
|
if ( dx )
|
||||||
fl_scroll( rulers->x(), rulers->y(), rulers->w(), rulers->h(), dx, 0, draw_clip, this );
|
/* when scrolling horizontally, scroll rulers */
|
||||||
|
fl_scroll( rulers->x() + Track::width(),
|
||||||
|
rulers->y(),
|
||||||
|
rulers->w(),
|
||||||
|
rulers->h(), dx, 0, draw_clip_rulers, this );
|
||||||
|
|
||||||
fl_scroll( X + Track::width(), Y, W - Track::width(), H, dx, dy, draw_clip, this );
|
if ( dy )
|
||||||
|
/* when scrolling vertically, also scroll track headers */
|
||||||
|
fl_scroll(
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
Track::width(),
|
||||||
|
H, 0, dy, draw_clip_tracks, this );
|
||||||
|
|
||||||
|
/* scroll sequences */
|
||||||
|
fl_scroll( X + Track::width(),
|
||||||
|
Y,
|
||||||
|
W - Track::width(),
|
||||||
|
H, dx, dy, draw_clip_tracks, this );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
panzoomer->redraw();
|
// panzoomer->redraw();
|
||||||
|
|
||||||
if ( c & FL_DAMAGE_ALL )
|
if ( c & FL_DAMAGE_ALL )
|
||||||
{
|
{
|
||||||
|
@ -1311,6 +1326,10 @@ Timeline::draw ( void )
|
||||||
tile->w(),
|
tile->w(),
|
||||||
tile->h() );
|
tile->h() );
|
||||||
|
|
||||||
|
/* redraw the panzoomer preview whenever tracks change */
|
||||||
|
/* if ( tracks->damage() ) */
|
||||||
|
/* panzoomer->redraw(); */
|
||||||
|
|
||||||
update_child(*tile);
|
update_child(*tile);
|
||||||
|
|
||||||
draw_cursors();
|
draw_cursors();
|
||||||
|
@ -1329,6 +1348,12 @@ done:
|
||||||
_old_yposition = panzoomer->y_value();
|
_old_yposition = panzoomer->y_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Timeline::damage_sequence ( void )
|
||||||
|
{
|
||||||
|
panzoomer->redraw();
|
||||||
|
}
|
||||||
|
|
||||||
/** draw a single cursor line at /frame/ with color /color/ using symbol routine /symbol/ for the cap */
|
/** draw a single cursor line at /frame/ with color /color/ using symbol routine /symbol/ for the cap */
|
||||||
void
|
void
|
||||||
Timeline::draw_cursor ( nframes_t frame, Fl_Color color, void (*symbol)(Fl_Color) ) const
|
Timeline::draw_cursor ( nframes_t frame, Fl_Color color, void (*symbol)(Fl_Color) ) const
|
||||||
|
@ -1726,7 +1751,7 @@ Timeline::track_by_name ( const char *name )
|
||||||
{
|
{
|
||||||
Track *t = (Track*)tracks->child( i );
|
Track *t = (Track*)tracks->child( i );
|
||||||
|
|
||||||
if ( ! strcmp( name, t->name() ) )
|
if ( name && t->name() && ! strcmp( name, t->name() ) )
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1831,8 +1856,6 @@ Timeline::add_track ( Track *track )
|
||||||
{
|
{
|
||||||
DMESSAGE( "added new track to the timeline" );
|
DMESSAGE( "added new track to the timeline" );
|
||||||
|
|
||||||
wrlock();
|
|
||||||
|
|
||||||
engine->lock();
|
engine->lock();
|
||||||
|
|
||||||
tracks->add( track );
|
tracks->add( track );
|
||||||
|
@ -1841,8 +1864,6 @@ Timeline::add_track ( Track *track )
|
||||||
|
|
||||||
engine->unlock();
|
engine->unlock();
|
||||||
|
|
||||||
unlock();
|
|
||||||
|
|
||||||
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
||||||
redraw();
|
redraw();
|
||||||
|
|
||||||
|
@ -1854,8 +1875,6 @@ Timeline::insert_track ( Track *track, int n )
|
||||||
if ( n > tracks->children() || n < 0 )
|
if ( n > tracks->children() || n < 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wrlock();
|
|
||||||
|
|
||||||
engine->lock();
|
engine->lock();
|
||||||
|
|
||||||
tracks->insert( *track, n );
|
tracks->insert( *track, n );
|
||||||
|
@ -1866,8 +1885,6 @@ Timeline::insert_track ( Track *track, int n )
|
||||||
|
|
||||||
engine->unlock();
|
engine->unlock();
|
||||||
|
|
||||||
unlock();
|
|
||||||
|
|
||||||
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
||||||
// redraw();
|
// redraw();
|
||||||
}
|
}
|
||||||
|
@ -1882,8 +1899,6 @@ compare_tracks ( Track *a, Track *b )
|
||||||
void
|
void
|
||||||
Timeline::apply_track_order ( void )
|
Timeline::apply_track_order ( void )
|
||||||
{
|
{
|
||||||
wrlock();
|
|
||||||
|
|
||||||
engine->lock();
|
engine->lock();
|
||||||
|
|
||||||
std::list<Track*> tl;
|
std::list<Track*> tl;
|
||||||
|
@ -1904,8 +1919,6 @@ Timeline::apply_track_order ( void )
|
||||||
update_track_order();
|
update_track_order();
|
||||||
|
|
||||||
engine->unlock();
|
engine->unlock();
|
||||||
|
|
||||||
unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1939,8 +1952,6 @@ Timeline::remove_track ( Track *track )
|
||||||
{
|
{
|
||||||
DMESSAGE( "removed track from the timeline" );
|
DMESSAGE( "removed track from the timeline" );
|
||||||
|
|
||||||
wrlock();
|
|
||||||
|
|
||||||
engine->lock();
|
engine->lock();
|
||||||
|
|
||||||
/* FIXME: what to do about track contents? */
|
/* FIXME: what to do about track contents? */
|
||||||
|
@ -1950,9 +1961,6 @@ Timeline::remove_track ( Track *track )
|
||||||
|
|
||||||
engine->unlock();
|
engine->unlock();
|
||||||
|
|
||||||
unlock();
|
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
/* FIXME: why is this necessary? doesn't the above add do DAMAGE_CHILD? */
|
||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
@ -2124,6 +2132,8 @@ Timeline::handle_peer_scan_complete ( void *o )
|
||||||
void
|
void
|
||||||
Timeline::connect_osc ( void )
|
Timeline::connect_osc ( void )
|
||||||
{
|
{
|
||||||
|
wrlock();
|
||||||
|
|
||||||
/* try to (re)connect OSC signals */
|
/* try to (re)connect OSC signals */
|
||||||
for ( int i = tracks->children(); i-- ; )
|
for ( int i = tracks->children(); i-- ; )
|
||||||
{
|
{
|
||||||
|
@ -2131,6 +2141,8 @@ Timeline::connect_osc ( void )
|
||||||
|
|
||||||
t->connect_osc();
|
t->connect_osc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -2158,6 +2170,7 @@ Timeline::process_osc ( void )
|
||||||
{
|
{
|
||||||
THREAD_ASSERT( OSC );
|
THREAD_ASSERT( OSC );
|
||||||
|
|
||||||
|
/* FIXME: is holding this lock a problem for recording? */
|
||||||
rdlock();
|
rdlock();
|
||||||
|
|
||||||
/* reconnect OSC signals */
|
/* reconnect OSC signals */
|
||||||
|
|
|
@ -100,7 +100,8 @@ class Timeline : public Fl_Single_Window, public RWLock
|
||||||
|
|
||||||
class Timeline_Panzoomer;
|
class Timeline_Panzoomer;
|
||||||
|
|
||||||
static void draw_clip ( void * v, int X, int Y, int W, int H );
|
static void draw_clip_rulers ( void * v, int X, int Y, int W, int H );
|
||||||
|
static void draw_clip_tracks ( void * v, int X, int Y, int W, int H );
|
||||||
|
|
||||||
nframes_t _old_xposition;
|
nframes_t _old_xposition;
|
||||||
int _old_yposition;
|
int _old_yposition;
|
||||||
|
@ -110,8 +111,8 @@ class Timeline : public Fl_Single_Window, public RWLock
|
||||||
Fl_Group *track_window;
|
Fl_Group *track_window;
|
||||||
Fl_Pack *tracks;
|
Fl_Pack *tracks;
|
||||||
Fl_Pack *rulers;
|
Fl_Pack *rulers;
|
||||||
Fl_Panzoomer *panzoomer;
|
|
||||||
Fl_Tile *tile;
|
Fl_Tile *tile;
|
||||||
|
Fl_Panzoomer *panzoomer;
|
||||||
|
|
||||||
void adjust_panzoomer ( void );
|
void adjust_panzoomer ( void );
|
||||||
static void cb_scroll ( Fl_Widget *w, void *v );
|
static void cb_scroll ( Fl_Widget *w, void *v );
|
||||||
|
@ -139,6 +140,9 @@ class Timeline : public Fl_Single_Window, public RWLock
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/* called when widgets are moved etc */
|
||||||
|
void damage_sequence ( void );
|
||||||
|
|
||||||
OSC::Endpoint *osc;
|
OSC::Endpoint *osc;
|
||||||
OSC_Thread *osc_thread;
|
OSC_Thread *osc_thread;
|
||||||
|
|
||||||
|
@ -305,6 +309,9 @@ public:
|
||||||
void add_cursor ( Cursor_Region *o );
|
void add_cursor ( Cursor_Region *o );
|
||||||
void add_cursor ( Cursor_Point *o );
|
void add_cursor ( Cursor_Point *o );
|
||||||
|
|
||||||
|
char * get_unique_track_name ( const char *name );
|
||||||
|
Track * track_by_name ( const char *name );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void add_take_for_armed_tracks();
|
void add_take_for_armed_tracks();
|
||||||
|
@ -315,8 +322,6 @@ private:
|
||||||
|
|
||||||
friend class Engine; // FIXME: only Engine::process() needs to be friended.x
|
friend class Engine; // FIXME: only Engine::process() needs to be friended.x
|
||||||
|
|
||||||
Track * track_by_name ( const char *name );
|
|
||||||
char * get_unique_track_name ( const char *name );
|
|
||||||
|
|
||||||
/* Engine */
|
/* Engine */
|
||||||
void resize_buffers ( nframes_t nframes );
|
void resize_buffers ( nframes_t nframes );
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "Transport.H"
|
#include "Transport.H"
|
||||||
|
|
||||||
#include "../FL/Fl_Sometimes_Input.H"
|
#include "../FL/Fl_Sometimes_Input.H"
|
||||||
|
#include "../FL/Fl_Sometimes_Pack.H"
|
||||||
#include <FL/fl_ask.H>
|
#include <FL/fl_ask.H>
|
||||||
#include <FL/Fl_Color_Chooser.H>
|
#include <FL/Fl_Color_Chooser.H>
|
||||||
#include <FL/Fl.H>
|
#include <FL/Fl.H>
|
||||||
|
@ -54,70 +55,6 @@ random_color ( void )
|
||||||
|
|
||||||
static Fl_Menu_Button _menu( 0, 0, 0, 0, "Track" );
|
static Fl_Menu_Button _menu( 0, 0, 0, 0, "Track" );
|
||||||
|
|
||||||
class Fl_Sometimes_Pack : public Fl_Pack
|
|
||||||
{
|
|
||||||
bool _pack;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
Fl_Sometimes_Pack ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Pack(X,Y,W,H,L)
|
|
||||||
{
|
|
||||||
_pack = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~Fl_Sometimes_Pack ( )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void pack ( bool b )
|
|
||||||
{
|
|
||||||
if ( b != _pack )
|
|
||||||
redraw();
|
|
||||||
|
|
||||||
_pack = b;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pack ( void ) const
|
|
||||||
{
|
|
||||||
return _pack;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void draw ( void )
|
|
||||||
{
|
|
||||||
/* draw_box(); */
|
|
||||||
|
|
||||||
if ( _pack )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < children(); i++ )
|
|
||||||
{
|
|
||||||
Fl_Widget *o = child( i );
|
|
||||||
|
|
||||||
o->box( FL_FLAT_BOX );
|
|
||||||
}
|
|
||||||
|
|
||||||
Fl_Pack::draw();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( children() )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < children(); i++ )
|
|
||||||
{
|
|
||||||
Fl_Widget *o = child( i );
|
|
||||||
|
|
||||||
if ( i != 0 )
|
|
||||||
o->box( FL_NO_BOX );
|
|
||||||
|
|
||||||
o->resize( x(),y(),w(), o->h() );
|
|
||||||
}
|
|
||||||
resize( x(), y(), w(), child(0)->h() );
|
|
||||||
}
|
|
||||||
|
|
||||||
Fl_Group::draw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int Track::_soloing = 0;
|
int Track::_soloing = 0;
|
||||||
|
@ -206,7 +143,7 @@ Track::init ( void )
|
||||||
o->box( FL_FLAT_BOX );
|
o->box( FL_FLAT_BOX );
|
||||||
|
|
||||||
{
|
{
|
||||||
Track_Header *o = new Track_Header( x(), y(), 200, 80 );
|
Track_Header *o = new Track_Header( x(), y(), w(), h() );
|
||||||
|
|
||||||
name_field = o->name_input;
|
name_field = o->name_input;
|
||||||
record_button = o->rec_button;
|
record_button = o->rec_button;
|
||||||
|
@ -224,18 +161,12 @@ Track::init ( void )
|
||||||
overlay_controls_button->callback( cb_button, this );
|
overlay_controls_button->callback( cb_button, this );
|
||||||
|
|
||||||
resizable( o );
|
resizable( o );
|
||||||
o->color( (Fl_Color)53 );
|
// o->color( (Fl_Color)53 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* { */
|
|
||||||
/* Fl_Box *o = new Fl_Box( 0, 72, 149, 38 ); */
|
|
||||||
/* o->box( FL_NO_BOX ); */
|
|
||||||
/* Fl_Group::current()->resizable( o ); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
{
|
{
|
||||||
/* this pack holds the active sequence, annotation sequence, control sequences and takes */
|
/* this pack holds the active sequence, annotation sequence, control sequences and takes */
|
||||||
Fl_Pack *o = pack = new Fl_Pack( x() + width(), y(), w() - width(), h() );
|
Fl_Pack *o = pack = new Fl_Pack( x(), y(), w(), h() );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
o->labeltype( FL_NO_LABEL );
|
o->labeltype( FL_NO_LABEL );
|
||||||
/* o->resize( x() + width(), y(), w() - width(), h() ); */
|
/* o->resize( x() + width(), y(), w() - width(), h() ); */
|
||||||
|
@ -243,25 +174,66 @@ Track::init ( void )
|
||||||
/* resizable( o ); */
|
/* resizable( o ); */
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Pack *o = annotation = new Fl_Pack( width(), 0, pack->w(), 1 );
|
Fl_Pack *o = annotation = new Fl_Pack( 0, 0, pack->w(), 1 );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
o->end();
|
o->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Sometimes_Pack *o = control = new Fl_Sometimes_Pack( width(), 0, pack->w(), 1 );
|
{
|
||||||
o->box( FL_NO_BOX );
|
Fl_Group *o = controls_heading = new Fl_Group( 0, 0, pack->w(), 10 );
|
||||||
o->color( FL_BACKGROUND_COLOR );
|
o->box( FL_FLAT_BOX );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->color( fl_color_add_alpha( fl_rgb_color( 1,1,1 ), 127 ) );
|
||||||
o->pack( true );
|
|
||||||
o->end();
|
{
|
||||||
|
Fl_Box *o = new Fl_Box( 0,0, Track::width(), 10 );
|
||||||
|
o->label( "Controls" );
|
||||||
|
o->align( FL_ALIGN_RIGHT | FL_ALIGN_INSIDE );
|
||||||
|
o->labelsize( 10 );
|
||||||
|
}
|
||||||
|
|
||||||
|
o->hide();
|
||||||
|
o->end();
|
||||||
|
o->resizable( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Fl_Sometimes_Pack *o = control = new Fl_Sometimes_Pack( 0, 0, pack->w(), 1 );
|
||||||
|
o->spacing( 1 );
|
||||||
|
o->box( FL_NO_BOX );
|
||||||
|
o->color( FL_BACKGROUND_COLOR );
|
||||||
|
o->type( Fl_Pack::VERTICAL );
|
||||||
|
o->pack( true );
|
||||||
|
o->hide();
|
||||||
|
o->align( FL_ALIGN_TOP | FL_ALIGN_LEFT );
|
||||||
|
o->end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Pack *o = takes = new Fl_Pack( width(), 0, pack->w(), 1 );
|
{
|
||||||
|
Fl_Group *o = takes_heading = new Fl_Group( 0, 0, pack->w(), 10 );
|
||||||
|
o->box( FL_FLAT_BOX );
|
||||||
|
o->color( fl_color_add_alpha( fl_rgb_color( 1,1,1 ), 127 ) );
|
||||||
|
|
||||||
|
{
|
||||||
|
Fl_Box *o = new Fl_Box( 0,0, Track::width(), 10 );
|
||||||
|
o->label( "Takes" );
|
||||||
|
o->align( FL_ALIGN_RIGHT | FL_ALIGN_INSIDE );
|
||||||
|
o->labelsize( 10 );
|
||||||
|
}
|
||||||
|
o->hide();
|
||||||
|
o->end();
|
||||||
|
o->resizable( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
Fl_Pack *o = takes = new Fl_Pack( 0, 0, pack->w(), 1 );
|
||||||
o->type( Fl_Pack::VERTICAL );
|
o->type( Fl_Pack::VERTICAL );
|
||||||
o->end();
|
o->end();
|
||||||
o->hide();
|
o->hide();
|
||||||
|
o->align( FL_ALIGN_TOP | FL_ALIGN_LEFT );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
o->end();
|
o->end();
|
||||||
|
@ -464,62 +436,131 @@ Track::adjust_size ( void )
|
||||||
for ( int i = control->children(); i--; )
|
for ( int i = control->children(); i--; )
|
||||||
control->child( i )->size( w(), height() );
|
control->child( i )->size( w(), height() );
|
||||||
|
|
||||||
control->pack( ! overlay_controls() );
|
if ( overlay_controls() )
|
||||||
|
|
||||||
int TH = height();
|
|
||||||
|
|
||||||
if ( show_all_takes() )
|
|
||||||
{
|
{
|
||||||
takes->show();
|
for ( int i = 0; i < control->children(); i++ )
|
||||||
TH += height() * takes->children();
|
{
|
||||||
|
Control_Sequence *o = (Control_Sequence*)control->child(i);
|
||||||
|
|
||||||
|
if ( i != 0 )
|
||||||
|
o->box( FL_NO_BOX );
|
||||||
|
|
||||||
|
o->header()->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
control->pack( false );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
takes->hide();
|
|
||||||
|
|
||||||
if ( control->children() )
|
|
||||||
{
|
{
|
||||||
control->show();
|
for ( int i = 0; i < control->children(); i++ )
|
||||||
|
{
|
||||||
|
Control_Sequence *o = (Control_Sequence*)control->child(i);
|
||||||
|
|
||||||
if ( overlay_controls() )
|
o->box( FL_FLAT_BOX );
|
||||||
TH += height() * (control->children() ? 1 : 0);
|
|
||||||
else
|
o->header()->show();
|
||||||
TH += height() * pack_visible( control );
|
}
|
||||||
|
|
||||||
|
control->pack( true );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
control->hide();
|
|
||||||
|
int TY = 0;
|
||||||
|
|
||||||
if ( annotation->children() )
|
if ( annotation->children() )
|
||||||
{
|
{
|
||||||
annotation->show();
|
annotation->show();
|
||||||
TH += 24 * pack_visible( annotation );
|
TY += 24 * pack_visible( annotation );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
annotation->hide();
|
annotation->hide();
|
||||||
|
|
||||||
|
/* height of the sequence */
|
||||||
|
TY += height();
|
||||||
|
|
||||||
|
if ( control->children() )
|
||||||
|
{
|
||||||
|
int TH;
|
||||||
|
|
||||||
|
/* calculate height of control pack */
|
||||||
|
if ( overlay_controls() )
|
||||||
|
TH = height() * (control->children() ? 1 : 0);
|
||||||
|
else
|
||||||
|
TH = height() * pack_visible( control );
|
||||||
|
|
||||||
|
TY += TH;
|
||||||
|
|
||||||
|
control->show();
|
||||||
|
controls_heading->show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
control->hide();
|
||||||
|
controls_heading->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( show_all_takes() )
|
||||||
|
{
|
||||||
|
/* calculate height of takes pack */
|
||||||
|
const int TH = height() * takes->children();
|
||||||
|
|
||||||
|
TY += TH;
|
||||||
|
|
||||||
|
takes->show();
|
||||||
|
takes_heading->show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
takes_heading->hide();
|
||||||
|
takes->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( takes_heading->visible() )
|
||||||
|
TY += takes_heading->h();
|
||||||
|
if ( controls_heading->visible() )
|
||||||
|
TY += controls_heading->h();
|
||||||
|
|
||||||
|
int TH;
|
||||||
|
|
||||||
if ( ! size() )
|
if ( ! size() )
|
||||||
{
|
{
|
||||||
takes->hide();
|
takes->hide();
|
||||||
control->hide();
|
control->hide();
|
||||||
Fl_Group::size( w(), height() );
|
TH = height();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Fl_Group::size( w(), TH );
|
TH = TY;
|
||||||
|
|
||||||
|
Fl_Group::size( w(), TH );
|
||||||
|
|
||||||
if ( sequence() )
|
if ( sequence() )
|
||||||
sequence()->size( w(), height() );
|
sequence()->size( w(), height() );
|
||||||
|
|
||||||
/* if ( controls->y() + controls->h() > y() + h() ) */
|
|
||||||
/* controls->hide(); */
|
|
||||||
/* else */
|
|
||||||
/* controls->show(); */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: why is this necessary? */
|
/* FIXME: why is this necessary? */
|
||||||
if ( parent() )
|
if ( parent() )
|
||||||
parent()->parent()->redraw();
|
parent()->parent()->redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Track::name ( const char *name )
|
||||||
|
{
|
||||||
|
if ( _name )
|
||||||
|
free( _name );
|
||||||
|
|
||||||
|
_name = timeline->get_unique_track_name(name);
|
||||||
|
|
||||||
|
if ( name_field )
|
||||||
|
name_field->value( _name );
|
||||||
|
|
||||||
|
update_port_names();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
Track::name ( void ) const
|
||||||
|
{
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Track::size ( int v )
|
Track::size ( int v )
|
||||||
{
|
{
|
||||||
|
@ -535,8 +576,13 @@ Track::size ( int v )
|
||||||
void
|
void
|
||||||
Track::add ( Audio_Sequence * t )
|
Track::add ( Audio_Sequence * t )
|
||||||
{
|
{
|
||||||
|
t->track( this );
|
||||||
|
|
||||||
takes->insert( *t, 0 );
|
takes->insert( *t, 0 );
|
||||||
|
|
||||||
|
/* show the take header */
|
||||||
|
t->child(0)->show();
|
||||||
|
|
||||||
t->color( fl_color_average( FL_BLACK, FL_GRAY, 0.25f ) );
|
t->color( fl_color_average( FL_BLACK, FL_GRAY, 0.25f ) );
|
||||||
|
|
||||||
t->labeltype( FL_ENGRAVED_LABEL );
|
t->labeltype( FL_ENGRAVED_LABEL );
|
||||||
|
@ -548,8 +594,6 @@ Track::remove ( Audio_Sequence *t )
|
||||||
if ( ! takes )
|
if ( ! takes )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
timeline->wrlock();
|
|
||||||
|
|
||||||
if ( sequence() == t )
|
if ( sequence() == t )
|
||||||
{
|
{
|
||||||
pack->remove( t );
|
pack->remove( t );
|
||||||
|
@ -565,8 +609,6 @@ Track::remove ( Audio_Sequence *t )
|
||||||
|
|
||||||
/* delete t; */
|
/* delete t; */
|
||||||
|
|
||||||
timeline->unlock();
|
|
||||||
|
|
||||||
adjust_size();
|
adjust_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -587,16 +629,12 @@ Track::remove ( Control_Sequence *t )
|
||||||
if ( ! control )
|
if ( ! control )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
timeline->wrlock();
|
|
||||||
|
|
||||||
engine->lock();
|
engine->lock();
|
||||||
|
|
||||||
control->remove( t );
|
control->remove( t );
|
||||||
|
|
||||||
engine->unlock();
|
engine->unlock();
|
||||||
|
|
||||||
timeline->unlock();
|
|
||||||
|
|
||||||
adjust_size();
|
adjust_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -618,6 +656,9 @@ Track::sequence ( Audio_Sequence * t )
|
||||||
/* insert following the annotation pack */
|
/* insert following the annotation pack */
|
||||||
pack->insert( *t, 1 );
|
pack->insert( *t, 1 );
|
||||||
|
|
||||||
|
/* hide the take header */
|
||||||
|
t->child(0)->hide();
|
||||||
|
|
||||||
t->color( FL_GRAY );
|
t->color( FL_GRAY );
|
||||||
t->labeltype( FL_NO_LABEL );
|
t->labeltype( FL_NO_LABEL );
|
||||||
|
|
||||||
|
@ -735,7 +776,10 @@ Track::menu_cb ( const Fl_Menu_ *m )
|
||||||
}
|
}
|
||||||
else if ( ! strcmp( picked, "/Add Control" ) )
|
else if ( ! strcmp( picked, "/Add Control" ) )
|
||||||
{
|
{
|
||||||
new Control_Sequence( this );
|
/* add audio track */
|
||||||
|
char *name = get_unique_control_name( "Control" );
|
||||||
|
|
||||||
|
new Control_Sequence( this, name );
|
||||||
}
|
}
|
||||||
else if ( ! strcmp( picked, "/Overlay controls" ) )
|
else if ( ! strcmp( picked, "/Overlay controls" ) )
|
||||||
{
|
{
|
||||||
|
@ -850,6 +894,36 @@ Track::menu_cb ( const Fl_Menu_ *m )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** retrun a pointer to the control sequence named /name/, or NULL if no control sequence is named /name/ */
|
||||||
|
Control_Sequence *
|
||||||
|
Track::control_by_name ( const char *name )
|
||||||
|
{
|
||||||
|
for ( int i = control->children(); i-- ; )
|
||||||
|
{
|
||||||
|
Control_Sequence *t = (Control_Sequence*)control->child( i );
|
||||||
|
|
||||||
|
if ( t->name() && name && ! strcmp( name, t->name() ) )
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** return a malloc'd string representing a unique name for a new control sequence */
|
||||||
|
char *
|
||||||
|
Track::get_unique_control_name ( const char *name )
|
||||||
|
{
|
||||||
|
char pat[256];
|
||||||
|
|
||||||
|
strcpy( pat, name );
|
||||||
|
|
||||||
|
for ( int i = 1; control_by_name( pat ); ++i )
|
||||||
|
snprintf( pat, sizeof( pat ), "%s.%d", name, i );
|
||||||
|
|
||||||
|
return strdup( pat );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#include "FL/menu_popup.H"
|
#include "FL/menu_popup.H"
|
||||||
|
|
||||||
/** build the context menu */
|
/** build the context menu */
|
||||||
|
@ -909,61 +983,11 @@ Track::menu ( void ) const
|
||||||
#include "FL/event_name.H"
|
#include "FL/event_name.H"
|
||||||
#include "FL/test_press.H"
|
#include "FL/test_press.H"
|
||||||
|
|
||||||
void
|
|
||||||
Track::internal_draw ( void )
|
|
||||||
{
|
|
||||||
draw_box();
|
|
||||||
|
|
||||||
pack->resize( x() + Track::width(), y(), w() - Track::width(), h() );
|
|
||||||
|
|
||||||
/* we have to do this first because the pack(s) size isn't known until draw() */
|
|
||||||
draw_child( *pack );
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
Track_Header *o = (Track_Header *)child( 0 );
|
|
||||||
|
|
||||||
o->controls_header_group->resize( x(), control->y(), o->controls_header_group->w(), control->h() );
|
|
||||||
o->takes_header_group->resize( x(), takes->y(), o->takes_header_group->w(), takes->h() );
|
|
||||||
|
|
||||||
if ( takes->visible() )
|
|
||||||
o->takes_header_group->show();
|
|
||||||
else
|
|
||||||
o->takes_header_group->hide();
|
|
||||||
|
|
||||||
if ( control->visible() )
|
|
||||||
o->controls_header_group->show();
|
|
||||||
else
|
|
||||||
o->controls_header_group->hide();
|
|
||||||
|
|
||||||
/* override stupid group resize effect. */
|
|
||||||
o->takes_header_group->child(0)->size( 195, 12 );
|
|
||||||
o->controls_header_group->child(0)->size( 195, 12 );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
child(0)->size( Track::width(), h() );
|
|
||||||
|
|
||||||
draw_child( *child(0));
|
|
||||||
|
|
||||||
if ( takes->visible() )
|
|
||||||
for ( int i = 0; i < takes->children(); i++ )
|
|
||||||
draw_outside_label( *takes->child( i ) );
|
|
||||||
|
|
||||||
if ( control->visible() )
|
|
||||||
for ( int i = 0; i < control->children(); i++ )
|
|
||||||
draw_outside_label( *control->child( i ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Track::draw ( void )
|
Track::draw ( void )
|
||||||
{
|
{
|
||||||
int X, Y, W, H;
|
|
||||||
|
|
||||||
fl_push_clip( x(), y(), w(), h() );
|
fl_push_clip( x(), y(), w(), h() );
|
||||||
|
|
||||||
fl_clip_box( x(), y(), w(), h(), X, Y, W, H );
|
|
||||||
|
|
||||||
Fl_Color saved_color = color();
|
Fl_Color saved_color = color();
|
||||||
|
|
||||||
if ( ! Track::colored_tracks )
|
if ( ! Track::colored_tracks )
|
||||||
|
@ -975,12 +999,12 @@ Track::draw ( void )
|
||||||
|
|
||||||
color( FL_RED );
|
color( FL_RED );
|
||||||
|
|
||||||
internal_draw();
|
Fl_Group::draw();
|
||||||
|
|
||||||
color( c );
|
color( c );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
internal_draw();
|
Fl_Group::draw();
|
||||||
|
|
||||||
if ( ! Track::colored_tracks )
|
if ( ! Track::colored_tracks )
|
||||||
color( saved_color );
|
color( saved_color );
|
||||||
|
|
|
@ -85,8 +85,8 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Fl_Color color ( void ) const { return child(0)->color(); }
|
virtual Fl_Color color ( void ) const { return child(0)->color(); }
|
||||||
void color ( Fl_Color c ) { child(0)->color( c ); }
|
virtual void color ( Fl_Color c ) { child(0)->color( c ); }
|
||||||
|
|
||||||
bool operator< ( const Track &rhs ) const
|
bool operator< ( const Track &rhs ) const
|
||||||
{
|
{
|
||||||
|
@ -118,8 +118,6 @@ private:
|
||||||
Track ( );
|
Track ( );
|
||||||
void init ( void );
|
void init ( void );
|
||||||
|
|
||||||
void internal_draw ( void );
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void get ( Log_Entry &e ) const;
|
void get ( Log_Entry &e ) const;
|
||||||
|
@ -130,6 +128,8 @@ protected:
|
||||||
Fl_Sometimes_Pack *control;
|
Fl_Sometimes_Pack *control;
|
||||||
Fl_Blink_Button *connected_indicator;
|
Fl_Blink_Button *connected_indicator;
|
||||||
|
|
||||||
|
Fl_Group *controls_heading;
|
||||||
|
Fl_Group *takes_heading;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -156,6 +156,9 @@ public:
|
||||||
/* for loggable */
|
/* for loggable */
|
||||||
LOG_CREATE_FUNC( Track );
|
LOG_CREATE_FUNC( Track );
|
||||||
|
|
||||||
|
Control_Sequence * control_by_name ( const char *name );
|
||||||
|
char * get_unique_control_name ( const char *name );
|
||||||
|
|
||||||
void add ( Annotation_Sequence *t );
|
void add ( Annotation_Sequence *t );
|
||||||
void remove ( Annotation_Sequence *t );
|
void remove ( Annotation_Sequence *t );
|
||||||
|
|
||||||
|
@ -175,7 +178,7 @@ public:
|
||||||
|
|
||||||
int height ( void ) const
|
int height ( void ) const
|
||||||
{
|
{
|
||||||
static int table[] = { 27, 54, 80, 150, 300 };
|
static int table[] = { 25, 54, 80, 150, 300 };
|
||||||
|
|
||||||
return table[ _size ];
|
return table[ _size ];
|
||||||
}
|
}
|
||||||
|
@ -201,20 +204,9 @@ public:
|
||||||
return overlay_controls_button->value();
|
return overlay_controls_button->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void name ( const char *name )
|
void name ( const char *name );
|
||||||
{
|
const char * name ( void ) const;
|
||||||
if ( _name )
|
|
||||||
free( _name );
|
|
||||||
|
|
||||||
_name = strdup( name );
|
|
||||||
|
|
||||||
if ( name_field )
|
|
||||||
name_field->value( _name );
|
|
||||||
|
|
||||||
update_port_names();
|
|
||||||
}
|
|
||||||
|
|
||||||
const char * name ( void ) const { return _name; }
|
|
||||||
bool mute ( void ) const { return mute_button->value(); }
|
bool mute ( void ) const { return mute_button->value(); }
|
||||||
void mute ( bool b ) { mute_button->value( b ); }
|
void mute ( bool b ) { mute_button->value( b ); }
|
||||||
bool solo ( void ) const { return solo_button->value(); }
|
bool solo ( void ) const { return solo_button->value(); }
|
||||||
|
|
|
@ -5,116 +5,114 @@ code_name {.cxx}
|
||||||
decl {\#include "FL/Fl_Sometimes_Input.H"} {public global
|
decl {\#include "FL/Fl_Sometimes_Input.H"} {public global
|
||||||
}
|
}
|
||||||
|
|
||||||
|
decl {\#include "FL/Fl_Blink_Button.H"} {public global
|
||||||
|
}
|
||||||
|
|
||||||
widget_class Track_Header {open
|
widget_class Track_Header {open
|
||||||
xywh {384 728 200 210} type Double box THIN_UP_BOX resizable visible
|
xywh {635 603 525 60} type Double box NO_BOX resizable visible
|
||||||
} {
|
} {
|
||||||
Fl_Group {} {open
|
Fl_Group box_group {open
|
||||||
xywh {5 3 192 48}
|
private xywh {0 0 200 60} box THIN_UP_BOX color 63
|
||||||
|
code0 {o->resizable(0);}
|
||||||
} {
|
} {
|
||||||
Fl_Input name_input {
|
Fl_Group {} {open
|
||||||
label {input:}
|
xywh {0 0 200 50}
|
||||||
xywh {5 3 192 22} labeltype NO_LABEL align 20 when 8
|
code0 {o->resizable(0);}
|
||||||
class Fl_Sometimes_Input
|
} {
|
||||||
}
|
Fl_Input name_input {
|
||||||
Fl_Button track_inputs_indicator {
|
label {input:}
|
||||||
label in
|
xywh {0 2 200 23} labeltype NO_LABEL align 20 when 8
|
||||||
tooltip {lit if inputs are connected} xywh {5 27 24 16} box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10 labelcolor 53 hide
|
class Fl_Sometimes_Input
|
||||||
}
|
}
|
||||||
Fl_Button track_outputs_indicator {
|
Fl_Button track_inputs_indicator {
|
||||||
label out
|
label in
|
||||||
tooltip {lit if outputs are connected} xywh {31 27 24 16} box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10 labelcolor 53 hide
|
tooltip {lit if inputs are connected} xywh {0 27 29 16} box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10 labelcolor 53 hide
|
||||||
}
|
}
|
||||||
Fl_Button overlay_controls_button {
|
Fl_Button track_outputs_indicator {
|
||||||
label {c-} selected
|
label out
|
||||||
tooltip {Expand controls} xywh {5 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
|
tooltip {lit if outputs are connected} xywh {31 27 24 16} box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10 labelcolor 53 hide
|
||||||
}
|
}
|
||||||
Fl_Button show_all_takes_button {
|
Fl_Button overlay_controls_button {
|
||||||
label {t+} selected
|
label {c-}
|
||||||
tooltip {Show all takes} xywh {32 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
|
tooltip {Expand controls} xywh {5 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
|
||||||
}
|
}
|
||||||
Fl_Button rec_button {
|
Fl_Button show_all_takes_button {
|
||||||
label r
|
label {t+}
|
||||||
tooltip {arm for recording} xywh {118 26 24 24} type Toggle selection_color 88 labelfont 5 labelsize 12
|
tooltip {Show all takes} xywh {32 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
|
||||||
}
|
}
|
||||||
Fl_Button mute_button {
|
Fl_Button rec_button {
|
||||||
label m
|
label r
|
||||||
tooltip mute xywh {145 26 24 24} type Toggle selection_color 63 labelfont 5 labelsize 12
|
tooltip {arm for recording} xywh {118 26 24 24} type Toggle selection_color 88 labelfont 5 labelsize 12
|
||||||
}
|
}
|
||||||
Fl_Button solo_button {
|
Fl_Button mute_button {
|
||||||
label s
|
label m
|
||||||
tooltip solo xywh {172 26 24 24} type Toggle selection_color 91 labelfont 5 labelsize 12
|
tooltip mute xywh {145 26 24 24} type Toggle selection_color 63 labelfont 5 labelsize 12
|
||||||
}
|
}
|
||||||
}
|
Fl_Button solo_button {
|
||||||
Fl_Group controls_header_group {open
|
label s
|
||||||
xywh {5 53 195 64} labelsize 11 align 25
|
tooltip solo xywh {172 26 24 24} type Toggle selection_color 91 labelfont 5 labelsize 12
|
||||||
} {
|
}
|
||||||
Fl_Box {} {
|
|
||||||
label Controls
|
|
||||||
xywh {5 53 195 12} box FLAT_BOX color 47 labelsize 9 align 24
|
|
||||||
code0 {o->color( fl_color_add_alpha( o->color(), 127 ) );}
|
|
||||||
}
|
|
||||||
Fl_Box {} {
|
|
||||||
label spacer
|
|
||||||
xywh {5 63 195 53} labeltype NO_LABEL resizable
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Fl_Group takes_header_group {open
|
|
||||||
xywh {5 115 195 55} labelsize 11 align 25
|
|
||||||
} {
|
|
||||||
Fl_Box {} {
|
|
||||||
label Takes
|
|
||||||
xywh {5 115 195 12} box FLAT_BOX color 47 labelsize 9 align 24
|
|
||||||
code0 {o->color( fl_color_add_alpha( o->color(), 127 ) );}
|
|
||||||
}
|
|
||||||
Fl_Box {} {
|
|
||||||
label spacer
|
|
||||||
xywh {5 126 195 40} labeltype NO_LABEL resizable
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Fl_Box {} {
|
Fl_Box {} {
|
||||||
label spacer
|
label {<Sequence>}
|
||||||
xywh {0 165 200 45} labeltype NO_LABEL resizable
|
xywh {200 0 325 60} resizable
|
||||||
|
code0 {o->labeltype(FL_NO_LABEL);}
|
||||||
|
}
|
||||||
|
Function {draw()} {open return_type {virtual void}
|
||||||
|
} {
|
||||||
|
code {box_group->color( color() );
|
||||||
|
|
||||||
|
Fl_Group::draw();} {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
widget_class Control_Sequence_Header {open
|
widget_class Control_Sequence_Header {open
|
||||||
xywh {390 981 200 55} type Double visible
|
xywh {309 702 200 55} type Double box NO_BOX visible
|
||||||
} {
|
} {
|
||||||
Fl_Input take_name_input {
|
Fl_Input name_input {
|
||||||
label {input:}
|
label {input:} selected
|
||||||
xywh {5 3 192 22} labeltype NO_LABEL align 20 when 8
|
xywh {5 3 192 22} labeltype NO_LABEL align 20 when 8 textsize 12
|
||||||
class Fl_Sometimes_Input
|
class Fl_Sometimes_Input
|
||||||
}
|
}
|
||||||
Fl_Button outputs_indicator {
|
Fl_Button outputs_indicator {
|
||||||
label out
|
label out
|
||||||
tooltip {lit if outputs are connected} xywh {33 26 24 16} box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10
|
tooltip {lit if outputs are connected} xywh {33 26 24 16} box BORDER_BOX down_box BORDER_BOX color 48 selection_color 90 labelfont 5 labelsize 10
|
||||||
|
code0 {o->ignore_input( true );}
|
||||||
|
code1 {o->blink( false );}
|
||||||
|
class Fl_Blink_Button
|
||||||
}
|
}
|
||||||
Fl_Output {} {
|
Fl_Output osc_name_output {
|
||||||
xywh {60 26 92 24} color 32 labeltype NO_LABEL align 20 textsize 9
|
xywh {60 26 92 24} color 32 labeltype NO_LABEL align 20 textsize 9 hide
|
||||||
}
|
}
|
||||||
Fl_Menu_Button {} {open
|
Fl_Menu_Button osc_connect_menu {open
|
||||||
xywh {147 26 24 24} color 52
|
xywh {147 26 24 24} color 52 hide
|
||||||
} {}
|
} {}
|
||||||
Fl_Button delete_control_button {
|
Fl_Button delete_button {
|
||||||
label X
|
label X
|
||||||
tooltip {Expand controls} xywh {172 26 24 24} color 52 labelfont 5 labelsize 12
|
tooltip {Expand controls} xywh {172 26 24 24} labelfont 5 labelsize 12
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
widget_class Take_Header {open
|
widget_class Audio_Sequence_Header {open
|
||||||
xywh {868 986 200 50} type Double visible
|
xywh {326 544 200 50} type Double box NO_BOX resizable visible
|
||||||
} {
|
} {
|
||||||
Fl_Input take_name_input {
|
Fl_Group {} {open
|
||||||
label {input:}
|
xywh {0 0 200 55}
|
||||||
xywh {5 3 193 22} labeltype NO_LABEL align 20 when 8
|
code0 {o->resizable(0);}
|
||||||
class Fl_Sometimes_Input
|
} {
|
||||||
}
|
Fl_Input name_input {
|
||||||
Fl_Button delete_take_button {
|
label {input:} selected
|
||||||
label X
|
xywh {0 3 193 22} labeltype NO_LABEL align 20 when 8 textsize 12
|
||||||
tooltip {Expand controls} xywh {172 26 24 24} color 52 labelfont 5 labelsize 12
|
class Fl_Sometimes_Input
|
||||||
}
|
}
|
||||||
Fl_Button set_active_take_button {
|
Fl_Button delete_button {
|
||||||
label {@2}
|
label X
|
||||||
tooltip {select this take as active sequence} xywh {147 26 24 24} color 52 labelfont 5 labelsize 12
|
tooltip {Expand controls} xywh {167 26 24 24} labelfont 5 labelsize 12
|
||||||
|
}
|
||||||
|
Fl_Button promote_button {
|
||||||
|
label {@2}
|
||||||
|
tooltip {select this take as active sequence} xywh {142 26 24 24} labelfont 5 labelsize 12
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue