From 753ac2b56a1f569f64c5038d95842297a08a4def Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sat, 1 Dec 2012 16:14:01 -0800 Subject: [PATCH] Timeline: Redesign track header and add option to overlay control sequences. Also, assign random color to individual control sequence (which the user may edit). --- FL/Fl_Blink_Button.H | 2 +- FL/Fl_Sometimes_Input.H | 1 + timeline/src/Control_Sequence.C | 77 +++++-- timeline/src/Control_Sequence.H | 1 + timeline/src/Engine/Track.C | 4 +- timeline/src/Sequence.H | 4 + timeline/src/TLE.fl | 32 +-- timeline/src/Timeline.C | 26 +-- timeline/src/Track.C | 355 ++++++++++++++++++++++---------- timeline/src/Track.H | 39 +++- timeline/src/Track_Header.fl | 120 +++++++++++ timeline/wscript | 1 + 12 files changed, 489 insertions(+), 173 deletions(-) create mode 100644 timeline/src/Track_Header.fl diff --git a/FL/Fl_Blink_Button.H b/FL/Fl_Blink_Button.H index d7e3418..6d0fcaa 100644 --- a/FL/Fl_Blink_Button.H +++ b/FL/Fl_Blink_Button.H @@ -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; diff --git a/FL/Fl_Sometimes_Input.H b/FL/Fl_Sometimes_Input.H index 9dd5faa..6e26c01 100644 --- a/FL/Fl_Sometimes_Input.H +++ b/FL/Fl_Sometimes_Input.H @@ -22,6 +22,7 @@ /* Just like an Fl_Input, except that when not being edited it * displays just like a label. */ +#include #include #include #include diff --git a/timeline/src/Control_Sequence.C b/timeline/src/Control_Sequence.C index 1cd281d..1f27564 100644 --- a/timeline/src/Control_Sequence.C +++ b/timeline/src/Control_Sequence.C @@ -21,6 +21,7 @@ #include "debug.h" #include +#include #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 ::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); diff --git a/timeline/src/Control_Sequence.H b/timeline/src/Control_Sequence.H index 6a84689..8fee564 100644 --- a/timeline/src/Control_Sequence.H +++ b/timeline/src/Control_Sequence.H @@ -87,6 +87,7 @@ protected: } + void draw_box ( void ); void draw ( void ); int handle ( int m ); diff --git a/timeline/src/Engine/Track.C b/timeline/src/Engine/Track.C index 1c9c288..e4a7989 100644 --- a/timeline/src/Engine/Track.C +++ b/timeline/src/Engine/Track.C @@ -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 ); diff --git a/timeline/src/Sequence.H b/timeline/src/Sequence.H index efddd92..10b7d66 100644 --- a/timeline/src/Sequence.H +++ b/timeline/src/Sequence.H @@ -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 ); diff --git a/timeline/src/TLE.fl b/timeline/src/TLE.fl index 043fa0f..b379597 100644 --- a/timeline/src/TLE.fl +++ b/timeline/src/TLE.fl @@ -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} diff --git a/timeline/src/Timeline.C b/timeline/src/Timeline.C index 29ea3cf..4e62eb5 100644 --- a/timeline/src/Timeline.C +++ b/timeline/src/Timeline.C @@ -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() ); - -// adjust_panzoomer(); + { + Sequence *t = ((Track*)tracks->child( i ))->sequence(); + + if ( t ) + l = max( l, ((Track*)tracks->child( i ))->sequence()->length() ); + } return l; } @@ -2125,12 +2128,8 @@ Timeline::connect_osc ( void ) for ( int i = tracks->children(); i-- ; ) { 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(); diff --git a/timeline/src/Track.C b/timeline/src/Track.C index fc77504..fb56a54 100644 --- a/timeline/src/Track.C +++ b/timeline/src/Track.C @@ -33,19 +33,93 @@ #include #include #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; + + name_field->callback( cb_button, this ); + record_button->callback( cb_button, this ); + mute_button->callback( cb_button, this ); + solo_button->callback( cb_button, this ); - o->callback( cb_input_field, (void*)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,10 +634,11 @@ Track::add ( Control_Sequence *t ) t->track( this ); + t->color( random_color() ); + +// control->insert( *t, 0 ); control->add( t ); - t->color( color() ); - engine->unlock(); adjust_size(); @@ -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(); + } +} diff --git a/timeline/src/Track.H b/timeline/src/Track.H index 7027b50..a8394af 100644 --- a/timeline/src/Track.H +++ b/timeline/src/Track.H @@ -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 ); diff --git a/timeline/src/Track_Header.fl b/timeline/src/Track_Header.fl new file mode 100644 index 0000000..86ac2f7 --- /dev/null +++ b/timeline/src/Track_Header.fl @@ -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 + } +} diff --git a/timeline/wscript b/timeline/wscript index 49a893f..64f28d5 100644 --- a/timeline/wscript +++ b/timeline/wscript @@ -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