Also, fix bug in soloing when a solo'd track was removed.tags/non-daw-v1.1.0
| @@ -0,0 +1,69 @@ | |||||
| /*******************************************************************************/ | |||||
| /* Copyright (C) 2008 Jonathan Moore Liles */ | |||||
| /* */ | |||||
| /* This program is free software; you can redistribute it and/or modify it */ | |||||
| /* under the terms of the GNU General Public License as published by the */ | |||||
| /* Free Software Foundation; either version 2 of the License, or (at your */ | |||||
| /* option) any later version. */ | |||||
| /* */ | |||||
| /* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||||
| /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||||
| /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||||
| /* more details. */ | |||||
| /* */ | |||||
| /* You should have received a copy of the GNU General Public License along */ | |||||
| /* with This program; see the file COPYING. If not,write to the Free Software */ | |||||
| /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||||
| /*******************************************************************************/ | |||||
| #include <FL/Fl_Button.H> | |||||
| #include <FL/Fl.H> | |||||
| const float BLINK_FREQ = 0.5f; | |||||
| class Fl_Blinker : public Fl_Button | |||||
| { | |||||
| bool _on; | |||||
| static void | |||||
| update_cb ( void *v ) | |||||
| { | |||||
| ((Fl_Blinker*)v)->update_cb(); | |||||
| } | |||||
| void | |||||
| update_cb ( void ) | |||||
| { | |||||
| Fl::repeat_timeout( BLINK_FREQ, update_cb, this ); | |||||
| _on = ! _on; | |||||
| redraw(); | |||||
| } | |||||
| public: | |||||
| Fl_Blinker ( int X, int Y, int W, int H, const char *L ) | |||||
| : Fl_Button( X, Y, W, H, L ) | |||||
| { | |||||
| _on = false; | |||||
| Fl::add_timeout( BLINK_FREQ, update_cb, this ); | |||||
| type( FL_TOGGLE_BUTTON ); | |||||
| } | |||||
| virtual | |||||
| ~Fl_Blinker () | |||||
| { | |||||
| Fl::remove_timeout( update_cb, this ); | |||||
| } | |||||
| virtual void | |||||
| draw ( void ) | |||||
| { | |||||
| draw_box( value() ? box() : down_box(), x(), y(), w(), h(), ( value() != 0 && _on ) ? selection_color() : color() ); | |||||
| draw_label(); | |||||
| } | |||||
| }; | |||||
| @@ -115,7 +115,7 @@ public: | |||||
| ~Clock ( ) | ~Clock ( ) | ||||
| { | { | ||||
| Fl::remove_timeout( update_cb ); | |||||
| Fl::remove_timeout( update_cb, this ); | |||||
| } | } | ||||
| void run ( nframes_t *v ) | void run ( nframes_t *v ) | ||||
| @@ -198,7 +198,7 @@ Loggable::progress_callback( &TLE::progress_cb, this );} {} | |||||
| } { | } { | ||||
| Fl_Window main_window { | Fl_Window main_window { | ||||
| label Timeline open | label Timeline open | ||||
| private xywh {254 117 1025 770} type Double resizable xclass Non_DAW visible | |||||
| private xywh {133 113 1025 770} type Double resizable xclass Non_DAW visible | |||||
| } { | } { | ||||
| Fl_Menu_Bar menubar {open | Fl_Menu_Bar menubar {open | ||||
| private xywh {0 0 1024 25} | private xywh {0 0 1024 25} | ||||
| @@ -605,7 +605,7 @@ ab.run();} | |||||
| } | } | ||||
| Fl_Box {} { | Fl_Box {} { | ||||
| label {<empty>} | label {<empty>} | ||||
| xywh {487 27 378 42} resizable | |||||
| xywh {487 27 308 42} resizable | |||||
| code0 {o->labeltype( FL_NO_LABEL );} | code0 {o->labeltype( FL_NO_LABEL );} | ||||
| } | } | ||||
| Fl_Group {} {open | Fl_Group {} {open | ||||
| @@ -636,6 +636,18 @@ ab.run();} | |||||
| private xywh {921 41 104 14} labelsize 10 | private xywh {921 41 104 14} labelsize 10 | ||||
| } | } | ||||
| } | } | ||||
| Fl_Button solo_blinker { | |||||
| label SOLO | |||||
| xywh {810 30 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 74 selection_color 92 labelfont 2 labelcolor 39 deactivate | |||||
| code0 {\#include "FL/Fl_Blinker.H"} | |||||
| class Fl_Blinker | |||||
| } | |||||
| Fl_Button rec_blinker { | |||||
| label REC | |||||
| xywh {810 50 50 15} box ROUNDED_BOX down_box ROUNDED_BOX color 72 selection_color 88 labelfont 2 labelcolor 39 deactivate | |||||
| code0 {\#include "FL/Fl_Blinker.H"} | |||||
| class Fl_Blinker | |||||
| } | |||||
| } | } | ||||
| Fl_Progress progress { | Fl_Progress progress { | ||||
| label {0%} | label {0%} | ||||
| @@ -708,7 +720,7 @@ snprintf( s, 5, "%d%%", (int)v ); | |||||
| p->label( s );} {} | p->label( s );} {} | ||||
| } | } | ||||
| Function {update_status()} {private | |||||
| Function {update_status()} {open private | |||||
| } { | } { | ||||
| code {static char cbp[5], pbp[5], clp[5]; | code {static char cbp[5], pbp[5], clp[5]; | ||||
| @@ -733,9 +745,13 @@ if ( engine->zombified() && ! zombie ) | |||||
| { | { | ||||
| zombie = true; | zombie = true; | ||||
| fl_alert( "Disconnected from JACK!" ); | fl_alert( "Disconnected from JACK!" ); | ||||
| }} {} | |||||
| } | |||||
| solo_blinker->value( Track::soloing() ); | |||||
| rec_blinker->value( transport->rolling && transport->rec_enabled() );} {selected | |||||
| } | |||||
| } | } | ||||
| Function {update_cb( void *v )} {private return_type {static void} | |||||
| Function {update_cb( void *v )} {open private return_type {static void} | |||||
| } { | } { | ||||
| code {Fl::repeat_timeout( STATUS_UPDATE_FREQ, update_cb, v ); | code {Fl::repeat_timeout( STATUS_UPDATE_FREQ, update_cb, v ); | ||||
| @@ -782,8 +798,7 @@ Fl::check();} {} | |||||
| snprintf( pat, 256, "file://%s%s.html", DOCUMENT_PATH, file ); | snprintf( pat, 256, "file://%s%s.html", DOCUMENT_PATH, file ); | ||||
| open_url( pat );} {selected | |||||
| } | |||||
| open_url( pat );} {} | |||||
| } | } | ||||
| } | } | ||||
| @@ -69,6 +69,17 @@ Track::Track ( ) : Fl_Group( 0, 0, 1, 1 ) | |||||
| timeline->add_track( this ); | timeline->add_track( this ); | ||||
| } | } | ||||
| void | |||||
| Track::solo ( bool b ) | |||||
| { | |||||
| if ( b && ! solo_button->value() ) | |||||
| ++_soloing; | |||||
| else if ( ! b && solo_button->value() ) | |||||
| --_soloing; | |||||
| solo_button->value( b ); | |||||
| } | |||||
| Track::~Track ( ) | Track::~Track ( ) | ||||
| { | { | ||||
| Loggable::block_start(); | Loggable::block_start(); | ||||
| @@ -89,6 +100,8 @@ Track::~Track ( ) | |||||
| _sequence = NULL; | _sequence = NULL; | ||||
| solo( false ); | |||||
| if ( _name ) | if ( _name ) | ||||
| free( _name ); | free( _name ); | ||||
| @@ -179,6 +179,8 @@ public: | |||||
| bool armed ( void ) const { return record_button->value(); } | bool armed ( void ) const { return record_button->value(); } | ||||
| bool selected ( void ) const { return _selected; } | bool selected ( void ) const { return _selected; } | ||||
| void solo ( bool b ); | |||||
| static void cb_input_field ( Fl_Widget *w, void *v ); | static void cb_input_field ( Fl_Widget *w, void *v ); | ||||
| void cb_input_field ( void ); | void cb_input_field ( void ); | ||||
| static void cb_button ( Fl_Widget *w, void *v ); | static void cb_button ( Fl_Widget *w, void *v ); | ||||
| @@ -106,6 +106,12 @@ Transport::cb_button ( Fl_Widget *w ) | |||||
| } | } | ||||
| } | } | ||||
| bool | |||||
| Transport::rec_enabled ( void ) const | |||||
| { | |||||
| return _record_button->value(); | |||||
| } | |||||
| void | void | ||||
| Transport::toggle_record ( void ) | Transport::toggle_record ( void ) | ||||
| { | { | ||||
| @@ -51,6 +51,7 @@ public: | |||||
| Transport ( int X, int Y, int W, int H, const char *L=0 ); | Transport ( int X, int Y, int W, int H, const char *L=0 ); | ||||
| bool rec_enabled ( void ) const; | |||||
| void toggle_record ( void ); | void toggle_record ( void ); | ||||
| int handle ( int m ); | int handle ( int m ); | ||||