Timeline: Redesign track header and add option to overlay control sequences.

Also, assign random color to individual control sequence (which the user may edit).
This commit is contained in:
Jonathan Moore Liles 2012-12-01 16:14:01 -08:00
parent f089d61ee2
commit 753ac2b56a
12 changed files with 489 additions and 173 deletions

View File

@ -62,7 +62,7 @@ public:
DEFAULT=500
};
Fl_Blink_Button ( int X, int Y, int W, int H, const char *L )
Fl_Blink_Button ( int X, int Y, int W, int H, const char *L=0 )
: Fl_Button( X, Y, W, H, L )
{
_blinking = true;

View File

@ -22,6 +22,7 @@
/* Just like an Fl_Input, except that when not being edited it
* displays just like a label. */
#include <FL/fl_draw.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Input.H>

View File

@ -21,6 +21,7 @@
#include "debug.h"
#include <FL/fl_ask.H>
#include <FL/Fl_Color_Chooser.H>
#include "Control_Sequence.H"
#include "Track.H"
@ -121,6 +122,7 @@ Control_Sequence::get ( Log_Entry &e ) const
{
e.add( ":track", _track );
e.add( ":name", name() );
e.add( ":color", color() );
}
void
@ -187,6 +189,10 @@ Control_Sequence::set ( Log_Entry &e )
{
_persistent_osc_connections.push_back( strdup( v ) );
}
else if ( ! strcmp( ":color", s ) )
{
color( (Fl_Color)atol( v ) );
}
}
}
@ -282,17 +288,44 @@ Control_Sequence::draw_curve ( bool filled )
}
}
void
Control_Sequence::draw_box ( void )
{
const int bx = x();
const int by = y();
const int bw = w();
const int bh = h();
int 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_WHITE, 0.90 ) );
if ( draw_with_grid )
{
fl_color( FL_GRAY );
const int inc = bh / 10;
if ( inc )
for ( int gy = 0; gy < bh; gy += inc )
fl_line( X, by + gy, X + W, by + gy );
}
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
Control_Sequence::draw ( void )
{
// draw_box();
fl_push_clip( x(), y(), w(), h() );
/* draw the box with the ends cut off. */
// draw_box( box(), x() - Fl::box_dx( box() ), y(), w() + Fl::box_dw( box() ) + 1, h(), color() );
const int bx = x();
const int by = y() + Fl::box_dy( box() );
const int bw = w();
@ -307,24 +340,14 @@ Control_Sequence::draw ( void )
const Fl_Color color = active ? this->color() : fl_inactive( this->color() );
// const Fl_Color selection_color = active ? this->selection_color() : fl_inactive( this->selection_color() );
fl_rectf( X, Y, W, H, fl_color_average( FL_WHITE, FL_BACKGROUND_COLOR, 0.3 ) );
if ( draw_with_grid )
{
fl_color( FL_GRAY );
const int inc = bh / 10;
if ( inc )
for ( int gy = 0; gy < bh; gy += inc )
fl_line( X, by + gy, X + W, by + gy );
}
if ( box() != FL_NO_BOX )
draw_box();
if ( interpolation() != None )
{
if ( draw_with_polygon )
{
fl_color( fl_color_add_alpha( color, 100 ) );
fl_color( fl_color_add_alpha( color, 60 ) );
fl_begin_complex_polygon();
draw_curve( true );
@ -342,8 +365,6 @@ Control_Sequence::draw ( void )
fl_line_style( FL_SOLID, 0 );
}
timeline->draw_measure_lines( X, Y, W, H );
if ( interpolation() == None || _highlighted || Fl::focus() == this )
for ( list <Sequence_Widget *>::const_iterator r = _widgets.begin(); r != _widgets.end(); r++ )
(*r)->draw_box();
@ -433,6 +454,19 @@ Control_Sequence::menu_cb ( const Fl_Menu_ *m )
{
Fl::delete_widget( this );
}
else if ( ! strcmp( picked, "/Color" ) )
{
unsigned char r, g, b;
Fl::get_color( color(), r, g, b );
if ( fl_color_chooser( "Track Color", r, g, b ) )
{
color( fl_rgb_color( r, g, b ) );
}
redraw();
}
}
void
@ -581,6 +615,7 @@ Control_Sequence::handle ( int m )
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( "Color", 0, 0, 0 );
menu.add( "Remove", 0, 0, 0 );
menu.callback( &Control_Sequence::menu_cb, (void*)this);

View File

@ -87,6 +87,7 @@ protected:
}
void draw_box ( void );
void draw ( void );
int handle ( int m );

View File

@ -202,8 +202,8 @@ Track::process_output ( nframes_t nframes )
}
/* FIXME: should we blank the control output here or leave it floating? */
for ( int i = 0; i < control->children(); i++ )
((Control_Sequence*)control->child( i ))->process( nframes );
for ( int i = 0; i < ((Fl_Pack*)control)->children(); i++ )
((Control_Sequence*)((Fl_Pack*)control)->child( i ))->process( nframes );
if ( playback_ds )
return playback_ds->process( nframes );

View File

@ -91,6 +91,10 @@ public:
if ( _name ) free( _name );
_name = s ? strdup( s ) : NULL;
label( _name );
/* for outside label */
if ( (Fl_Widget*)track() )
((Fl_Widget*)track())->redraw();
}
void sort ( void );

View File

@ -249,7 +249,7 @@ Loggable::progress_callback( &TLE::progress_cb, this );} {}
label {Non DAW : Timeline}
callback {if ( Fl::event_key() != FL_Escape )
timeline->command_quit();} open
xywh {551 117 1025 770} type Double resizable
xywh {559 209 1025 770} type Double resizable
class TLE_Window xclass Non_DAW size_range {900 300 0 0} visible
} {
Fl_Group {} {
@ -718,29 +718,35 @@ ab.run();}
xywh {740 31 115 40}
} {
Fl_Button solo_blinker {
label SOLO
xywh {800 33 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 74 selection_color 92 labelfont 2 labelcolor 39 deactivate
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
code0 {\#include "FL/Fl_Blink_Button.H"}
code1 {o->box( FL_ASYM_BOX );}
code2 {o->down_box( FL_ASYM_BOX );}
class Fl_Blink_Button
}
Fl_Button rec_blinker {
label REC
xywh {800 53 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 72 selection_color 88 labelfont 2 labelcolor 39 deactivate
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
code0 {\#include "FL/Fl_Blink_Button.H"}
code1 {o->box( FL_ASYM_BOX );}
code2 {o->down_box( FL_ASYM_BOX );}
class Fl_Blink_Button
}
Fl_Button selected_blinker {
label SEL
xywh {745 53 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 13 selection_color 5 labelfont 2 labelcolor 39 deactivate
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
code0 {\#include "FL/Fl_Blink_Button.H"}
code1 {o->blink( false );}
code1 {o->box( FL_ASYM_BOX );}
code2 {o->down_box( FL_ASYM_BOX );}
class Fl_Blink_Button
}
Fl_Button seek_blinker {
label SEEK
xywh {745 33 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 10 selection_color 2 labelfont 2 labelcolor 39 deactivate
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
code0 {\#include "FL/Fl_Blink_Button.H"}
code1 {o->blink_interval( Fl_Blink_Button::FAST );}
code1 {o->box( FL_ASYM_BOX );}
code2 {o->down_box( FL_ASYM_BOX );}
class Fl_Blink_Button
}
}
@ -754,7 +760,7 @@ ab.run();}
class Fl_Button
}
}
Fl_Group progress_group {open selected
Fl_Group progress_group {open
xywh {295 352 450 79} hide
} {
Fl_Progress progress {
@ -983,7 +989,7 @@ if ( logo_box->image() )
((Fl_Shared_Image*)logo_box->image())->release();
logo_box->image( NULL );
}} open
private xywh {1232 180 520 775} type Double modal visible
private xywh {1240 261 520 775} type Double modal visible
} {
Fl_Value_Output {} {
label {Sample Rate}

View File

@ -1761,9 +1761,12 @@ Timeline::length ( void ) const
nframes_t l = 0;
for ( int i = tracks->children(); i--; )
l = max( l, ((Track*)tracks->child( i ))->sequence()->length() );
{
Sequence *t = ((Track*)tracks->child( i ))->sequence();
// adjust_panzoomer();
if ( t )
l = max( l, ((Track*)tracks->child( i ))->sequence()->length() );
}
return l;
}
@ -2126,11 +2129,7 @@ Timeline::connect_osc ( void )
{
Track *t = (Track*)tracks->child( i );
for ( int j = t->control->children(); j--; )
{
Control_Sequence *c = (Control_Sequence*)t->control->child( j );
c->connect_osc();
}
t->connect_osc();
}
}
@ -2166,14 +2165,7 @@ Timeline::process_osc ( void )
{
Track *t = (Track*)tracks->child( i );
if ( t->control )
{
for ( int j = t->control->children(); j--; )
{
Control_Sequence *c = (Control_Sequence*)t->control->child( j );
c->process_osc();
}
}
t->process_osc();
}
unlock();

View File

@ -33,19 +33,93 @@
#include <FL/Fl_Color_Chooser.H>
#include <FL/Fl.H>
#include "FL/Fl_Scalepack.H"
#include "FL/Fl_Blink_Button.H"
#include "Engine/Engine.H" // for lock()
#include "Control_Sequence.H"
#include "Annotation_Sequence.H"
#include "Track_Header.H"
#include "const.h"
#include "debug.h"
static Fl_Color
random_color ( void )
{
return fl_rgb_color( rand() % 255, rand() % 255, rand() % 255 );
}
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;
const char *Track::capture_format = "Wav 24";
@ -61,7 +135,7 @@ Track::Track ( const char *L, int channels ) :
if ( L )
name( L );
color( (Fl_Color)rand() );
color( random_color() );
configure_inputs( channels );
configure_outputs( channels );
@ -117,7 +191,6 @@ Track::init ( void )
_sequence = NULL;
_name = NULL;
_selected = false;
_show_all_takes = false;
_size = 1;
record_ds = NULL;
@ -133,75 +206,41 @@ Track::init ( void )
o->box( FL_FLAT_BOX );
{
Fl_Group *o = new Fl_Group( 0, 0, 149, 70 );
o->color( ( Fl_Color ) 53 );
o->box( FL_THIN_UP_BOX );
Track_Header *o = new Track_Header( x(), y(), 200, 80 );
{
Fl_Input *o = name_field = new Fl_Sometimes_Input( 2, 2, 144, 24 );
o->color( FL_BACKGROUND_COLOR );
o->labeltype( FL_NO_LABEL );
o->labelcolor( FL_GRAY0 );
o->textcolor( FL_FOREGROUND_COLOR );
name_field = o->name_input;
record_button = o->rec_button;
mute_button = o->mute_button;
solo_button = o->solo_button;
show_all_takes_button = o->show_all_takes_button;
overlay_controls_button = o->overlay_controls_button;
o->callback( cb_input_field, (void*)this );
}
name_field->callback( cb_button, this );
record_button->callback( cb_button, this );
mute_button->callback( cb_button, this );
solo_button->callback( cb_button, this );
{
Fl_Scalepack *o = controls = new Fl_Scalepack( 6, 28, 135, 40 );
o->spacing( 5 );
o->box( FL_NO_BOX );
o->type( FL_HORIZONTAL );
{
Fl_Button *o = record_button =
new Fl_Button( 6, 28, 26, 24, "rec." );
o->type( 1 );
o->box( FL_UP_BOX );
o->selection_color( FL_RED );
o->color( FL_BACKGROUND_COLOR );
o->labelsize( 11 );
o->callback( cb_button, this );
}
{
Fl_Button *o = mute_button =
new Fl_Button( 35, 28, 26, 24, "mute" );
o->selection_color( fl_color_average( FL_YELLOW, FL_GREEN, 0.50 ) );
o->color( FL_BACKGROUND_COLOR );
o->type( 1 );
o->box( FL_UP_BOX );
o->labelsize( 11 );
o->callback( cb_button, this );
}
{
Fl_Button *o = solo_button =
new Fl_Button( 66, 28, 26, 24, "solo" );
o->selection_color( fl_color_average( FL_YELLOW, FL_RED, 0.50 ) );
o->color( FL_BACKGROUND_COLOR );
o->type( 1 );
o->box( FL_UP_BOX );
o->labelsize( 11 );
o->callback( cb_button, this );
}
o->end();
}
{
Fl_Box *o = new Fl_Box( 0, 72, 149, 38 );
o->box( FL_NO_BOX );
Fl_Group::current()->resizable( o );
}
o->size( Track::width(), h() );
o->end();
}
{
Fl_Pack *o = pack = new Fl_Pack( width(), 0, 1006, 115 );
o->type( Fl_Pack::VERTICAL );
o->labeltype( FL_NO_LABEL );
o->resize( x() + width(), y(), w() - width(), h() );
show_all_takes_button->callback( cb_button, this );
overlay_controls_button->callback( cb_button, this );
resizable( o );
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 */
Fl_Pack *o = pack = new Fl_Pack( x() + width(), y(), w() - width(), h() );
o->type( Fl_Pack::VERTICAL );
o->labeltype( FL_NO_LABEL );
/* o->resize( x() + width(), y(), w() - width(), h() ); */
/* resizable( o ); */
{
Fl_Pack *o = annotation = new Fl_Pack( width(), 0, pack->w(), 1 );
@ -210,8 +249,11 @@ Track::init ( void )
}
{
Fl_Pack *o = control = new Fl_Pack( width(), 0, pack->w(), 1 );
Fl_Sometimes_Pack *o = control = new Fl_Sometimes_Pack( width(), 0, pack->w(), 1 );
o->box( FL_NO_BOX );
o->color( FL_BACKGROUND_COLOR );
o->type( Fl_Pack::VERTICAL );
o->pack( true );
o->end();
}
@ -260,6 +302,8 @@ Track::set ( Log_Entry &e )
}
else if ( ! strcmp( s, ":show-all-takes" ) )
show_all_takes( atoi( v ) );
else if ( ! strcmp( s, ":overlay-controls" ) )
overlay_controls( atoi( v ) );
else if ( ! strcmp( s, ":solo" ) )
solo( atoi( v ) );
else if ( ! strcmp( s, ":mute" ) )
@ -308,7 +352,8 @@ Track::get_unjournaled ( Log_Entry &e ) const
e.add( ":height", size() );
e.add( ":inputs", input.size() );
e.add( ":outputs", output.size() );
e.add( ":show-all-takes", _show_all_takes );
e.add( ":show-all-takes", show_all_takes() );
e.add( ":overlay-controls", overlay_controls() );
e.add( ":armed", armed() );
e.add( ":mute", mute() );
e.add( ":solo", solo() );
@ -332,13 +377,13 @@ Track::log_children ( void ) const
{
log_create();
for ( int i = control->children(); i--; )
for ( int i = 0; i < control->children(); i++ )
((Sequence*)control->child( i ))->log_children();
for ( int i = annotation->children(); i--; )
for ( int i = 0; i < annotation->children(); i++ )
((Sequence*)annotation->child( i ))->log_children();
for ( int i = takes->children(); i--; )
for ( int i = 0; i < takes->children(); i++ )
((Sequence*)takes->child( i ))->log_children();
sequence()->log_children();
@ -355,11 +400,6 @@ Track::solo ( bool b )
solo_button->value( b );
}
void
Track::cb_input_field ( Fl_Widget *, void *v )
{
((Track*)v)->cb_input_field();
}
void
Track::cb_button ( Fl_Widget *w, void *v )
@ -367,36 +407,38 @@ Track::cb_button ( Fl_Widget *w, void *v )
((Track*)v)->cb_button( w );
}
void
Track::cb_input_field ( void )
{
log_start();
name( name_field->value() );
log_end();
}
void
Track::cb_button ( Fl_Widget *w )
{
Logger log(this);
if ( w == record_button )
if ( w == name_field )
{
name( name_field->value() );
}
else if ( w == record_button )
{
}
if ( w == mute_button )
else if ( w == mute_button )
{
}
if ( w == solo_button )
else if ( w == solo_button )
{
if ( solo_button->value() )
++_soloing;
else
--_soloing;
}
else if ( w == show_all_takes_button )
{
show_all_takes( show_all_takes_button->value() );
}
else if ( w == overlay_controls_button )
{
overlay_controls( overlay_controls_button->value() );
}
}
static int pack_visible( Fl_Pack *p )
@ -422,33 +464,56 @@ Track::adjust_size ( void )
for ( int i = control->children(); i--; )
control->child( i )->size( w(), height() );
/* FIXME: hack! */
control->pack( ! overlay_controls() );
int TH = height();
if ( show_all_takes() )
{
takes->show();
TH += height() * takes->children();
}
else
takes->hide();
if ( control->children() )
{
control->show();
if ( overlay_controls() )
TH += height() * (control->children() ? 1 : 0);
else
TH += height() * pack_visible( control );
}
else
control->hide();
if ( annotation->children() )
{
annotation->show();
TH += 24 * pack_visible( annotation );
}
else
annotation->hide();
if ( _show_all_takes )
{
takes->show();
Fl_Group::size( w(), height() * ( 1 + takes->children() + pack_visible( control ) ) );
}
else
if ( ! size() )
{
takes->hide();
Fl_Group::size( w(), height() * ( 1 + pack_visible( control ) ) );
control->hide();
Fl_Group::size( w(), height() );
}
Fl_Group::size( w(), h() + ( ( 24 ) * pack_visible( annotation ) ) );
else
Fl_Group::size( w(), TH );
if ( sequence() )
sequence()->size( w(), height() );
/* if ( controls->y() + controls->h() > y() + h() ) */
/* controls->hide(); */
/* else */
/* controls->show(); */
if ( controls->y() + controls->h() > y() + h() )
controls->hide();
else
controls->show();
/* FIXME: why is this necessary? */
if ( parent() )
@ -550,6 +615,7 @@ Track::sequence ( Audio_Sequence * t )
add( sequence() );
_sequence = t;
/* insert following the annotation pack */
pack->insert( *t, 1 );
t->color( FL_GRAY );
@ -558,6 +624,7 @@ Track::sequence ( Audio_Sequence * t )
adjust_size();
}
void
Track::add ( Control_Sequence *t )
{
@ -567,9 +634,10 @@ Track::add ( Control_Sequence *t )
t->track( this );
control->add( t );
t->color( random_color() );
t->color( color() );
// control->insert( *t, 0 );
control->add( t );
engine->unlock();
@ -669,6 +737,10 @@ Track::menu_cb ( const Fl_Menu_ *m )
{
new Control_Sequence( this );
}
else if ( ! strcmp( picked, "/Overlay controls" ) )
{
overlay_controls( ! m->mvalue()->value() );
}
else if ( ! strcmp( picked, "/Add Annotation" ) )
{
add( new Annotation_Sequence( this ) );
@ -790,7 +862,7 @@ Track::menu ( void ) const
_menu.clear();
_menu.add( "Takes/Show all takes", 0, 0, 0, FL_MENU_TOGGLE | ( _show_all_takes ? FL_MENU_VALUE : 0 ) );
_menu.add( "Takes/Show all takes", 0, 0, 0, FL_MENU_TOGGLE | ( show_all_takes() ? FL_MENU_VALUE : 0 ) );
_menu.add( "Takes/New", 0, 0, 0 );
if ( takes->children() )
@ -813,6 +885,7 @@ Track::menu ( void ) const
_menu.add( "Type/Stereo", 0, 0, 0, FL_MENU_RADIO | ( c == 2 ? FL_MENU_VALUE : 0 ));
_menu.add( "Type/Quad", 0, 0, 0, FL_MENU_RADIO | ( c == 4 ? FL_MENU_VALUE : 0 ) );
_menu.add( "Type/...", 0, 0, 0, FL_MENU_RADIO | ( c == 3 || c > 4 ? FL_MENU_VALUE : 0 ) );
_menu.add( "Overlay controls", 0, 0, 0, FL_MENU_TOGGLE | ( overlay_controls() ? FL_MENU_VALUE : 0 ) );
_menu.add( "Add Control", 0, 0, 0 );
_menu.add( "Add Annotation", 0, 0, 0 );
_menu.add( "Color", 0, 0, 0 );
@ -836,6 +909,48 @@ Track::menu ( void ) const
#include "FL/event_name.H"
#include "FL/test_press.H"
void
Track::internal_draw ( void )
{
draw_box();
/* 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 );
}
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
Track::draw ( void )
{
@ -856,12 +971,12 @@ Track::draw ( void )
color( FL_RED );
Fl_Group::draw();
internal_draw();
color( c );
}
else
Fl_Group::draw();
internal_draw();
if ( ! Track::colored_tracks )
color( saved_color );
@ -927,3 +1042,23 @@ Track::handle ( int m )
return 0;
}
void
Track::connect_osc ( void )
{
for ( int j = control->children(); j--; )
{
Control_Sequence *c = (Control_Sequence*)control->child( j );
c->connect_osc();
}
}
void
Track::process_osc ( void )
{
for ( int j = control->children(); j--; )
{
Control_Sequence *c = (Control_Sequence*)control->child( j );
c->process_osc();
}
}

View File

@ -48,6 +48,8 @@ class Record_DS;
class Audio_Region;
class Audio_File;
class Fl_Scalepack;
class Fl_Sometimes_Pack;
class Fl_Blink_Button;
//class Audio_Sequence;
@ -99,8 +101,6 @@ private:
bool _selected;
bool _show_all_takes;
int _size;
int _row;
@ -118,6 +118,7 @@ private:
Track ( );
void init ( void );
void internal_draw ( void );
protected:
@ -126,6 +127,9 @@ protected:
void set ( Log_Entry &e );
Fl_Scalepack *controls;
Fl_Sometimes_Pack *control;
Fl_Blink_Button *connected_indicator;
public:
@ -135,10 +139,11 @@ public:
Fl_Button *record_button;
Fl_Button *mute_button;
Fl_Button *solo_button;
Fl_Button *show_all_takes_button;
Fl_Button *overlay_controls_button;
Fl_Pack *pack;
Fl_Pack *annotation;
Fl_Pack *control;
Fl_Pack *takes;
@ -163,24 +168,39 @@ public:
int size ( void ) const { return _size; }
int ncontrols ( void ) { return control->children(); }
int ncontrols ( void ) { return ((Fl_Group*)control)->children(); }
void adjust_size ( void );
void size ( int v );
int height ( void ) const
{
static int table[] = { 30, 80, 150, 300 };
static int table[] = { 27, 54, 80, 150, 300 };
return table[ _size ];
}
void show_all_takes ( bool b )
{
_show_all_takes = b;
show_all_takes_button->value( b );
adjust_size();
}
bool show_all_takes ( void ) const
{
return show_all_takes_button->value();
}
void overlay_controls ( bool b )
{
overlay_controls_button->value( b );
adjust_size();
}
bool overlay_controls ( void ) const
{
return overlay_controls_button->value();
}
void name ( const char *name )
{
if ( _name )
@ -208,13 +228,11 @@ public:
int row ( void ) const;
void row ( int );
static void cb_input_field ( Fl_Widget *w, void *v );
void cb_input_field ( void );
static void cb_button ( Fl_Widget *w, void *v );
void cb_button ( Fl_Widget *w );
static int width ( void ) { return 150; }
static int width ( void ) { return 200; }
void sequence ( Audio_Sequence * t );
Audio_Sequence * sequence ( void ) const { return _sequence; }
@ -228,6 +246,9 @@ public:
void draw ( void );
int handle ( int m );
void process_osc ( void );
void connect_osc ( void );
/* Engine */
const Audio_Region *capture_region ( void ) const;
Capture *capture ( void );

View File

@ -0,0 +1,120 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0300
header_name {.h}
code_name {.cxx}
decl {\#include "FL/Fl_Sometimes_Input.H"} {public global
}
widget_class Track_Header {open
xywh {384 728 200 210} type Double box THIN_UP_BOX resizable visible
} {
Fl_Group {} {open
xywh {5 3 192 48}
} {
Fl_Input name_input {
label {input:}
xywh {5 3 192 22} labeltype NO_LABEL align 20 when 8
class Fl_Sometimes_Input
}
Fl_Button track_inputs_indicator {
label in
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
}
Fl_Button track_outputs_indicator {
label out
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 overlay_controls_button {
label {c-} selected
tooltip {Expand controls} xywh {5 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
}
Fl_Button show_all_takes_button {
label {t+} selected
tooltip {Show all takes} xywh {32 26 24 24} type Toggle selection_color 3 labelfont 5 labelsize 12
}
Fl_Button rec_button {
label r
tooltip {arm for recording} xywh {118 26 24 24} type Toggle selection_color 88 labelfont 5 labelsize 12
}
Fl_Button mute_button {
label m
tooltip mute xywh {145 26 24 24} type Toggle selection_color 63 labelfont 5 labelsize 12
}
Fl_Button solo_button {
label s
tooltip solo xywh {172 26 24 24} type Toggle selection_color 91 labelfont 5 labelsize 12
}
}
Fl_Group controls_header_group {open
xywh {5 53 195 64} labelsize 11 align 25
} {
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 {} {
label spacer
xywh {0 165 200 45} labeltype NO_LABEL resizable
}
}
widget_class Control_Sequence_Header {open
xywh {390 981 200 55} type Double visible
} {
Fl_Input take_name_input {
label {input:}
xywh {5 3 192 22} labeltype NO_LABEL align 20 when 8
class Fl_Sometimes_Input
}
Fl_Button outputs_indicator {
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
}
Fl_Output {} {
xywh {60 26 92 24} color 32 labeltype NO_LABEL align 20 textsize 9
}
Fl_Menu_Button {} {open
xywh {147 26 24 24} color 52
} {}
Fl_Button delete_control_button {
label X
tooltip {Expand controls} xywh {172 26 24 24} color 52 labelfont 5 labelsize 12
}
}
widget_class Take_Header {open
xywh {868 986 200 50} type Double visible
} {
Fl_Input take_name_input {
label {input:}
xywh {5 3 193 22} labeltype NO_LABEL align 20 when 8
class Fl_Sometimes_Input
}
Fl_Button delete_take_button {
label X
tooltip {Expand controls} xywh {172 26 24 24} color 52 labelfont 5 labelsize 12
}
Fl_Button set_active_take_button {
label {@2}
tooltip {select this take as active sequence} xywh {147 26 24 24} color 52 labelfont 5 labelsize 12
}
}

View File

@ -78,6 +78,7 @@ src/Sequence_Point.C
src/Sequence_Region.C
src/Sequence_Widget.C
src/TLE.fl
src/Track_Header.fl
src/Tempo_Point.C
src/Tempo_Sequence.C
src/Time_Point.C