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>
2016-05-02 14:24:54 -04:00
# include "canvas/canvas.h"
2009-02-25 13:26:51 -05:00
# include "pbd/error.h"
# include "pbd/basename.h"
# include "pbd/fastlog.h"
2015-07-09 13:56:12 -04:00
# include "gtkmm2ext/cairocell.h"
# include "gtkmm2ext/utils.h"
# include "gtkmm2ext/click_box.h"
# include "gtkmm2ext/window_title.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"
2016-02-25 11:08:33 -05:00
# include "mixer_ui.h"
2005-10-10 16:38:53 -04:00
# include "utils.h"
2016-12-19 21:11:21 -05:00
# include "time_info_box.h"
2010-07-06 20:40:58 -04:00
# include "midi_tracer.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"
2005-09-25 14:42:24 -04:00
2016-07-14 14:44:52 -04:00
# include "pbd/i18n.h"
2005-09-25 14:42:24 -04:00
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
2010-02-08 19:50:24 -05:00
void
ARDOUR_UI : : setup_tooltips ( )
{
2016-05-02 14:24:54 -04:00
ArdourCanvas : : Canvas : : set_tooltip_timeout ( Gtk : : Settings : : get_default ( ) - > property_gtk_tooltip_timeout ( ) ) ;
2010-02-08 19:50:24 -05:00
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 " ) ) ;
2016-12-19 13:22:39 -05:00
set_tip ( follow_edits_button , _ ( " Playhead follows Range tool clicks, and Range selections " ) ) ;
2017-01-16 13:54:20 -05:00
set_tip ( auto_input_button , _ ( " Track Input Monitoring automatically follows transport state " ) ) ;
2017-01-20 18:06:44 -05:00
parameter_changed ( " click-gain " ) ;
2010-02-08 19:50:24 -05:00
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
2016-02-25 11:08:33 -05:00
static
bool drag_failed ( const Glib : : RefPtr < Gdk : : DragContext > & context , DragResult result , Tabbable * tab )
{
if ( result = = Gtk : : DRAG_RESULT_NO_TARGET ) {
tab - > detach ( ) ;
return true ;
}
return false ;
}
2016-12-19 21:11:21 -05:00
void
ARDOUR_UI : : repack_transport_hbox ( )
{
if ( time_info_box ) {
if ( time_info_box - > get_parent ( ) ) {
transport_hbox . remove ( * time_info_box ) ;
}
if ( UIConfiguration : : instance ( ) . get_show_toolbar_selclock ( ) ) {
transport_hbox . pack_start ( * time_info_box , false , false ) ;
time_info_box - > show ( ) ;
}
}
if ( mini_timeline . get_parent ( ) ) {
transport_hbox . remove ( mini_timeline ) ;
}
if ( UIConfiguration : : instance ( ) . get_show_mini_timeline ( ) ) {
transport_hbox . pack_start ( mini_timeline , true , true ) ;
mini_timeline . show ( ) ;
}
if ( editor_meter ) {
if ( meter_box . get_parent ( ) ) {
transport_hbox . remove ( meter_box ) ;
transport_hbox . remove ( editor_meter_peak_display ) ;
}
if ( UIConfiguration : : instance ( ) . get_show_editor_meter ( ) ) {
transport_hbox . pack_end ( editor_meter_peak_display , false , false ) ;
transport_hbox . pack_end ( meter_box , false , false ) ;
meter_box . show ( ) ;
editor_meter_peak_display . show ( ) ;
}
}
2017-01-16 15:58:53 -05:00
bool show_mon = UIConfiguration : : instance ( ) . get_show_toolbar_monitoring ( ) ;
if ( show_mon ) {
monitor_in_button . show ( ) ;
monitor_disk_button . show ( ) ;
auto_input_button . show ( ) ;
monitoring_spacer . show ( ) ;
} else {
monitor_in_button . hide ( ) ;
monitor_disk_button . hide ( ) ;
auto_input_button . hide ( ) ;
monitoring_spacer . hide ( ) ;
}
bool show_rec = UIConfiguration : : instance ( ) . get_show_toolbar_recpunch ( ) ;
if ( show_rec ) {
punch_label . show ( ) ;
layered_label . show ( ) ;
punch_in_button . show ( ) ;
punch_out_button . show ( ) ;
layered_button . show ( ) ;
recpunch_spacer . show ( ) ;
} else {
punch_label . hide ( ) ;
layered_label . hide ( ) ;
punch_in_button . hide ( ) ;
punch_out_button . hide ( ) ;
layered_button . hide ( ) ;
recpunch_spacer . hide ( ) ;
}
2016-12-19 21:11:21 -05:00
}
2016-12-21 17:01:34 -05:00
void
ARDOUR_UI : : update_clock_visibility ( )
{
if ( ARDOUR : : Profile - > get_small_screen ( ) ) {
return ;
}
if ( UIConfiguration : : instance ( ) . get_show_secondary_clock ( ) ) {
secondary_clock - > show ( ) ;
secondary_clock - > left_btn ( ) - > show ( ) ;
secondary_clock - > right_btn ( ) - > show ( ) ;
2016-12-21 17:36:00 -05:00
if ( secondary_clock_spacer ) {
secondary_clock_spacer - > show ( ) ;
}
2016-12-21 17:01:34 -05:00
} else {
secondary_clock - > hide ( ) ;
secondary_clock - > left_btn ( ) - > hide ( ) ;
secondary_clock - > right_btn ( ) - > hide ( ) ;
2016-12-21 17:36:00 -05:00
if ( secondary_clock_spacer ) {
secondary_clock_spacer - > hide ( ) ;
}
2016-12-21 17:01:34 -05:00
}
}
2016-12-11 11:24:30 -05:00
void
ARDOUR_UI : : setup_transport ( )
{
RefPtr < Action > act ;
/* setup actions */
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 ) ;
2017-01-19 13:12:25 -05:00
click_button . signal_scroll_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : click_button_scroll ) , false ) ;
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 " ) ) ;
2016-12-19 13:21:38 -05:00
2011-11-10 10:25:01 -05:00
sync_button . set_related_action ( act ) ;
2016-12-19 13:21:38 -05:00
sync_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : sync_button_clicked ) , false ) ;
2012-02-02 23:18:30 -05:00
2016-12-18 17:17:29 -05:00
sync_button . set_sizing_text ( S_ ( " LogestSync|M-Clk " ) ) ;
2016-12-18 12:16:21 -05:00
2009-12-11 18:29:48 -05:00
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
2015-10-02 07:32:49 -04:00
act = ActionManager : : get_action ( X_ ( " Main " ) , X_ ( " cancel-solo " ) ) ;
solo_alert_button . set_related_action ( act ) ;
2016-12-11 11:24:30 -05:00
auditioning_alert_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : audition_alert_clicked ) ) ;
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
2016-12-12 15:48:29 -05:00
layered_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : layered_button_clicked ) ) ;
2016-12-11 11:24:30 -05:00
editor_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-editor-visibility " ) ) ) ;
mixer_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-mixer-visibility " ) ) ) ;
prefs_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-preferences-visibility " ) ) ) ;
2005-09-25 14:42:24 -04:00
2016-12-11 11:24:30 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoReturn " ) ;
auto_return_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
follow_edits_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( " Transport " , " ToggleAutoInput " ) ;
auto_input_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2016-12-11 11:24:30 -05:00
act = ActionManager : : get_action ( " Transport " , " TogglePunchIn " ) ;
punch_in_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( " Transport " , " TogglePunchOut " ) ;
punch_out_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2017-01-16 13:54:20 -05:00
act = ActionManager : : get_action ( " Transport " , " SessionMonitorIn " ) ;
monitor_in_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( " Transport " , " SessionMonitorDisk " ) ;
monitor_disk_button . set_related_action ( act ) ;
2016-12-11 11:24:30 -05:00
/* connect signals */
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( primary_clock , & AudioClock : : set ) ) ;
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( secondary_clock , & AudioClock : : set ) ) ;
2015-04-18 13:42:00 -04:00
2016-12-11 11:24:30 -05: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 ) ) ;
2012-12-06 15:48:44 -05:00
2016-12-11 11:24:30 -05:00
editor_visibility_button . signal_drag_failed ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( drag_failed ) , editor ) ) ;
mixer_visibility_button . signal_drag_failed ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( drag_failed ) , mixer ) ) ;
prefs_visibility_button . signal_drag_failed ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( drag_failed ) , rc_option_editor ) ) ;
2005-09-25 14:42:24 -04:00
2016-12-11 11:24:30 -05:00
/* catch context clicks so that we can show a menu on these buttons */
2005-09-25 14:42:24 -04:00
2016-12-11 11:24:30 -05:00
editor_visibility_button . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_visibility_button_press ) , X_ ( " editor " ) ) , false ) ;
mixer_visibility_button . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_visibility_button_press ) , X_ ( " mixer " ) ) , false ) ;
prefs_visibility_button . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_visibility_button_press ) , X_ ( " preferences " ) ) , false ) ;
2011-11-07 15:06:13 -05:00
2016-12-11 11:24:30 -05:00
/* setup widget style/name */
2011-11-07 15:06:13 -05:00
2016-12-11 11:24:30 -05:00
auto_return_button . set_name ( " transport option button " ) ;
follow_edits_button . set_name ( " transport option button " ) ;
2014-04-10 04:16:13 -04:00
2016-12-11 11:24:30 -05:00
solo_alert_button . set_name ( " rude solo " ) ;
auditioning_alert_button . set_name ( " rude audition " ) ;
feedback_alert_button . set_name ( " feedback alert " ) ;
error_alert_button . set_name ( " error alert " ) ;
2011-11-07 15:06:13 -05:00
2016-12-11 11:24:30 -05:00
solo_alert_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
auditioning_alert_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
feedback_alert_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
2011-04-19 22:48:20 -04:00
2016-12-11 11:24:30 -05:00
solo_alert_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
auditioning_alert_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
feedback_alert_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
2011-11-07 15:06:13 -05:00
2016-12-11 11:24:30 -05:00
editor_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
mixer_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
prefs_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
2011-11-07 15:06:13 -05:00
2016-12-11 11:24:30 -05:00
punch_in_button . set_name ( " punch button " ) ;
punch_out_button . set_name ( " punch button " ) ;
2016-12-12 15:48:29 -05:00
layered_button . set_name ( ( " layered button " ) ) ;
2006-08-01 18:58:24 -04:00
2017-01-18 06:25:02 -05:00
monitor_in_button . set_name ( " monitor button " ) ;
monitor_disk_button . set_name ( " monitor button " ) ;
2017-01-16 13:54:20 -05:00
auto_input_button . set_name ( " transport option button " ) ;
2016-12-11 11:24:30 -05:00
click_button . set_name ( " transport button " ) ;
sync_button . set_name ( " transport active option button " ) ;
2011-11-17 17:49:13 -05:00
2016-12-11 11:24:30 -05:00
/* and widget text */
auto_return_button . set_text ( _ ( " Auto Return " ) ) ;
2016-12-19 13:22:39 -05:00
follow_edits_button . set_text ( _ ( " Follow Range " ) ) ;
2016-12-11 11:24:30 -05:00
punch_in_button . set_text ( _ ( " In " ) ) ;
punch_out_button . set_text ( _ ( " Out " ) ) ;
layered_button . set_text ( _ ( " Non-Layered " ) ) ;
2008-01-10 16:20:59 -05:00
2017-01-16 13:54:20 -05:00
monitor_in_button . set_text ( _ ( " All In " ) ) ;
monitor_disk_button . set_text ( _ ( " All Disk " ) ) ;
auto_input_button . set_text ( _ ( " Auto-Input " ) ) ;
2016-12-18 14:29:19 -05:00
punch_label . set_text ( _ ( " Punch: " ) ) ;
layered_label . set_text ( _ ( " Rec: " ) ) ;
2015-10-05 10:17:49 -04:00
2016-12-11 11:24:30 -05:00
/* and tooltips */
2014-04-10 13:30:25 -04:00
2016-12-11 11:24:30 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( editor_visibility_button ,
string_compose ( _ ( " Drag this tab to the desktop to show %1 in its own window \n \n "
2017-01-18 19:25:13 -05:00
" To re-attach the window, use the Window > %1 > Attach menu action " ) , editor - > name ( ) ) ) ;
2014-04-10 13:30:25 -04:00
2016-12-11 11:24:30 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( mixer_visibility_button ,
string_compose ( _ ( " Drag this tab to the desktop to show %1 in its own window \n \n "
2017-01-18 19:25:13 -05:00
" To re-attach the window, use the Window > %1 > Attach menu action " ) , mixer - > name ( ) ) ) ;
2014-04-10 13:30:25 -04:00
2016-12-11 11:24:30 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( prefs_visibility_button ,
string_compose ( _ ( " Drag this tab to the desktop to show %1 in its own window \n \n "
2017-01-18 19:25:13 -05:00
" To re-attach the window, use the Window > %1 > Attach menu action " ) , rc_option_editor - > name ( ) ) ) ;
2011-06-09 17:51:15 -04:00
2016-12-11 11:24:30 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( punch_in_button , _ ( " Start recording at auto-punch start " ) ) ;
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( punch_out_button , _ ( " Stop recording at auto-punch end " ) ) ;
2011-11-09 12:29:23 -05:00
2017-01-18 19:25:13 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( monitor_in_button , _ ( " Force all tracks to monitor Input, unless they are explicitly set to monitor Disk " ) ) ;
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( monitor_disk_button , _ ( " Force all tracks to monitor Disk playback, unless they are explicitly set to Input " ) ) ;
2017-01-16 13:54:20 -05:00
2016-12-11 11:24:30 -05:00
/* setup icons */
2011-11-09 12:29:23 -05:00
2016-12-11 11:24:30 -05:00
click_button . set_icon ( ArdourIcon : : TransportMetronom ) ;
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 ) ;
2011-06-09 11:44:09 -04:00
2016-12-11 11:24:30 -05:00
/* transport control size-group */
2011-06-03 18:18:47 -04:00
2016-12-11 11:24: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 ) ;
transport_button_size_group - > add_widget ( stop_button ) ;
2014-04-10 13:30:25 -04:00
2016-12-11 11:24:30 -05:00
Glib : : RefPtr < SizeGroup > punch_button_size_group = SizeGroup : : create ( Gtk : : SIZE_GROUP_HORIZONTAL ) ;
punch_button_size_group - > add_widget ( punch_in_button ) ;
punch_button_size_group - > add_widget ( punch_out_button ) ;
2009-10-14 12:10:01 -04:00
2017-01-16 13:54:20 -05:00
Glib : : RefPtr < SizeGroup > monitor_button_size_group = SizeGroup : : create ( Gtk : : SIZE_GROUP_HORIZONTAL ) ;
monitor_button_size_group - > add_widget ( monitor_in_button ) ;
monitor_button_size_group - > add_widget ( monitor_disk_button ) ;
2016-12-11 11:24:30 -05:00
/* and now the layout... */
2016-02-25 11:08:33 -05:00
2016-12-11 11:24:30 -05:00
/* top level packing */
transport_table . set_spacings ( 0 ) ;
2016-12-18 10:02:13 -05:00
transport_table . set_row_spacings ( 4 ) ;
2016-12-17 23:32:38 -05:00
transport_table . set_border_width ( 2 ) ;
2017-01-05 17:22:05 -05:00
2017-01-05 11:01:11 -05:00
transport_frame . set_name ( " TransportFrame " ) ;
2016-12-18 10:02:13 -05:00
transport_frame . set_shadow_type ( Gtk : : SHADOW_NONE ) ;
2016-02-25 11:08:33 -05:00
2017-01-05 17:22:05 -05:00
/* An event box to hold the table. We use this because we want specific
control over the background color , and without this event box ,
nothing inside the transport_frame actually draws a background . We
would therefore end up seeing the background of the parent widget ,
which is probably some default color . Adding the EventBox adds a
2017-02-08 16:24:17 -05:00
widget that will draw the background , using a style based on
2017-01-05 17:22:05 -05:00
the parent , " TransportFrame " .
*/
Gtk : : EventBox * ebox = manage ( new Gtk : : EventBox ) ;
transport_frame . add ( * ebox ) ;
ebox - > add ( transport_table ) ;
2016-12-11 11:24:30 -05:00
/* transport controls sub-group */
click_button . set_size_request ( PX_SCALE ( 20 ) , PX_SCALE ( 20 ) ) ;
2016-02-25 11:08:33 -05:00
2016-12-11 11:24:30 -05:00
HBox * tbox = manage ( new HBox ) ;
2016-12-18 10:02:13 -05:00
tbox - > set_spacing ( PX_SCALE ( 2 ) ) ;
2016-12-11 11:24:30 -05:00
tbox - > pack_start ( midi_panic_button , true , true , 0 ) ;
tbox - > pack_start ( click_button , true , true , 0 ) ;
tbox - > pack_start ( goto_start_button , true , true ) ;
tbox - > pack_start ( goto_end_button , true , true ) ;
tbox - > pack_start ( auto_loop_button , true , true ) ;
tbox - > pack_start ( play_selection_button , true , true ) ;
tbox - > pack_start ( roll_button , true , true ) ;
tbox - > pack_start ( stop_button , true , true ) ;
tbox - > pack_start ( rec_button , true , true , 3 ) ;
/* alert box sub-group */
VBox * alert_box = manage ( new VBox ) ;
alert_box - > set_homogeneous ( true ) ;
alert_box - > set_spacing ( 1 ) ;
2016-12-16 19:43:24 -05:00
alert_box - > set_border_width ( 0 ) ;
2017-02-08 16:23:43 -05: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 ) ;
2016-12-11 11:24:30 -05:00
/* clock button size groups */
Glib : : RefPtr < SizeGroup > button_height_size_group = SizeGroup : : create ( Gtk : : SIZE_GROUP_VERTICAL ) ;
button_height_size_group - > add_widget ( follow_edits_button ) ;
button_height_size_group - > add_widget ( * primary_clock - > left_btn ( ) ) ;
button_height_size_group - > add_widget ( * primary_clock - > right_btn ( ) ) ;
button_height_size_group - > add_widget ( * secondary_clock - > left_btn ( ) ) ;
button_height_size_group - > add_widget ( * secondary_clock - > right_btn ( ) ) ;
2016-12-17 23:32:38 -05:00
button_height_size_group - > add_widget ( stop_button ) ;
2016-12-18 10:02:13 -05:00
// button_height_size_group->add_widget (sync_button);
2016-12-17 23:32:38 -05:00
button_height_size_group - > add_widget ( auto_return_button ) ;
2017-02-08 16:24:17 -05:00
2017-01-18 09:28:25 -05:00
//tab selections
2016-12-17 23:32:38 -05:00
button_height_size_group - > add_widget ( editor_visibility_button ) ;
button_height_size_group - > add_widget ( mixer_visibility_button ) ;
2017-01-18 09:28:25 -05:00
//punch section
button_height_size_group - > add_widget ( punch_in_button ) ;
button_height_size_group - > add_widget ( punch_out_button ) ;
button_height_size_group - > add_widget ( layered_button ) ;
//input monitoring section
button_height_size_group - > add_widget ( monitor_in_button ) ;
button_height_size_group - > add_widget ( monitor_disk_button ) ;
button_height_size_group - > add_widget ( auto_input_button ) ;
2017-01-18 11:21:11 -05:00
Glib : : RefPtr < SizeGroup > clock1_size_group = SizeGroup : : create ( SIZE_GROUP_HORIZONTAL ) ;
2016-12-11 11:24:30 -05:00
clock1_size_group - > add_widget ( * primary_clock - > left_btn ( ) ) ;
clock1_size_group - > add_widget ( * primary_clock - > right_btn ( ) ) ;
2017-01-18 11:21:11 -05:00
Glib : : RefPtr < SizeGroup > clock2_size_group = SizeGroup : : create ( SIZE_GROUP_HORIZONTAL ) ;
2016-12-11 11:24:30 -05:00
clock2_size_group - > add_widget ( * secondary_clock - > left_btn ( ) ) ;
clock2_size_group - > add_widget ( * secondary_clock - > right_btn ( ) ) ;
2016-12-18 17:20:14 -05:00
/* sub-layout for Sync | Shuttle (grow) */
HBox * ssbox = manage ( new HBox ) ;
ssbox - > set_spacing ( PX_SCALE ( 2 ) ) ;
ssbox - > pack_start ( sync_button , false , false , 0 ) ;
2016-12-19 18:00:14 -05:00
ssbox - > pack_start ( shuttle_box , true , true , 0 ) ;
ssbox - > pack_start ( * shuttle_box . info_button ( ) , false , false , 0 ) ;
2016-12-18 17:20:14 -05:00
2016-12-11 11:24:30 -05:00
/* and the main table layout */
2017-02-16 15:37:56 -05:00
int vpadding = 1 ;
int hpadding = 2 ;
2016-12-18 17:20:14 -05:00
int col = 0 ;
# define TCOL col, col + 1
transport_table . attach ( * tbox , TCOL , 0 , 1 , SHRINK , SHRINK , 0 , 0 ) ;
transport_table . attach ( * ssbox , TCOL , 1 , 2 , FILL , SHRINK , 0 , 0 ) ;
+ + col ;
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-12-11 11:24:30 -05:00
2016-12-18 17:20:14 -05:00
transport_table . attach ( punch_label , TCOL , 0 , 1 , FILL , SHRINK , 3 , 0 ) ;
transport_table . attach ( layered_label , TCOL , 1 , 2 , FILL , SHRINK , 3 , 0 ) ;
+ + col ;
2016-12-18 14:29:19 -05:00
2017-02-16 15:37:56 -05:00
transport_table . attach ( punch_in_button , col , col + 1 , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( punch_space , col + 1 , col + 2 , 0 , 1 , FILL , SHRINK , 0 , vpadding ) ;
transport_table . attach ( punch_out_button , col + 2 , col + 3 , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( layered_button , col , col + 3 , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
2017-01-16 13:54:20 -05:00
col + = 3 ;
2017-01-16 15:58:53 -05:00
transport_table . attach ( recpunch_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
2017-01-16 13:54:20 -05:00
+ + col ;
2017-02-16 15:37:56 -05:00
transport_table . attach ( auto_input_button , col , col + 3 , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( monitor_in_button , col , col + 1 , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( mon_space , col + 1 , col + 2 , 1 , 2 , FILL , SHRINK , 2 , vpadding ) ;
transport_table . attach ( monitor_disk_button , col + 2 , col + 3 , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
2016-12-18 18:14:02 -05:00
col + = 3 ;
2016-12-11 11:24:30 -05:00
2017-01-16 15:58:53 -05:00
transport_table . attach ( monitoring_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
2016-12-18 17:20:14 -05:00
+ + col ;
2016-12-11 11:24:30 -05:00
2017-02-16 15:37:56 -05:00
transport_table . attach ( follow_edits_button , TCOL , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( auto_return_button , TCOL , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
2016-12-18 17:20:14 -05:00
+ + col ;
2016-12-11 11:24:30 -05:00
2016-12-18 17:20:14 -05:00
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-12-11 11:24:30 -05:00
2017-02-16 15:37:56 -05:00
transport_table . attach ( * primary_clock , col , col + 2 , 0 , 1 , FILL , SHRINK , hpadding , 0 ) ;
transport_table . attach ( * primary_clock - > left_btn ( ) , col , col + 1 , 1 , 2 , FILL , SHRINK , hpadding , 0 ) ;
transport_table . attach ( * primary_clock - > right_btn ( ) , col + 1 , col + 2 , 1 , 2 , FILL , SHRINK , hpadding , 0 ) ;
2016-12-18 17:20:14 -05:00
col + = 2 ;
2016-12-18 14:29:19 -05:00
2016-12-18 17:20:14 -05:00
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-12-11 11:24:30 -05:00
if ( ! ARDOUR : : Profile - > get_small_screen ( ) ) {
2017-02-16 15:37:56 -05:00
transport_table . attach ( * secondary_clock , col , col + 2 , 0 , 1 , FILL , SHRINK , hpadding , 0 ) ;
transport_table . attach ( * secondary_clock - > left_btn ( ) , col , col + 1 , 1 , 2 , FILL , SHRINK , hpadding , 0 ) ;
transport_table . attach ( * secondary_clock - > right_btn ( ) , col + 1 , col + 2 , 1 , 2 , FILL , SHRINK , hpadding , 0 ) ;
2016-12-21 17:01:34 -05:00
secondary_clock - > set_no_show_all ( true ) ;
secondary_clock - > left_btn ( ) - > set_no_show_all ( true ) ;
secondary_clock - > right_btn ( ) - > set_no_show_all ( true ) ;
2016-12-18 17:20:14 -05:00
col + = 2 ;
2016-02-25 11:08:33 -05:00
2016-12-21 17:01:34 -05:00
secondary_clock_spacer = manage ( new ArdourVSpacer ( ) ) ;
transport_table . attach ( * secondary_clock_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
}
2016-12-18 14:29:19 -05:00
2017-02-16 15:37:56 -05:00
transport_table . attach ( * alert_box , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
2016-12-18 17:20:14 -05:00
+ + col ;
2016-12-18 14:29:19 -05:00
2016-12-18 17:20:14 -05:00
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-02-25 11:08:33 -05:00
2016-12-19 21:11:21 -05:00
/* editor-meter, mini-timeline and selection clock are options in the transport_hbox */
transport_hbox . set_spacing ( 3 ) ;
2017-02-16 15:37:56 -05:00
transport_table . attach ( transport_hbox , TCOL , 0 , 2 , EXPAND | FILL , EXPAND | FILL , hpadding , 0 ) ;
2016-12-18 17:20:14 -05:00
+ + col ;
2016-02-25 11:08:33 -05:00
2016-12-16 19:43:24 -05:00
/* lua script action buttons */
2016-12-18 17:20:14 -05:00
transport_table . attach ( action_script_table , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 1 , 0 ) ;
+ + col ;
2016-12-11 11:24:30 -05:00
2017-02-16 15:37:56 -05:00
transport_table . attach ( editor_visibility_button , TCOL , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( mixer_visibility_button , TCOL , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
2016-12-18 17:20:14 -05:00
+ + col ;
2016-12-16 19:43:09 -05:00
2016-12-19 21:11:21 -05:00
repack_transport_hbox ( ) ;
2016-12-21 17:01:34 -05:00
update_clock_visibility ( ) ;
2011-11-09 12:29:23 -05:00
/* desensitize */
2016-12-11 11:24:30 -05:00
feedback_alert_button . set_sensitive ( false ) ;
feedback_alert_button . set_visual_state ( Gtkmm2ext : : NoVisualState ) ;
auditioning_alert_button . set_sensitive ( false ) ;
auditioning_alert_button . set_visual_state ( Gtkmm2ext : : NoVisualState ) ;
stop_button . set_active ( true ) ;
2011-11-09 12:29:23 -05:00
set_transport_sensitivity ( false ) ;
2005-09-25 14:42:24 -04:00
}
2015-04-18 13:42:00 -04:00
# undef PX_SCALE
2016-12-18 17:20:14 -05:00
# undef TCOL
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 ) ;
2016-12-11 11:24:30 -05:00
auditioning_alert_button . set_sensitive ( onoff ) ;
if ( ! onoff ) {
auditioning_alert_button . set_visual_state ( Gtkmm2ext : : NoVisualState ) ;
}
2011-11-14 17:59:40 -05:00
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
}
2016-12-11 11:24:30 -05:00
void
ARDOUR_UI : : audition_alert_clicked ( )
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
}
2011-11-11 08:52:27 -05:00
}
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
}
2016-12-12 15:48:29 -05:00
void
ARDOUR_UI : : layered_button_clicked ( )
{
if ( _session ) {
_session - > config . set_layered_record_mode ( ! _session - > config . get_layered_record_mode ( ) ) ;
}
}
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
}
}
2017-01-28 06:04:31 -05:00
void
ARDOUR_UI : : set_loop_sensitivity ( )
{
if ( ! _session | | _session - > config . get_external_sync ( ) ) {
auto_loop_button . set_sensitive ( false ) ;
} else {
auto_loop_button . set_sensitive ( _session & & _session - > locations ( ) - > auto_loop_location ( ) ) ;
}
}
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 ) ;
2016-12-19 18:00:14 -05: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 : : 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 ( )
{
2015-07-27 17:12:35 -04:00
if ( rc_option_editor ) {
show_tabbable ( rc_option_editor ) ;
2017-01-03 04:05:05 -05:00
rc_option_editor - > set_current_page ( _ ( " Appearance " ) ) ;
2015-07-27 17:12:35 -04:00
}
2014-07-14 13:19:52 -04:00
}
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 ;
}
2015-07-27 17:12:35 -04:00
show_tabbable ( rc_option_editor ) ;
2017-01-03 04:05:05 -05:00
rc_option_editor - > set_current_page ( _ ( " Metronome " ) ) ;
2011-02-17 13:53:31 -05:00
return true ;
}
2011-12-01 18:22:05 -05:00
2017-01-19 13:12:25 -05:00
bool
ARDOUR_UI : : click_button_scroll ( GdkEventScroll * ev )
{
gain_t gain = Config - > get_click_gain ( ) ;
float gain_db = accurate_coefficient_to_dB ( gain ) ;
switch ( ev - > direction ) {
case GDK_SCROLL_UP :
case GDK_SCROLL_LEFT :
gain_db + = 1 ;
break ;
case GDK_SCROLL_DOWN :
case GDK_SCROLL_RIGHT :
gain_db - = 1 ;
break ;
}
gain_db = std : : max ( - 60.f , gain_db ) ;
gain = dB_to_coefficient ( gain_db ) ;
gain = std : : min ( gain , Config - > get_max_gain ( ) ) ;
Config - > set_click_gain ( gain ) ;
return true ;
}
2016-12-19 13:21:38 -05:00
bool
ARDOUR_UI : : sync_button_clicked ( GdkEventButton * ev )
{
if ( ev - > button ! = 3 ) {
/* this handler is just for button-3 clicks */
return false ;
}
show_tabbable ( rc_option_editor ) ;
2017-01-03 04:05:05 -05:00
rc_option_editor - > set_current_page ( _ ( " Sync " ) ) ;
2016-12-19 13:21:38 -05:00
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-07-09 13:56:12 -04:00
void
ARDOUR_UI : : update_title ( )
{
if ( _session ) {
bool dirty = _session - > dirty ( ) ;
2015-10-05 10:17:49 -04:00
2015-07-09 13:56:12 -04:00
string session_name ;
if ( _session - > snap_name ( ) ! = _session - > name ( ) ) {
session_name = _session - > snap_name ( ) ;
} else {
session_name = _session - > name ( ) ;
}
if ( dirty ) {
session_name = " * " + session_name ;
}
WindowTitle title ( session_name ) ;
title + = Glib : : get_application_name ( ) ;
_main_window . set_title ( title . get_string ( ) ) ;
} else {
WindowTitle title ( Glib : : get_application_name ( ) ) ;
_main_window . set_title ( title . get_string ( ) ) ;
}
2015-07-23 08:35:24 -04:00
2015-07-09 13:56:12 -04:00
}