2005-09-25 14:42:24 -04:00
/*
2009-10-14 12:10:01 -04:00
Copyright ( C ) 1999 Paul Davis
2005-09-25 14:42:24 -04:00
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 ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2010-11-13 00:14:48 -05:00
# ifdef WAF_BUILD
# include "gtk2ardour-config.h"
# endif
2005-09-25 14:42:24 -04:00
# include <fcntl.h>
# include <signal.h>
# include <unistd.h>
# include <cerrno>
# include <iostream>
# include <cmath>
2005-10-10 16:38:53 -04:00
# include <sigc++/bind.h>
2009-02-25 13:26:51 -05:00
# include "pbd/error.h"
# include "pbd/basename.h"
# include "pbd/fastlog.h"
2011-06-03 18:18:47 -04:00
# include <gtkmm2ext/cairocell.h>
2005-09-25 16:33:00 -04:00
# include <gtkmm2ext/utils.h>
# include <gtkmm2ext/click_box.h>
# include <gtkmm2ext/tearoff.h>
2005-09-25 14:42:24 -04:00
2009-02-25 13:26:51 -05:00
# include "ardour/profile.h"
2012-05-24 02:09:29 -04:00
# include "ardour/session.h"
# include "ardour/types.h"
2005-09-25 14:42:24 -04:00
# include "ardour_ui.h"
2007-02-08 22:36:00 -05:00
# include "keyboard.h"
2005-09-25 14:42:24 -04:00
# include "public_editor.h"
# include "audio_clock.h"
2005-11-28 10:29:49 -05:00
# include "actions.h"
2012-05-31 19:14:03 -04:00
# include "main_clock.h"
2005-10-10 16:38:53 -04:00
# include "utils.h"
2007-05-25 16:29:12 -04:00
# include "theme_manager.h"
2010-07-06 20:40:58 -04:00
# include "midi_tracer.h"
2011-04-19 22:48:20 -04:00
# include "shuttle_control.h"
2010-08-17 22:20:15 -04:00
# include "global_port_matrix.h"
# include "location_ui.h"
2011-02-17 13:53:31 -05:00
# include "rc_option_editor.h"
2011-06-03 18:18:47 -04:00
# include "time_info_box.h"
2005-09-25 14:42:24 -04:00
# include "i18n.h"
using namespace std ;
using namespace ARDOUR ;
2006-06-21 19:01:03 -04:00
using namespace PBD ;
2005-09-25 16:33:00 -04:00
using namespace Gtkmm2ext ;
2005-09-25 14:42:24 -04:00
using namespace Gtk ;
2005-12-04 23:11:08 -05:00
using namespace Glib ;
2014-06-25 15:27:37 -04:00
using namespace ARDOUR_UI_UTILS ;
2005-09-25 14:42:24 -04:00
2009-10-14 12:10:01 -04:00
int
2005-09-25 14:42:24 -04:00
ARDOUR_UI : : setup_windows ( )
{
if ( create_editor ( ) ) {
error < < _ ( " UI: cannot setup editor " ) < < endmsg ;
return - 1 ;
}
if ( create_mixer ( ) ) {
error < < _ ( " UI: cannot setup mixer " ) < < endmsg ;
return - 1 ;
}
2013-06-19 04:25:18 -04:00
if ( create_meterbridge ( ) ) {
error < < _ ( " UI: cannot setup meterbridge " ) < < endmsg ;
return - 1 ;
}
2005-09-25 14:42:24 -04:00
/* all other dialogs are created conditionally */
we_have_dependents ( ) ;
2007-10-11 18:07:47 -04:00
# ifdef TOP_MENUBAR
HBox * status_bar_packer = manage ( new HBox ) ;
2010-04-20 22:24:38 -04:00
EventBox * status_bar_event_box = manage ( new EventBox ) ;
2009-10-14 12:10:01 -04:00
2010-04-20 22:24:38 -04:00
status_bar_event_box - > add ( status_bar_label ) ;
status_bar_event_box - > add_events ( Gdk : : BUTTON_PRESS_MASK | Gdk : : BUTTON_RELEASE_MASK ) ;
2007-10-11 18:07:47 -04:00
status_bar_label . set_size_request ( 300 , - 1 ) ;
2010-04-20 22:24:38 -04:00
status_bar_packer - > pack_start ( * status_bar_event_box , true , true , 6 ) ;
2009-10-14 12:10:01 -04:00
2010-04-20 22:24:38 -04:00
status_bar_label . show ( ) ;
status_bar_event_box - > show ( ) ;
status_bar_packer - > show ( ) ;
status_bar_event_box - > signal_button_press_event ( ) . connect ( mem_fun ( * this , & ARDOUR_UI : : status_bar_button_press ) ) ;
2007-10-11 18:07:47 -04:00
editor - > get_status_bar_packer ( ) . pack_start ( * status_bar_packer , true , true ) ;
2015-03-14 13:26:10 -04:00
editor - > get_status_bar_packer ( ) . pack_start ( menu_bar_base , false , false , 2 ) ;
2007-10-11 18:07:47 -04:00
# else
2009-10-22 14:11:22 -04:00
top_packer . pack_start ( menu_bar_base , false , false ) ;
2009-10-14 12:10:01 -04:00
# endif
2005-09-25 14:42:24 -04:00
2014-07-28 12:27:02 -04:00
editor - > add_toplevel_menu ( top_packer ) ;
2007-10-11 21:54:35 -04:00
2014-07-28 12:27:02 -04:00
editor - > add_transport_frame ( transport_frame ) ;
2005-09-25 14:42:24 -04:00
2010-03-19 16:53:22 -04:00
setup_transport ( ) ;
2011-11-13 19:25:08 -05:00
2010-03-19 16:53:22 -04:00
build_menu_bar ( ) ;
2010-02-08 19:50:24 -05:00
setup_tooltips ( ) ;
2005-09-25 14:42:24 -04:00
return 0 ;
}
2010-02-08 19:50:24 -05:00
void
ARDOUR_UI : : setup_tooltips ( )
{
set_tip ( roll_button , _ ( " Play from playhead " ) ) ;
set_tip ( stop_button , _ ( " Stop playback " ) ) ;
set_tip ( rec_button , _ ( " Toggle record " ) ) ;
set_tip ( play_selection_button , _ ( " Play range/selection " ) ) ;
set_tip ( goto_start_button , _ ( " Go to start of session " ) ) ;
set_tip ( goto_end_button , _ ( " Go to end of session " ) ) ;
set_tip ( auto_loop_button , _ ( " Play loop range " ) ) ;
2011-11-10 13:04:34 -05:00
set_tip ( midi_panic_button , _ ( " MIDI Panic \n Send note off and reset controller messages on all MIDI channels " ) ) ;
2015-06-25 12:47:29 -04:00
set_tip ( auto_return_button , _ ( " Return to last playback start when stopped " ) ) ;
2015-11-29 14:17:11 -05:00
set_tip ( follow_edits_button , _ ( " Playhead follows range selections and edits " ) ) ;
2010-02-08 19:50:24 -05:00
set_tip ( auto_input_button , _ ( " Be sensible about input monitoring " ) ) ;
set_tip ( click_button , _ ( " Enable/Disable audio click " ) ) ;
set_tip ( solo_alert_button , _ ( " When active, something is soloed. \n Click to de-solo everything " ) ) ;
2015-11-29 14:17:11 -05:00
set_tip ( auditioning_alert_button , _ ( " When active, auditioning is taking place. \n Click to stop the audition " ) ) ;
2011-11-11 08:52:27 -05:00
set_tip ( feedback_alert_button , _ ( " When active, there is a feedback loop. " ) ) ;
2013-03-09 08:50:02 -05:00
set_tip ( primary_clock , _ ( " <b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify. \n Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times. \n " ) ) ;
set_tip ( secondary_clock , _ ( " <b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify. \n Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times. \n " ) ) ;
2014-08-22 12:45:34 -04:00
set_tip ( editor_meter_peak_display , _ ( " Reset All Peak Indicators " ) ) ;
2015-03-16 14:04:17 -04:00
set_tip ( error_alert_button , _ ( " Show Error Log and acknowledge warnings " ) ) ;
2010-02-08 19:50:24 -05:00
2010-11-25 15:37:39 -05:00
synchronize_sync_source_and_video_pullup ( ) ;
2010-08-30 21:49:33 -04:00
2010-02-08 19:50:24 -05:00
editor - > setup_tooltips ( ) ;
}
2010-04-20 22:24:38 -04:00
bool
ARDOUR_UI : : status_bar_button_press ( GdkEventButton * ev )
{
bool handled = false ;
switch ( ev - > button ) {
case 1 :
status_bar_label . set_text ( " " ) ;
handled = true ;
break ;
default :
break ;
}
return handled ;
}
2009-10-22 14:11:22 -04:00
void
2007-10-11 18:07:47 -04:00
ARDOUR_UI : : display_message ( const char * prefix , gint prefix_len , RefPtr < TextBuffer : : Tag > ptag , RefPtr < TextBuffer : : Tag > mtag , const char * msg )
{
2010-09-14 12:51:02 -04:00
string text ;
2007-10-11 18:07:47 -04:00
UI : : display_message ( prefix , prefix_len , ptag , mtag , msg ) ;
2015-03-14 12:28:20 -04:00
2015-03-16 14:04:17 -04:00
ArdourLogLevel ll = LogLevelNone ;
2007-10-11 18:07:47 -04:00
if ( strcmp ( prefix , _ ( " [ERROR]: " ) ) = = 0 ) {
text = " <span color= \" red \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelError ;
2007-10-11 18:07:47 -04:00
} else if ( strcmp ( prefix , _ ( " [WARNING]: " ) ) = = 0 ) {
text = " <span color= \" yellow \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelWarning ;
2007-10-11 18:07:47 -04:00
} else if ( strcmp ( prefix , _ ( " [INFO]: " ) ) = = 0 ) {
text = " <span color= \" green \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelInfo ;
2007-10-11 18:07:47 -04:00
} else {
2008-09-19 02:30:49 -04:00
text = " <span color= \" white \" weight= \" bold \" >??? " ;
2007-10-11 18:07:47 -04:00
}
2015-03-16 14:04:17 -04:00
_log_not_acknowledged = std : : max ( _log_not_acknowledged , ll ) ;
# ifdef TOP_MENUBAR
2007-10-11 18:07:47 -04:00
text + = prefix ;
text + = " </span> " ;
text + = msg ;
status_bar_label . set_markup ( text ) ;
# endif
}
2010-03-19 16:53:22 -04:00
XMLNode *
ARDOUR_UI : : tearoff_settings ( const char * name ) const
{
2010-11-25 15:37:39 -05:00
XMLNode * ui_node = Config - > extra_xml ( X_ ( " UI " ) ) ;
2011-06-01 13:00:29 -04:00
2010-11-25 15:37:39 -05:00
if ( ui_node ) {
XMLNode * tearoff_node = ui_node - > child ( X_ ( " Tearoffs " ) ) ;
if ( tearoff_node ) {
XMLNode * mnode = tearoff_node - > child ( name ) ;
return mnode ;
}
}
return 0 ;
2010-03-19 16:53:22 -04:00
}
2015-01-02 09:44:54 -05:00
# define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
2015-04-18 13:42:00 -04:00
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : setup_transport ( )
{
2011-11-09 09:38:58 -05:00
RefPtr < Action > act ;
2015-04-22 18:22:20 -04:00
transport_tearoff_hbox . set_border_width ( PX_SCALE ( 3 ) ) ;
transport_tearoff_hbox . set_spacing ( PX_SCALE ( 3 ) ) ;
2011-11-09 13:11:34 -05:00
2005-09-25 14:42:24 -04:00
transport_tearoff = manage ( new TearOff ( transport_tearoff_hbox ) ) ;
transport_tearoff - > set_name ( " TransportBase " ) ;
2009-12-11 18:29:48 -05:00
transport_tearoff - > tearoff_window ( ) . signal_key_press_event ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( relay_key_press ) , & transport_tearoff - > tearoff_window ( ) ) , false ) ;
2005-09-25 14:42:24 -04:00
2014-07-09 16:11:58 -04:00
if ( Profile - > get_sae ( ) | | Profile - > get_mixbus ( ) ) {
2008-12-12 09:43:24 -05:00
transport_tearoff - > set_can_be_torn_off ( false ) ;
}
2005-09-25 14:42:24 -04:00
transport_hbox . pack_start ( * transport_tearoff , true , false ) ;
transport_base . set_name ( " TransportBase " ) ;
transport_base . add ( transport_hbox ) ;
2005-12-21 16:37:18 -05:00
transport_frame . set_shadow_type ( SHADOW_OUT ) ;
2005-09-25 14:42:24 -04:00
transport_frame . set_name ( " BaseFrame " ) ;
transport_frame . add ( transport_base ) ;
2009-12-11 18:29:48 -05:00
transport_tearoff - > Detach . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : detach_tearoff ) , static_cast < Box * > ( & top_packer ) ,
2005-12-21 16:37:18 -05:00
static_cast < Widget * > ( & transport_frame ) ) ) ;
2009-12-11 18:29:48 -05:00
transport_tearoff - > Attach . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : reattach_tearoff ) , static_cast < Box * > ( & top_packer ) ,
2005-12-21 16:37:18 -05:00
static_cast < Widget * > ( & transport_frame ) , 1 ) ) ;
2009-12-11 18:29:48 -05:00
transport_tearoff - > Hidden . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : detach_tearoff ) , static_cast < Box * > ( & top_packer ) ,
2006-01-19 13:05:31 -05:00
static_cast < Widget * > ( & transport_frame ) ) ) ;
2009-12-11 18:29:48 -05:00
transport_tearoff - > Visible . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : reattach_tearoff ) , static_cast < Box * > ( & top_packer ) ,
2006-01-19 13:05:31 -05:00
static_cast < Widget * > ( & transport_frame ) , 1 ) ) ;
2009-10-14 12:10:01 -04:00
2015-06-25 12:47:29 -04:00
auto_return_button . set_text ( _ ( " Auto Return " ) ) ;
2012-12-06 15:48:44 -05:00
2012-11-20 14:43:43 -05:00
follow_edits_button . set_text ( _ ( " Follow Edits " ) ) ;
2012-12-06 15:48:44 -05:00
// auto_input_button.set_text (_("Auto Input"));
2011-11-09 09:38:58 -05:00
2015-05-24 15:45:39 -04:00
click_button . set_icon ( ArdourIcon : : TransportMetronom ) ;
2015-04-07 19:28:52 -04:00
2011-11-09 09:38:58 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleClick " ) ;
click_button . set_related_action ( act ) ;
click_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : click_button_clicked ) , false ) ;
2015-06-25 12:47:29 -04:00
auto_return_button . set_name ( " transport option button " ) ;
2012-11-20 14:43:43 -05:00
follow_edits_button . set_name ( " transport option button " ) ;
2011-11-09 09:38:58 -05:00
auto_input_button . set_name ( " transport option button " ) ;
2011-11-10 10:25:01 -05:00
/* these have to provide a clear indication of active state */
2012-11-12 13:23:58 -05:00
click_button . set_name ( " transport button " ) ;
2011-11-10 10:25:01 -05:00
sync_button . set_name ( " transport active option button " ) ;
2012-02-07 12:43:55 -05:00
stop_button . set_active ( true ) ;
2011-11-07 12:23:27 -05:00
2015-05-24 15:45:39 -04:00
goto_start_button . set_icon ( ArdourIcon : : TransportStart ) ;
goto_end_button . set_icon ( ArdourIcon : : TransportEnd ) ;
roll_button . set_icon ( ArdourIcon : : TransportPlay ) ;
stop_button . set_icon ( ArdourIcon : : TransportStop ) ;
play_selection_button . set_icon ( ArdourIcon : : TransportRange ) ;
auto_loop_button . set_icon ( ArdourIcon : : TransportLoop ) ;
rec_button . set_icon ( ArdourIcon : : RecButton ) ;
midi_panic_button . set_icon ( ArdourIcon : : TransportPanic ) ;
2015-04-07 16:33:43 -04:00
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Stop " ) ) ;
2011-11-07 12:23:27 -05:00
stop_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Roll " ) ) ;
2011-11-07 12:23:27 -05:00
roll_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Record " ) ) ;
2011-11-07 12:23:27 -05:00
rec_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " GotoStart " ) ) ;
2011-11-07 12:23:27 -05:00
goto_start_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " GotoEnd " ) ) ;
2011-11-07 12:23:27 -05:00
goto_end_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Loop " ) ) ;
2011-11-07 12:23:27 -05:00
auto_loop_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " PlaySelection " ) ) ;
2011-11-07 12:23:27 -05:00
play_selection_button . set_related_action ( act ) ;
2011-11-10 13:04:34 -05:00
act = ActionManager : : get_action ( X_ ( " MIDI " ) , X_ ( " panic " ) ) ;
midi_panic_button . set_related_action ( act ) ;
2009-11-09 23:30:08 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleExternalSync " ) ) ;
2011-11-10 10:25:01 -05:00
sync_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2005-09-25 14:42:24 -04:00
/* clocks, etc. */
2011-11-18 13:06:16 -05:00
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( primary_clock , & AudioClock : : set ) ) ;
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( secondary_clock , & AudioClock : : set ) ) ;
2005-09-25 14:42:24 -04:00
2011-06-02 13:50:37 -04:00
primary_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : primary_clock_value_changed ) ) ;
secondary_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : secondary_clock_value_changed ) ) ;
big_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : big_clock_value_changed ) ) ;
2005-09-25 14:42:24 -04:00
2015-06-25 12:47:29 -04:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoReturn " ) ;
auto_return_button . set_related_action ( act ) ;
2012-11-20 14:43:43 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
follow_edits_button . set_related_action ( act ) ;
2011-11-09 09:38:58 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoInput " ) ;
auto_input_button . set_related_action ( act ) ;
2011-02-17 13:53:31 -05:00
2005-09-25 14:42:24 -04:00
/* alerts */
2009-12-11 18:29:48 -05:00
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
2005-09-25 14:42:24 -04:00
2011-11-10 10:25:01 -05:00
solo_alert_button . set_name ( " rude solo " ) ;
2015-10-02 07:32:49 -04:00
act = ActionManager : : get_action ( X_ ( " Main " ) , X_ ( " cancel-solo " ) ) ;
solo_alert_button . set_related_action ( act ) ;
2011-11-10 10:25:01 -05:00
auditioning_alert_button . set_name ( " rude audition " ) ;
2010-03-19 16:53:22 -04:00
auditioning_alert_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : audition_alert_press ) , false ) ;
2011-11-11 08:52:27 -05:00
feedback_alert_button . set_name ( " feedback alert " ) ;
feedback_alert_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : feedback_alert_press ) , false ) ;
2015-03-14 12:28:20 -04:00
error_alert_button . set_name ( " error alert " ) ;
2015-03-20 17:12:40 -04:00
error_alert_button . signal_button_release_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : error_alert_press ) , false ) ;
2015-03-16 21:05:02 -04:00
act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
error_alert_button . set_related_action ( act ) ;
2015-03-17 06:59:30 -04:00
error_alert_button . set_fallthrough_to_parent ( true ) ;
2005-09-25 14:42:24 -04:00
2014-09-05 11:30:34 -04:00
alert_box . set_homogeneous ( true ) ;
2015-04-22 18:22:20 -04:00
alert_box . set_spacing ( PX_SCALE ( 2 ) ) ;
2014-09-05 11:30:34 -04:00
alert_box . pack_start ( solo_alert_button , true , true ) ;
alert_box . pack_start ( auditioning_alert_button , true , true ) ;
alert_box . pack_start ( feedback_alert_button , true , true ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
/* all transport buttons should be the same size vertically and
2015-10-04 14:51:05 -04:00
* horizontally
2012-02-02 23:18:30 -05:00
*/
Glib : : RefPtr < SizeGroup > transport_button_size_group = SizeGroup : : create ( SIZE_GROUP_BOTH ) ;
transport_button_size_group - > add_widget ( goto_start_button ) ;
transport_button_size_group - > add_widget ( goto_end_button ) ;
transport_button_size_group - > add_widget ( auto_loop_button ) ;
transport_button_size_group - > add_widget ( rec_button ) ;
transport_button_size_group - > add_widget ( play_selection_button ) ;
transport_button_size_group - > add_widget ( roll_button ) ;
2012-02-29 15:16:50 -05:00
transport_button_size_group - > add_widget ( stop_button ) ;
2012-02-02 23:18:30 -05:00
2015-04-18 13:42:00 -04:00
/* the icon for this has an odd aspect ratio, so fatten up the button */
2015-04-22 18:22:20 -04:00
midi_panic_button . set_size_request ( PX_SCALE ( 25 ) , - 1 ) ;
goto_start_button . set_size_request ( PX_SCALE ( 28 ) , PX_SCALE ( 44 ) ) ;
click_button . set_size_request ( PX_SCALE ( 32 ) , PX_SCALE ( 44 ) ) ;
2015-04-18 13:42:00 -04:00
2012-12-06 15:48:44 -05:00
2012-02-02 23:18:30 -05:00
HBox * tbox1 = manage ( new HBox ) ;
HBox * tbox2 = manage ( new HBox ) ;
2011-11-07 12:47:49 -05:00
HBox * tbox = manage ( new HBox ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
VBox * vbox1 = manage ( new VBox ) ;
VBox * vbox2 = manage ( new VBox ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
Alignment * a1 = manage ( new Alignment ) ;
Alignment * a2 = manage ( new Alignment ) ;
2011-11-07 15:06:13 -05:00
2015-04-22 18:22:20 -04:00
tbox1 - > set_spacing ( PX_SCALE ( 2 ) ) ;
tbox2 - > set_spacing ( PX_SCALE ( 2 ) ) ;
tbox - > set_spacing ( PX_SCALE ( 2 ) ) ;
2011-11-07 15:06:13 -05:00
2014-04-10 04:16:13 -04:00
if ( ! Profile - > get_trx ( ) ) {
2014-12-18 23:20:17 -05:00
tbox1 - > pack_start ( midi_panic_button , true , true , 5 ) ;
tbox1 - > pack_start ( click_button , true , true , 5 ) ;
2014-04-10 04:16:13 -04:00
}
2014-12-18 23:20:17 -05:00
tbox1 - > pack_start ( goto_start_button , true , true ) ;
tbox1 - > pack_start ( goto_end_button , true , true ) ;
tbox1 - > pack_start ( auto_loop_button , true , true ) ;
2011-11-07 15:06:13 -05:00
2014-04-10 04:16:13 -04:00
if ( ! Profile - > get_trx ( ) ) {
2014-12-18 23:20:17 -05:00
tbox2 - > pack_start ( play_selection_button , true , true ) ;
2014-04-10 04:16:13 -04:00
}
2014-12-18 23:20:17 -05:00
tbox2 - > pack_start ( roll_button , true , true ) ;
tbox2 - > pack_start ( stop_button , true , true ) ;
tbox2 - > pack_start ( rec_button , true , true , 5 ) ;
2011-04-19 22:48:20 -04:00
2014-12-18 23:20:17 -05:00
vbox1 - > pack_start ( * tbox1 , true , true ) ;
vbox2 - > pack_start ( * tbox2 , true , true ) ;
2011-11-07 15:06:13 -05:00
2012-02-02 23:18:30 -05:00
a1 - > add ( * vbox1 ) ;
2014-12-18 23:20:17 -05:00
a1 - > set ( 0.5 , 0.5 , 0.0 , 1.0 ) ;
2012-02-02 23:18:30 -05:00
a2 - > add ( * vbox2 ) ;
2014-12-18 23:20:17 -05:00
a2 - > set ( 0.5 , 0.5 , 0.0 , 1.0 ) ;
2011-11-07 15:06:13 -05:00
2012-02-02 23:18:30 -05:00
tbox - > pack_start ( * a1 , false , false ) ;
tbox - > pack_start ( * a2 , false , false ) ;
2006-08-01 18:58:24 -04:00
HBox * clock_box = manage ( new HBox ) ;
2011-11-17 17:49:13 -05:00
2011-06-02 13:50:37 -04:00
clock_box - > pack_start ( * primary_clock , false , false ) ;
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_small_screen ( ) & & ! ARDOUR : : Profile - > get_trx ( ) ) {
2011-06-02 13:50:37 -04:00
clock_box - > pack_start ( * secondary_clock , false , false ) ;
2007-04-06 20:35:07 -04:00
}
2015-04-22 18:22:20 -04:00
clock_box - > set_spacing ( PX_SCALE ( 3 ) ) ;
2008-01-10 16:20:59 -05:00
2014-09-10 20:34:09 -04:00
shuttle_box = manage ( new ShuttleControl ) ;
2011-04-19 22:48:20 -04:00
shuttle_box - > show ( ) ;
2015-10-05 10:17:49 -04:00
2011-04-19 22:48:20 -04:00
VBox * transport_vbox = manage ( new VBox ) ;
transport_vbox - > set_name ( " TransportBase " ) ;
2012-12-06 15:48:44 -05:00
transport_vbox - > set_border_width ( 0 ) ;
2015-04-22 18:22:20 -04:00
transport_vbox - > set_spacing ( PX_SCALE ( 3 ) ) ;
2011-11-07 12:47:49 -05:00
transport_vbox - > pack_start ( * tbox , true , true , 0 ) ;
2014-04-10 13:30:25 -04:00
if ( ! Profile - > get_trx ( ) ) {
transport_vbox - > pack_start ( * shuttle_box , false , false , 0 ) ;
}
time_info_box = manage ( new TimeInfoBox ) ;
if ( ARDOUR : : Profile - > get_trx ( ) ) {
transport_tearoff_hbox . pack_start ( * time_info_box , false , false ) ;
}
2011-04-19 22:48:20 -04:00
2011-11-09 13:11:34 -05:00
transport_tearoff_hbox . pack_start ( * transport_vbox , false , false ) ;
2011-06-09 17:51:15 -04:00
2011-11-09 12:29:23 -05:00
/* transport related toggle controls */
VBox * auto_box = manage ( new VBox ) ;
auto_box - > set_homogeneous ( true ) ;
2015-04-22 18:22:20 -04:00
auto_box - > set_spacing ( PX_SCALE ( 2 ) ) ;
2014-09-04 17:16:48 -04:00
auto_box - > pack_start ( sync_button , true , true ) ;
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
2014-09-04 17:16:48 -04:00
auto_box - > pack_start ( follow_edits_button , true , true ) ;
2015-06-25 12:47:29 -04:00
auto_box - > pack_start ( auto_return_button , true , true ) ;
2014-04-10 13:30:25 -04:00
}
2011-11-09 12:29:23 -05:00
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
transport_tearoff_hbox . pack_start ( * auto_box , false , false ) ;
}
2012-11-12 21:19:04 -05:00
transport_tearoff_hbox . pack_start ( * clock_box , true , true ) ;
2011-06-09 11:44:09 -04:00
2014-04-10 13:30:25 -04:00
if ( ARDOUR : : Profile - > get_trx ( ) ) {
transport_tearoff_hbox . pack_start ( * auto_box , false , false ) ;
}
2011-06-03 18:18:47 -04:00
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
transport_tearoff_hbox . pack_start ( * time_info_box , false , false ) ;
}
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
transport_tearoff_hbox . pack_start ( alert_box , false , false ) ;
transport_tearoff_hbox . pack_start ( meter_box , false , false ) ;
transport_tearoff_hbox . pack_start ( editor_meter_peak_display , false , false ) ;
}
2009-10-14 12:10:01 -04:00
2008-01-10 16:20:59 -05:00
if ( Profile - > get_sae ( ) ) {
Image * img = manage ( new Image ( ( : : get_icon ( X_ ( " sae " ) ) ) ) ) ;
2011-11-09 13:11:34 -05:00
transport_tearoff_hbox . pack_end ( * img , false , false ) ;
2008-01-10 16:20:59 -05:00
}
2010-03-19 16:53:22 -04:00
2011-11-09 12:29:23 -05:00
/* desensitize */
set_transport_sensitivity ( false ) ;
2010-11-25 15:37:39 -05:00
XMLNode * tnode = tearoff_settings ( " transport " ) ;
if ( tnode ) {
transport_tearoff - > set_state ( * tnode ) ;
}
2005-09-25 14:42:24 -04:00
}
2015-04-18 13:42:00 -04:00
# undef PX_SCALE
2005-09-25 14:42:24 -04:00
void
2005-12-21 16:37:18 -05:00
ARDOUR_UI : : detach_tearoff ( Box * b , Widget * w )
2005-09-25 14:42:24 -04:00
{
2006-01-04 00:53:51 -05:00
// editor->ensure_float (transport_tearoff->tearoff_window());
2005-09-25 14:42:24 -04:00
b - > remove ( * w ) ;
}
void
2005-12-21 16:37:18 -05:00
ARDOUR_UI : : reattach_tearoff ( Box * b , Widget * w , int32_t n )
2005-09-25 14:42:24 -04:00
{
b - > pack_start ( * w ) ;
b - > reorder_child ( * w , n ) ;
}
2014-10-16 13:31:20 -04:00
void
ARDOUR_UI : : reattach_all_tearoffs ( )
{
if ( transport_tearoff ) transport_tearoff - > put_it_back ( ) ;
2014-10-16 13:43:07 -04:00
if ( editor ) editor - > reattach_all_tearoffs ( ) ;
2014-10-16 13:31:20 -04:00
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : soloing_changed ( bool onoff )
{
if ( solo_alert_button . get_active ( ) ! = onoff ) {
solo_alert_button . set_active ( onoff ) ;
}
}
void
ARDOUR_UI : : _auditioning_changed ( bool onoff )
{
2011-11-14 17:59:40 -05:00
auditioning_alert_button . set_active ( onoff ) ;
set_transport_sensitivity ( ! onoff ) ;
2005-09-25 14:42:24 -04:00
}
void
ARDOUR_UI : : auditioning_changed ( bool onoff )
{
2010-03-30 11:18:43 -04:00
UI : : instance ( ) - > call_slot ( MISSING_INVALIDATOR , boost : : bind ( & ARDOUR_UI : : _auditioning_changed , this , onoff ) ) ;
2005-09-25 14:42:24 -04:00
}
2010-03-19 16:53:22 -04:00
bool
2010-09-02 13:01:36 -04:00
ARDOUR_UI : : audition_alert_press ( GdkEventButton * )
2005-09-25 14:42:24 -04:00
{
2009-12-17 13:24:23 -05:00
if ( _session ) {
_session - > cancel_audition ( ) ;
2005-09-25 14:42:24 -04:00
}
2010-11-25 15:37:39 -05:00
return true ;
2005-09-25 14:42:24 -04:00
}
2011-11-11 08:52:27 -05:00
bool
ARDOUR_UI : : feedback_alert_press ( GdkEventButton * )
{
return true ;
}
2015-03-14 12:28:20 -04:00
bool
2015-03-17 06:59:30 -04:00
ARDOUR_UI : : error_alert_press ( GdkEventButton * ev )
2015-03-14 12:28:20 -04:00
{
2015-03-20 17:48:53 -04:00
bool do_toggle = true ;
2015-03-20 17:12:40 -04:00
if ( ev - > button = = 1 ) {
2015-03-20 17:48:53 -04:00
if ( _log_not_acknowledged = = LogLevelError ) {
// just acknowledge the error, don't hide the log if it's already visible
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
Glib : : RefPtr < ToggleAction > tact = Glib : : RefPtr < ToggleAction > : : cast_dynamic ( act ) ;
if ( tact & & tact - > get_active ( ) ) {
do_toggle = false ;
}
}
2015-03-20 17:12:40 -04:00
_log_not_acknowledged = LogLevelNone ;
error_blink ( false ) ; // immediate acknowledge
2015-03-17 06:59:30 -04:00
}
2015-03-20 17:48:53 -04:00
// maybe fall through to to button toggle
return ! do_toggle ;
2015-03-14 12:28:20 -04:00
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : solo_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 ) {
2005-09-25 14:42:24 -04:00
return ;
}
2009-10-14 12:10:01 -04:00
2010-03-19 16:53:22 -04:00
if ( _session - > soloing ( ) | | _session - > listening ( ) ) {
2005-09-25 14:42:24 -04:00
if ( onoff ) {
2011-11-14 12:52:38 -05:00
solo_alert_button . set_active ( true ) ;
2005-09-25 14:42:24 -04:00
} else {
2011-11-14 12:52:38 -05:00
solo_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
} else {
solo_alert_button . set_active ( false ) ;
}
}
2009-11-09 15:05:18 -05:00
void
ARDOUR_UI : : sync_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 | | ! _session - > config . get_external_sync ( ) ) {
2009-11-09 23:30:08 -05:00
/* internal sync */
2011-11-14 12:52:38 -05:00
sync_button . set_active ( false ) ;
2009-11-09 15:05:18 -05:00
return ;
}
2009-12-17 13:24:23 -05:00
if ( ! _session - > transport_locked ( ) ) {
2009-11-09 23:30:08 -05:00
/* not locked, so blink on and off according to the onoff argument */
2009-11-09 15:05:18 -05:00
if ( onoff ) {
2011-11-14 12:52:38 -05:00
sync_button . set_active ( true ) ;
2009-11-09 15:05:18 -05:00
} else {
2011-11-14 12:52:38 -05:00
sync_button . set_active ( false ) ;
2009-11-09 15:05:18 -05:00
}
} else {
2009-11-09 23:30:08 -05:00
/* locked */
2011-11-14 12:52:38 -05:00
sync_button . set_active ( true ) ;
2009-11-09 15:05:18 -05:00
}
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : audition_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 ) {
2005-09-25 14:42:24 -04:00
return ;
}
2009-10-14 12:10:01 -04:00
2009-12-17 13:24:23 -05:00
if ( _session - > is_auditioning ( ) ) {
2005-09-25 14:42:24 -04:00
if ( onoff ) {
2011-11-14 13:52:44 -05:00
auditioning_alert_button . set_active ( true ) ;
2005-09-25 14:42:24 -04:00
} else {
2011-11-14 13:52:44 -05:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
} else {
2011-11-14 17:57:03 -05:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
}
2011-11-11 08:52:27 -05:00
void
ARDOUR_UI : : feedback_blink ( bool onoff )
{
if ( _feedback_exists ) {
if ( onoff ) {
feedback_alert_button . set_active ( true ) ;
} else {
feedback_alert_button . set_active ( false ) ;
}
} else {
feedback_alert_button . set_active ( false ) ;
}
}
2015-03-14 12:28:20 -04:00
void
ARDOUR_UI : : error_blink ( bool onoff )
{
2015-03-16 14:04:17 -04:00
switch ( _log_not_acknowledged ) {
case LogLevelError :
// blink
if ( onoff ) {
error_alert_button . set_custom_led_color ( 0xff0000ff ) ; // bright red
} else {
error_alert_button . set_custom_led_color ( 0x880000ff ) ; // dark red
}
break ;
case LogLevelWarning :
error_alert_button . set_custom_led_color ( 0xccaa00ff ) ; // yellow
break ;
case LogLevelInfo :
error_alert_button . set_custom_led_color ( 0x88cc00ff ) ; // lime green
break ;
default :
error_alert_button . set_custom_led_color ( 0x333333ff ) ; // gray
break ;
2015-03-14 12:28:20 -04:00
}
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : set_transport_sensitivity ( bool yn )
{
2005-12-21 16:37:18 -05:00
ActionManager : : set_sensitive ( ActionManager : : transport_sensitive_actions , yn ) ;
2011-04-19 22:48:20 -04:00
shuttle_box - > set_sensitive ( yn ) ;
2005-09-25 14:42:24 -04:00
}
2005-12-21 16:37:18 -05:00
void
ARDOUR_UI : : editor_realized ( )
{
2009-12-12 10:02:15 -05:00
boost : : function < void ( string ) > pc ( boost : : bind ( & ARDOUR_UI : : parameter_changed , this , _1 ) ) ;
Config - > map_parameters ( pc ) ;
2006-09-25 17:24:00 -04:00
2015-01-02 09:44:54 -05:00
UIConfiguration : : instance ( ) . reset_dpi ( ) ;
2005-12-21 16:37:18 -05:00
}
2005-12-31 13:20:42 -05:00
2006-01-19 13:05:31 -05:00
void
2012-06-13 00:21:46 -04:00
ARDOUR_UI : : update_tearoff_visibility ( )
2006-01-19 13:05:31 -05:00
{
2012-01-24 22:03:25 -05:00
if ( editor ) {
2012-06-13 00:21:46 -04:00
editor - > update_tearoff_visibility ( ) ;
2010-07-23 19:29:36 -04:00
}
2006-01-19 13:05:31 -05:00
}
void
2012-06-13 00:21:46 -04:00
ARDOUR_UI : : maximise_editing_space ( )
2006-01-19 13:05:31 -05:00
{
2012-01-24 22:03:25 -05:00
if ( editor ) {
2012-06-13 00:21:46 -04:00
editor - > maximise_editing_space ( ) ;
}
}
void
ARDOUR_UI : : restore_editing_space ( )
{
if ( editor ) {
editor - > restore_editing_space ( ) ;
2006-01-19 13:05:31 -05:00
}
}
2011-02-17 13:53:31 -05:00
2014-07-14 13:19:52 -04:00
void
ARDOUR_UI : : show_ui_prefs ( )
{
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Window " ) , X_ ( " toggle-rc-options-editor " ) ) ;
assert ( act ) ;
act - > activate ( ) ;
rc_option_editor - > set_current_page ( _ ( " GUI " ) ) ;
}
2011-02-17 13:53:31 -05:00
bool
ARDOUR_UI : : click_button_clicked ( GdkEventButton * ev )
{
if ( ev - > button ! = 3 ) {
/* this handler is just for button-3 clicks */
return false ;
}
2013-07-14 12:34:36 -04:00
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Window " ) , X_ ( " toggle-rc-options-editor " ) ) ;
2011-02-17 13:53:31 -05:00
assert ( act ) ;
2013-07-14 12:34:36 -04:00
act - > activate ( ) ;
2011-02-17 13:53:31 -05:00
rc_option_editor - > set_current_page ( _ ( " Misc " ) ) ;
return true ;
}
2011-12-01 18:22:05 -05:00
void
2014-07-03 13:25:35 -04:00
ARDOUR_UI : : toggle_follow_edits ( )
2011-12-01 18:22:05 -05:00
{
2012-11-20 14:43:43 -05:00
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
2012-01-30 17:53:22 -05:00
assert ( act ) ;
RefPtr < ToggleAction > tact = RefPtr < ToggleAction > : : cast_dynamic ( act ) ;
assert ( tact ) ;
2015-01-02 09:44:54 -05:00
UIConfiguration : : instance ( ) . set_follow_edits ( tact - > get_active ( ) ) ;
2011-12-01 18:22:05 -05:00
}
2012-01-30 17:53:22 -05:00
2015-10-05 10:17:49 -04:00