Timeline/Track: Make 'takes' menu a submenu of the Track context menu.
Also, change the appearance of rec/mute/solo buttons.
This commit is contained in:
parent
781ec66510
commit
f089d61ee2
|
@ -32,6 +32,7 @@
|
||||||
#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>
|
||||||
|
#include "FL/Fl_Scalepack.H"
|
||||||
|
|
||||||
#include "Engine/Engine.H" // for lock()
|
#include "Engine/Engine.H" // for lock()
|
||||||
|
|
||||||
|
@ -43,6 +44,8 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static Fl_Menu_Button _menu( 0, 0, 0, 0, "Track" );
|
||||||
|
|
||||||
int Track::_soloing = 0;
|
int Track::_soloing = 0;
|
||||||
|
|
||||||
const char *Track::capture_format = "Wav 24";
|
const char *Track::capture_format = "Wav 24";
|
||||||
|
@ -145,51 +148,40 @@ Track::init ( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Fl_Group *o = controls = new Fl_Group( 2, 28, 149, 24 );
|
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 =
|
Fl_Button *o = record_button =
|
||||||
new Fl_Button( 6, 28, 26, 24, "@circle" );
|
new Fl_Button( 6, 28, 26, 24, "rec." );
|
||||||
o->type( 1 );
|
o->type( 1 );
|
||||||
o->box( FL_ASYM_BOX );
|
o->box( FL_UP_BOX );
|
||||||
o->down_box( FL_ASYM_BOX );
|
|
||||||
o->selection_color( FL_RED );
|
o->selection_color( FL_RED );
|
||||||
o->color( fl_color_average( FL_GRAY, o->selection_color(), 0.80 ) );
|
o->color( FL_BACKGROUND_COLOR );
|
||||||
o->labelsize( 9 );
|
o->labelsize( 11 );
|
||||||
o->callback( cb_button, this );
|
o->callback( cb_button, this );
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Fl_Button *o = mute_button =
|
Fl_Button *o = mute_button =
|
||||||
new Fl_Button( 35, 28, 26, 24, "m" );
|
new Fl_Button( 35, 28, 26, 24, "mute" );
|
||||||
o->selection_color( fl_color_average( FL_YELLOW, FL_GREEN, 0.50 ) );
|
o->selection_color( fl_color_average( FL_YELLOW, FL_GREEN, 0.50 ) );
|
||||||
o->color( fl_color_average( FL_GRAY, o->selection_color(), 0.80 ) );
|
o->color( FL_BACKGROUND_COLOR );
|
||||||
o->type( 1 );
|
o->type( 1 );
|
||||||
o->box( FL_ASYM_BOX );
|
o->box( FL_UP_BOX );
|
||||||
o->down_box( FL_ASYM_BOX );
|
o->labelsize( 11 );
|
||||||
o->labelsize( 15 );
|
|
||||||
o->callback( cb_button, this );
|
o->callback( cb_button, this );
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Fl_Button *o = solo_button =
|
Fl_Button *o = solo_button =
|
||||||
new Fl_Button( 66, 28, 26, 24, "s" );
|
new Fl_Button( 66, 28, 26, 24, "solo" );
|
||||||
o->selection_color( fl_color_average( FL_YELLOW, FL_RED, 0.50 ) );
|
o->selection_color( fl_color_average( FL_YELLOW, FL_RED, 0.50 ) );
|
||||||
o->color( fl_color_average( FL_GRAY, o->selection_color(), 0.80 ) );
|
o->color( FL_BACKGROUND_COLOR );
|
||||||
o->type( 1 );
|
o->type( 1 );
|
||||||
o->box( FL_ASYM_BOX );
|
|
||||||
o->down_box( FL_ASYM_BOX );
|
|
||||||
o->labelsize( 15 );
|
|
||||||
o->callback( cb_button, this );
|
|
||||||
}
|
|
||||||
{
|
|
||||||
Fl_Menu_Button *o = take_menu =
|
|
||||||
new Fl_Menu_Button( 97, 28, 47, 24, "T" );
|
|
||||||
o->box( FL_UP_BOX );
|
o->box( FL_UP_BOX );
|
||||||
o->color( FL_LIGHT1 );
|
o->labelsize( 11 );
|
||||||
o->align( FL_ALIGN_LEFT | FL_ALIGN_INSIDE );
|
|
||||||
o->callback( cb_button, this );
|
o->callback( cb_button, this );
|
||||||
|
|
||||||
o->add( "Show all takes", 0, 0, 0, FL_MENU_TOGGLE );
|
|
||||||
o->add( "New", 0, 0, 0, FL_MENU_DIVIDER );
|
|
||||||
}
|
}
|
||||||
o->end();
|
o->end();
|
||||||
}
|
}
|
||||||
|
@ -404,48 +396,7 @@ Track::cb_button ( Fl_Widget *w )
|
||||||
else
|
else
|
||||||
--_soloing;
|
--_soloing;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if ( w == take_menu )
|
|
||||||
{
|
|
||||||
int v = take_menu->value();
|
|
||||||
|
|
||||||
switch ( v )
|
|
||||||
{
|
|
||||||
case 0: /* show all takes */
|
|
||||||
show_all_takes( take_menu->menu()[ v ].value() );
|
|
||||||
break;
|
|
||||||
case 1: /* new */
|
|
||||||
sequence( (Audio_Sequence*)sequence()->clone_empty() );
|
|
||||||
break;
|
|
||||||
case 2: /* remove */
|
|
||||||
if ( takes->children() )
|
|
||||||
{
|
|
||||||
Loggable::block_start();
|
|
||||||
|
|
||||||
Audio_Sequence *s = sequence();
|
|
||||||
|
|
||||||
sequence( (Audio_Sequence*)takes->child( 0 ) );
|
|
||||||
|
|
||||||
delete s;
|
|
||||||
|
|
||||||
Loggable::block_end();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if ( takes->children() )
|
|
||||||
{
|
|
||||||
Loggable::block_start();
|
|
||||||
|
|
||||||
takes->clear();
|
|
||||||
|
|
||||||
Loggable::block_end();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sequence( (Audio_Sequence*)take_menu->menu()[ v ].user_data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pack_visible( Fl_Pack *p )
|
static int pack_visible( Fl_Pack *p )
|
||||||
|
@ -515,27 +466,6 @@ Track::size ( int v )
|
||||||
adjust_size();
|
adjust_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Track::update_take_menu ( void )
|
|
||||||
{
|
|
||||||
take_menu->clear();
|
|
||||||
|
|
||||||
take_menu->add( "Show all takes", 0, 0, 0, FL_MENU_TOGGLE | ( _show_all_takes ? FL_MENU_VALUE : 0 ) );
|
|
||||||
take_menu->add( "New", 0, 0, 0 );
|
|
||||||
|
|
||||||
if ( takes->children() )
|
|
||||||
{
|
|
||||||
take_menu->add( "Remove", 0, 0, 0 );
|
|
||||||
take_menu->add( "Remove others", 0, 0, 0, FL_MENU_DIVIDER );
|
|
||||||
|
|
||||||
for ( int i = 0; i < takes->children(); ++i )
|
|
||||||
{
|
|
||||||
Sequence *s = (Sequence *)takes->child( i );
|
|
||||||
|
|
||||||
take_menu->add( s->name(), 0, 0, s );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Track::add ( Audio_Sequence * t )
|
Track::add ( Audio_Sequence * t )
|
||||||
|
@ -545,8 +475,6 @@ Track::add ( Audio_Sequence * t )
|
||||||
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 );
|
||||||
|
|
||||||
update_take_menu();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -575,8 +503,6 @@ Track::remove ( Audio_Sequence *t )
|
||||||
timeline->unlock();
|
timeline->unlock();
|
||||||
|
|
||||||
adjust_size();
|
adjust_size();
|
||||||
|
|
||||||
update_take_menu();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -612,6 +538,12 @@ Track::remove ( Control_Sequence *t )
|
||||||
void
|
void
|
||||||
Track::sequence ( Audio_Sequence * t )
|
Track::sequence ( Audio_Sequence * t )
|
||||||
{
|
{
|
||||||
|
if ( sequence() == t )
|
||||||
|
{
|
||||||
|
DMESSAGE( "Attempt to set sequence twice" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
t->track( this );
|
t->track( this );
|
||||||
|
|
||||||
if ( sequence() )
|
if ( sequence() )
|
||||||
|
@ -623,8 +555,6 @@ Track::sequence ( Audio_Sequence * t )
|
||||||
t->color( FL_GRAY );
|
t->color( FL_GRAY );
|
||||||
t->labeltype( FL_NO_LABEL );
|
t->labeltype( FL_NO_LABEL );
|
||||||
|
|
||||||
update_take_menu();
|
|
||||||
|
|
||||||
adjust_size();
|
adjust_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -699,6 +629,8 @@ Track::menu_cb ( const Fl_Menu_ *m )
|
||||||
|
|
||||||
m->item_pathname( picked, sizeof( picked ) );
|
m->item_pathname( picked, sizeof( picked ) );
|
||||||
|
|
||||||
|
DMESSAGE( "Picked: %s", picked );
|
||||||
|
|
||||||
Logger log( this );
|
Logger log( this );
|
||||||
|
|
||||||
if ( ! strcmp( picked, "Type/Mono" ) )
|
if ( ! strcmp( picked, "Type/Mono" ) )
|
||||||
|
@ -804,6 +736,46 @@ Track::menu_cb ( const Fl_Menu_ *m )
|
||||||
{
|
{
|
||||||
timeline->move_track_down( this );
|
timeline->move_track_down( this );
|
||||||
}
|
}
|
||||||
|
else if ( !strcmp( picked, "Takes/Show all takes" ) )
|
||||||
|
{
|
||||||
|
show_all_takes( ! m->mvalue()->value() );
|
||||||
|
}
|
||||||
|
else if ( !strcmp( picked, "Takes/New" ) )
|
||||||
|
{
|
||||||
|
sequence( (Audio_Sequence*)sequence()->clone_empty() );
|
||||||
|
}
|
||||||
|
else if ( !strcmp( picked, "Takes/Remove" ) )
|
||||||
|
{
|
||||||
|
if ( takes->children() )
|
||||||
|
{
|
||||||
|
Loggable::block_start();
|
||||||
|
|
||||||
|
Audio_Sequence *s = sequence();
|
||||||
|
|
||||||
|
sequence( (Audio_Sequence*)takes->child( 0 ) );
|
||||||
|
|
||||||
|
delete s;
|
||||||
|
|
||||||
|
Loggable::block_end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !strcmp( picked, "Takes/Remove others" ))
|
||||||
|
{
|
||||||
|
if ( takes->children() )
|
||||||
|
{
|
||||||
|
Loggable::block_start();
|
||||||
|
|
||||||
|
takes->clear();
|
||||||
|
|
||||||
|
Loggable::block_end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !strncmp( picked, "Takes/", sizeof( "Takes/" ) - 1 ) )
|
||||||
|
{
|
||||||
|
Audio_Sequence* s = (Audio_Sequence*)m->mvalue()->user_data();
|
||||||
|
|
||||||
|
sequence( s );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "FL/menu_popup.H"
|
#include "FL/menu_popup.H"
|
||||||
|
@ -812,45 +784,53 @@ Track::menu_cb ( const Fl_Menu_ *m )
|
||||||
Fl_Menu_Button &
|
Fl_Menu_Button &
|
||||||
Track::menu ( void ) const
|
Track::menu ( void ) const
|
||||||
{
|
{
|
||||||
static Fl_Menu_Button m( 0, 0, 0, 0, "Track" );
|
|
||||||
|
|
||||||
int c = output.size();
|
int c = output.size();
|
||||||
int s = size();
|
int s = size();
|
||||||
|
|
||||||
Fl_Menu_Item menu[] =
|
_menu.clear();
|
||||||
|
|
||||||
|
_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() )
|
||||||
|
{
|
||||||
|
_menu.add( "Takes/Remove", 0, 0, 0 );
|
||||||
|
_menu.add( "Takes/Remove others", 0, 0, 0, FL_MENU_DIVIDER );
|
||||||
|
|
||||||
|
for ( int i = 0; i < takes->children(); ++i )
|
||||||
{
|
{
|
||||||
{ "Type", 0, 0, 0, FL_SUBMENU },
|
Sequence *s = (Sequence *)takes->child( i );
|
||||||
{ "Mono", 0, 0, 0, FL_MENU_RADIO | ( c == 1 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Stereo", 0, 0, 0, FL_MENU_RADIO | ( c == 2 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Quad", 0, 0, 0, FL_MENU_RADIO | ( c == 4 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "...", 0, 0, 0, FL_MENU_RADIO | ( c == 3 || c > 4 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ 0 },
|
|
||||||
{ "Add Control", 0, 0, 0 },
|
|
||||||
{ "Add Annotation", 0, 0, 0 },
|
|
||||||
{ "Color", 0, 0, 0 },
|
|
||||||
{ "Rename", FL_CTRL + 'n', 0, 0 },
|
|
||||||
{ "Size", 0, 0, 0, FL_SUBMENU },
|
|
||||||
{ "Small", FL_ALT + '1', 0, 0, FL_MENU_RADIO | ( s == 0 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Medium", FL_ALT + '2', 0, 0, FL_MENU_RADIO | ( s == 1 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Large", FL_ALT + '3', 0, 0, FL_MENU_RADIO | ( s == 2 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Huge", FL_ALT + '4', 0, 0, FL_MENU_RADIO | ( s == 3 ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ 0 },
|
|
||||||
{ "Flags", 0, 0, 0, FL_SUBMENU },
|
|
||||||
{ "Record", FL_CTRL + 'r', 0, 0, FL_MENU_TOGGLE | ( armed() ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Mute", FL_CTRL + 'm', 0, 0, FL_MENU_TOGGLE | ( mute() ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ "Solo", FL_CTRL + 's', 0, 0, FL_MENU_TOGGLE | ( solo() ? FL_MENU_VALUE : 0 ) },
|
|
||||||
{ 0 },
|
|
||||||
{ "Move Up", FL_SHIFT + '1', 0, 0 },
|
|
||||||
{ "Move Down", FL_SHIFT + '2', 0, 0 },
|
|
||||||
{ "Remove", 0, 0, 0 }, // transport->rolling ? FL_MENU_INACTIVE : 0 },
|
|
||||||
{ 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
menu_set_callback( menu, &Track::menu_cb, (void*)this );
|
char n[256];
|
||||||
|
snprintf( n, sizeof(n), "Takes/%s", s->name() );
|
||||||
|
|
||||||
m.copy( menu, (void*)this );
|
_menu.add( n, 0, 0, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return m;
|
_menu.add( "Type/Mono", 0, 0, 0, FL_MENU_RADIO | ( c == 1 ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_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( "Add Control", 0, 0, 0 );
|
||||||
|
_menu.add( "Add Annotation", 0, 0, 0 );
|
||||||
|
_menu.add( "Color", 0, 0, 0 );
|
||||||
|
_menu.add( "Rename", FL_CTRL + 'n', 0, 0 );
|
||||||
|
_menu.add( "Size/Small", FL_ALT + '1', 0, 0, FL_MENU_RADIO | ( s == 0 ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Size/Medium", FL_ALT + '2', 0, 0, FL_MENU_RADIO | ( s == 1 ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Size/Large", FL_ALT + '3', 0, 0, FL_MENU_RADIO | ( s == 2 ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Size/Huge", FL_ALT + '4', 0, 0, FL_MENU_RADIO | ( s == 3 ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Flags/Record", FL_CTRL + 'r', 0, 0, FL_MENU_TOGGLE | ( armed() ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Flags/Mute", FL_CTRL + 'm', 0, 0, FL_MENU_TOGGLE | ( mute() ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Flags/Solo", FL_CTRL + 's', 0, 0, FL_MENU_TOGGLE | ( solo() ? FL_MENU_VALUE : 0 ) );
|
||||||
|
_menu.add( "Move Up", FL_SHIFT + '1', 0, 0 );
|
||||||
|
_menu.add( "Move Down", FL_SHIFT + '2', 0, 0 );
|
||||||
|
_menu.add( "Remove", 0, 0, 0 ); // transport->rolling ? FL_MENU_INACTIVE : 0 );
|
||||||
|
|
||||||
|
_menu.callback( &Track::menu_cb, (void*)this );
|
||||||
|
|
||||||
|
return _menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "FL/event_name.H"
|
#include "FL/event_name.H"
|
||||||
|
|
|
@ -47,6 +47,7 @@ class Record_DS;
|
||||||
// class JACK::Port;
|
// class JACK::Port;
|
||||||
class Audio_Region;
|
class Audio_Region;
|
||||||
class Audio_File;
|
class Audio_File;
|
||||||
|
class Fl_Scalepack;
|
||||||
|
|
||||||
//class Audio_Sequence;
|
//class Audio_Sequence;
|
||||||
|
|
||||||
|
@ -113,7 +114,6 @@ private:
|
||||||
|
|
||||||
void update_port_names ( void );
|
void update_port_names ( void );
|
||||||
const char *name_for_port( JACK::Port::type_e type, int n );
|
const char *name_for_port( JACK::Port::type_e type, int n );
|
||||||
void update_take_menu ( void );
|
|
||||||
|
|
||||||
Track ( );
|
Track ( );
|
||||||
void init ( void );
|
void init ( void );
|
||||||
|
@ -125,6 +125,8 @@ protected:
|
||||||
void get_unjournaled ( Log_Entry &e ) const;
|
void get_unjournaled ( Log_Entry &e ) const;
|
||||||
void set ( Log_Entry &e );
|
void set ( Log_Entry &e );
|
||||||
|
|
||||||
|
Fl_Scalepack *controls;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual void log_children ( void ) const;
|
virtual void log_children ( void ) const;
|
||||||
|
@ -133,8 +135,6 @@ public:
|
||||||
Fl_Button *record_button;
|
Fl_Button *record_button;
|
||||||
Fl_Button *mute_button;
|
Fl_Button *mute_button;
|
||||||
Fl_Button *solo_button;
|
Fl_Button *solo_button;
|
||||||
Fl_Menu_Button *take_menu;
|
|
||||||
Fl_Group *controls;
|
|
||||||
|
|
||||||
Fl_Pack *pack;
|
Fl_Pack *pack;
|
||||||
Fl_Pack *annotation;
|
Fl_Pack *annotation;
|
||||||
|
|
Loading…
Reference in New Issue