2005-09-25 18:42:24 +00:00
/*
2019-08-02 23:26:43 +02:00
* Copyright ( C ) 2005 - 2006 Taybin Rutkin < taybin @ taybin . com >
* Copyright ( C ) 2005 - 2015 Tim Mayberry < mojofunk @ gmail . com >
* Copyright ( C ) 2005 - 2018 Paul Davis < paul @ linuxaudiosystems . com >
* Copyright ( C ) 2006 - 2007 Doug McLain < doug @ nostar . net >
* Copyright ( C ) 2006 - 2012 David Robillard < d @ drobilla . net >
* Copyright ( C ) 2006 Karsten Wiese < fzuuzf @ googlemail . com >
* Copyright ( C ) 2006 Nick Mainsbridge < mainsbridge @ gmail . com >
* Copyright ( C ) 2007 - 2012 Carl Hetherington < carl @ carlh . net >
* Copyright ( C ) 2008 Hans Baier < hansfbaier @ googlemail . com >
* Copyright ( C ) 2012 - 2019 Robin Gareus < robin @ gareus . org >
* Copyright ( C ) 2014 - 2018 Ben Loftis < ben @ harrisonconsoles . com >
*
* 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 . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
*/
2005-09-25 18:42:24 +00:00
2010-11-13 05:14:48 +00:00
# ifdef WAF_BUILD
# include "gtk2ardour-config.h"
# endif
2005-09-25 18:42:24 +00:00
# include <fcntl.h>
# include <signal.h>
# include <unistd.h>
# include <cerrno>
# include <iostream>
# include <cmath>
2005-10-10 20:38:53 +00:00
# include <sigc++/bind.h>
2017-07-17 03:48:18 +02:00
# include <gtkmm/settings.h>
2016-05-02 20:24:54 +02:00
# include "canvas/canvas.h"
2009-02-25 18:26:51 +00:00
# include "pbd/error.h"
# include "pbd/basename.h"
# include "pbd/fastlog.h"
2015-07-09 13:56:12 -04:00
# include "gtkmm2ext/utils.h"
# include "gtkmm2ext/window_title.h"
2005-09-25 18:42:24 +00:00
2020-04-07 00:09:38 +02:00
# include "ardour/audioengine.h"
2009-02-25 18:26:51 +00:00
# include "ardour/profile.h"
2012-05-24 06:09:29 +00:00
# include "ardour/session.h"
# include "ardour/types.h"
2005-09-25 18:42:24 +00:00
# include "ardour_ui.h"
2007-02-09 03:36:00 +00:00
# include "keyboard.h"
2005-09-25 18:42:24 +00:00
# include "public_editor.h"
# include "audio_clock.h"
2005-11-28 15:29:49 +00:00
# include "actions.h"
2012-05-31 23:14:03 +00:00
# include "main_clock.h"
2016-02-25 11:08:33 -05:00
# include "mixer_ui.h"
2005-10-10 20:38:53 +00:00
# include "utils.h"
2016-12-20 03:11:21 +01:00
# include "time_info_box.h"
2010-07-07 00:40:58 +00:00
# include "midi_tracer.h"
2010-08-18 02:20:15 +00:00
# include "global_port_matrix.h"
# include "location_ui.h"
2011-02-17 18:53:31 +00:00
# include "rc_option_editor.h"
2005-09-25 18:42:24 +00:00
2016-07-14 14:44:52 -04:00
# include "pbd/i18n.h"
2005-09-25 18:42:24 +00:00
using namespace std ;
using namespace ARDOUR ;
2006-06-21 23:01:03 +00:00
using namespace PBD ;
2005-09-25 20:33:00 +00:00
using namespace Gtkmm2ext ;
2017-07-15 17:38:28 +02:00
using namespace ArdourWidgets ;
2005-09-25 18:42:24 +00:00
using namespace Gtk ;
2005-12-05 04:11:08 +00:00
using namespace Glib ;
2014-06-25 21:27:37 +02:00
using namespace ARDOUR_UI_UTILS ;
2005-09-25 18:42:24 +00:00
2010-02-09 00:50:24 +00:00
void
ARDOUR_UI : : setup_tooltips ( )
{
2016-05-02 20:24:54 +02:00
ArdourCanvas : : Canvas : : set_tooltip_timeout ( Gtk : : Settings : : get_default ( ) - > property_gtk_tooltip_timeout ( ) ) ;
2015-06-25 12:47:29 -04:00
set_tip ( auto_return_button , _ ( " Return to last playback start when stopped " ) ) ;
2016-12-19 12:22:39 -06:00
set_tip ( follow_edits_button , _ ( " Playhead follows Range tool clicks, and Range selections " ) ) ;
2017-01-16 19:54:20 +01:00
set_tip ( auto_input_button , _ ( " Track Input Monitoring automatically follows transport state " ) ) ;
2017-01-20 17:06:44 -06:00
parameter_changed ( " click-gain " ) ;
2010-02-09 00:50:24 +00:00
set_tip ( solo_alert_button , _ ( " When active, something is soloed. \n Click to de-solo everything " ) ) ;
2015-11-29 20:17:11 +01:00
set_tip ( auditioning_alert_button , _ ( " When active, auditioning is taking place. \n Click to stop the audition " ) ) ;
2011-11-11 13:52:27 +00:00
set_tip ( feedback_alert_button , _ ( " When active, there is a feedback loop. " ) ) ;
2013-03-09 13:50:02 +00: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 " ) ) ;
2019-06-04 14:56:50 +02:00
set_tip ( editor_meter_peak_display , _ ( " Reset All Peak Meters " ) ) ;
2015-03-16 19:04:17 +01:00
set_tip ( error_alert_button , _ ( " Show Error Log and acknowledge warnings " ) ) ;
2010-02-09 00:50:24 +00:00
2020-01-13 11:38:35 -06:00
set_tip ( latency_disable_button , _ ( " Disable all Plugin Delay Compensation. This results in the shortest delay from live input to output, but any paths with delay-causing plugins will sound later than those without. " ) ) ;
2019-09-29 01:23:48 +02:00
2010-11-25 20:37:39 +00:00
synchronize_sync_source_and_video_pullup ( ) ;
2010-08-31 01:49:33 +00:00
2010-02-09 00:50:24 +00:00
editor - > setup_tooltips ( ) ;
}
2010-04-21 02:24:38 +00: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 ;
}
2018-02-20 11:06:37 +01:00
void
ARDOUR_UI : : display_message ( const char * prefix , gint prefix_len , RefPtr < TextBuffer : : Tag > ptag , RefPtr < TextBuffer : : Tag > mtag , const char * msg )
{
UI : : display_message ( prefix , prefix_len , ptag , mtag , msg ) ;
ArdourLogLevel ll = LogLevelNone ;
if ( strcmp ( prefix , _ ( " [ERROR]: " ) ) = = 0 ) {
ll = LogLevelError ;
} else if ( strcmp ( prefix , _ ( " [WARNING]: " ) ) = = 0 ) {
ll = LogLevelWarning ;
} else if ( strcmp ( prefix , _ ( " [INFO]: " ) ) = = 0 ) {
ll = LogLevelInfo ;
}
_log_not_acknowledged = std : : max ( _log_not_acknowledged , ll ) ;
}
2010-03-19 20:53:22 +00:00
XMLNode *
ARDOUR_UI : : tearoff_settings ( const char * name ) const
{
2010-11-25 20:37:39 +00:00
XMLNode * ui_node = Config - > extra_xml ( X_ ( " UI " ) ) ;
2011-06-01 17:00:29 +00:00
2010-11-25 20:37:39 +00: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 20:53:22 +00:00
}
2015-01-02 21:44:54 +07:00
# define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
2015-04-18 19:42:00 +02: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-20 03:11:21 +01: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 ) {
2018-02-14 14:47:00 -06:00
if ( editor_meter_table . get_parent ( ) ) {
transport_hbox . remove ( editor_meter_table ) ;
}
if ( meterbox_spacer . get_parent ( ) ) {
transport_hbox . remove ( meterbox_spacer ) ;
2018-02-14 15:05:49 -06:00
transport_hbox . remove ( meterbox_spacer2 ) ;
2016-12-20 03:11:21 +01:00
}
if ( UIConfiguration : : instance ( ) . get_show_editor_meter ( ) ) {
2018-02-14 14:47:00 -06:00
transport_hbox . pack_end ( meterbox_spacer , false , false , 3 ) ;
2018-02-14 15:05:49 -06:00
transport_hbox . pack_end ( editor_meter_table , false , false ) ;
transport_hbox . pack_end ( meterbox_spacer2 , false , false , 3 ) ;
2018-02-14 14:47:00 -06:00
editor_meter_table . show ( ) ;
meterbox_spacer . show ( ) ;
2018-02-14 15:05:49 -06:00
meterbox_spacer2 . show ( ) ;
2016-12-20 03:11:21 +01:00
}
}
2017-01-16 21:58:53 +01: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 ( ) ;
}
2019-09-29 01:23:48 +02:00
bool show_pdc = UIConfiguration : : instance ( ) . get_show_toolbar_latency ( ) ;
if ( show_pdc ) {
latency_disable_button . show ( ) ;
route_latency_value . show ( ) ;
2019-09-29 16:59:18 +02:00
io_latency_label . show ( ) ;
2019-09-29 01:23:48 +02:00
io_latency_value . show ( ) ;
latency_spacer . show ( ) ;
} else {
latency_disable_button . hide ( ) ;
route_latency_value . hide ( ) ;
2019-09-29 16:59:18 +02:00
io_latency_label . hide ( ) ;
2019-09-29 01:23:48 +02:00
io_latency_value . hide ( ) ;
latency_spacer . hide ( ) ;
}
2016-12-20 03:11:21 +01:00
}
2016-12-21 23:01:34 +01: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 23:36:00 +01:00
if ( secondary_clock_spacer ) {
secondary_clock_spacer - > show ( ) ;
}
2016-12-21 23:01:34 +01:00
} else {
secondary_clock - > hide ( ) ;
secondary_clock - > left_btn ( ) - > hide ( ) ;
secondary_clock - > right_btn ( ) - > hide ( ) ;
2016-12-21 23:36:00 +01:00
if ( secondary_clock_spacer ) {
secondary_clock_spacer - > hide ( ) ;
}
2016-12-21 23:01:34 +01:00
}
}
2016-12-11 17:24:30 +01:00
void
ARDOUR_UI : : setup_transport ( )
{
RefPtr < Action > act ;
/* setup actions */
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleExternalSync " ) ) ;
2011-11-10 15:25:01 +00:00
sync_button . set_related_action ( act ) ;
2016-12-19 19:21:38 +01:00
sync_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : sync_button_clicked ) , false ) ;
2012-02-03 04:18:30 +00:00
2016-12-18 23:17:29 +01:00
sync_button . set_sizing_text ( S_ ( " LogestSync|M-Clk " ) ) ;
2016-12-18 18:16:21 +01:00
2009-12-11 23:29:48 +00:00
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Main " ) , X_ ( " cancel-solo " ) ) ;
2015-10-02 07:32:49 -04:00
solo_alert_button . set_related_action ( act ) ;
2016-12-11 17:24:30 +01:00
auditioning_alert_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : audition_alert_clicked ) ) ;
2015-03-20 22:12:40 +01:00
error_alert_button . signal_button_release_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : error_alert_press ) , false ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
2015-03-17 02:05:02 +01:00
error_alert_button . set_related_action ( act ) ;
2015-03-17 11:59:30 +01:00
error_alert_button . set_fallthrough_to_parent ( true ) ;
2005-09-25 18:42:24 +00:00
2016-12-12 21:48:29 +01:00
layered_button . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : layered_button_clicked ) ) ;
2018-12-10 08:33:31 -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 18:42:24 +00:00
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoReturn " ) ;
2016-12-11 17:24:30 +01:00
auto_return_button . set_related_action ( act ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
2016-12-11 17:24:30 +01:00
follow_edits_button . set_related_action ( act ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoInput " ) ;
2016-12-11 17:24:30 +01:00
auto_input_button . set_related_action ( act ) ;
2012-02-03 04:18:30 +00:00
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " TogglePunchIn " ) ;
2016-12-11 17:24:30 +01:00
punch_in_button . set_related_action ( act ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " TogglePunchOut " ) ;
2016-12-11 17:24:30 +01:00
punch_out_button . set_related_action ( act ) ;
2012-02-03 04:18:30 +00:00
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " SessionMonitorIn " ) ;
2017-01-16 19:54:20 +01:00
monitor_in_button . set_related_action ( act ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " SessionMonitorDisk " ) ;
2017-01-16 19:54:20 +01:00
monitor_disk_button . set_related_action ( act ) ;
2019-09-29 01:23:48 +02:00
act = ActionManager : : get_action ( " Main " , " ToggleLatencyCompensation " ) ;
latency_disable_button . set_related_action ( act ) ;
set_size_request_to_display_given_text ( route_latency_value , " 1000 spl " , 0 , 0 ) ;
set_size_request_to_display_given_text ( io_latency_value , " 1000 spl " , 0 , 0 ) ;
2016-12-11 17:24:30 +01:00
/* connect signals */
2017-11-22 22:10:37 +01:00
ARDOUR_UI : : Clock . connect ( sigc : : bind ( sigc : : mem_fun ( primary_clock , & MainClock : : set ) , false , 0 ) ) ;
ARDOUR_UI : : Clock . connect ( sigc : : bind ( sigc : : mem_fun ( secondary_clock , & MainClock : : set ) , false , 0 ) ) ;
2015-04-18 19:42:00 +02:00
2016-12-11 17:24:30 +01: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 20:48:44 +00:00
2016-12-11 17:24:30 +01: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 18:42:24 +00:00
2016-12-11 17:24:30 +01:00
/* catch context clicks so that we can show a menu on these buttons */
2005-09-25 18:42:24 +00:00
2016-12-11 17:24:30 +01: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 20:06:13 +00:00
2016-12-11 17:24:30 +01:00
/* setup widget style/name */
2011-11-07 20:06:13 +00:00
2016-12-11 17:24:30 +01: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 17:24:30 +01: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 20:06:13 +00:00
2016-12-11 17:24:30 +01: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-20 02:48:20 +00:00
2016-12-11 17:24:30 +01: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 20:06:13 +00:00
2016-12-11 17:24:30 +01: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 20:06:13 +00:00
2016-12-11 17:24:30 +01:00
punch_in_button . set_name ( " punch button " ) ;
punch_out_button . set_name ( " punch button " ) ;
2016-12-12 21:48:29 +01:00
layered_button . set_name ( ( " layered button " ) ) ;
2006-08-01 22:58:24 +00:00
2017-01-18 12:25:02 +01:00
monitor_in_button . set_name ( " monitor button " ) ;
monitor_disk_button . set_name ( " monitor button " ) ;
2017-01-16 19:54:20 +01:00
auto_input_button . set_name ( " transport option button " ) ;
2019-09-29 01:57:15 +02:00
latency_disable_button . set_name ( " latency button " ) ;
2019-09-29 01:23:48 +02:00
2016-12-11 17:24:30 +01:00
sync_button . set_name ( " transport active option button " ) ;
2011-11-17 22:49:13 +00:00
2016-12-11 17:24:30 +01:00
/* and widget text */
auto_return_button . set_text ( _ ( " Auto Return " ) ) ;
2016-12-19 12:22:39 -06:00
follow_edits_button . set_text ( _ ( " Follow Range " ) ) ;
2016-12-11 17:24:30 +01:00
punch_in_button . set_text ( _ ( " In " ) ) ;
punch_out_button . set_text ( _ ( " Out " ) ) ;
layered_button . set_text ( _ ( " Non-Layered " ) ) ;
2008-01-10 21:20:59 +00:00
2017-01-16 19:54:20 +01:00
monitor_in_button . set_text ( _ ( " All In " ) ) ;
monitor_disk_button . set_text ( _ ( " All Disk " ) ) ;
auto_input_button . set_text ( _ ( " Auto-Input " ) ) ;
2019-09-29 01:23:48 +02:00
latency_disable_button . set_text ( _ ( " Disable PDC " ) ) ;
io_latency_label . set_text ( _ ( " I/O Latency: " ) ) ;
2016-12-18 13:29:19 -06:00
punch_label . set_text ( _ ( " Punch: " ) ) ;
layered_label . set_text ( _ ( " Rec: " ) ) ;
2015-10-05 16:17:49 +02:00
2016-12-11 17:24:30 +01:00
/* and tooltips */
2014-04-10 13:30:25 -04:00
2016-12-11 17:24:30 +01: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 18:25:13 -06: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 17:24:30 +01: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 18:25:13 -06: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 17:24:30 +01: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 18:25:13 -06:00
" To re-attach the window, use the Window > %1 > Attach menu action " ) , rc_option_editor - > name ( ) ) ) ;
2011-06-09 21:51:15 +00:00
2016-12-11 17:24:30 +01: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 17:29:23 +00:00
2017-01-18 18:25:13 -06: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 19:54:20 +01:00
2016-12-11 17:24:30 +01:00
/* transport control size-group */
2011-06-03 22:18:47 +00:00
2016-12-11 17:24:30 +01: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 16:10:01 +00:00
2017-01-16 19:54:20 +01: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 17:24:30 +01:00
/* and now the layout... */
2016-02-25 11:08:33 -05:00
2016-12-11 17:24:30 +01:00
/* top level packing */
transport_table . set_spacings ( 0 ) ;
2016-12-18 09:02:13 -06:00
transport_table . set_row_spacings ( 4 ) ;
2018-02-19 08:05:55 -06:00
transport_table . set_border_width ( 0 ) ;
2017-01-05 22:22:05 +00:00
2017-09-18 14:45:56 -04:00
transport_frame . set_name ( " TransportFrame " ) ;
transport_frame . set_shadow_type ( Gtk : : SHADOW_NONE ) ;
2016-02-25 11:08:33 -05:00
2017-01-05 22:22:05 +00: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 ,
2019-04-08 21:40:33 +02:00
nothing inside the transport_frame actually draws a background . We
2017-01-05 22:22:05 +00:00
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 22:24:17 +01:00
widget that will draw the background , using a style based on
2017-01-05 22:22:05 +00:00
the parent , " TransportFrame " .
*/
Gtk : : EventBox * ebox = manage ( new Gtk : : EventBox ) ;
2017-09-18 14:45:56 -04:00
transport_frame . add ( * ebox ) ;
2017-01-05 22:22:05 +00:00
ebox - > add ( transport_table ) ;
2016-12-11 17:24:30 +01:00
/* alert box sub-group */
VBox * alert_box = manage ( new VBox ) ;
alert_box - > set_homogeneous ( true ) ;
alert_box - > set_spacing ( 1 ) ;
2016-12-17 01:43:24 +01:00
alert_box - > set_border_width ( 0 ) ;
2017-02-08 22:23:43 +01: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 17:24:30 +01: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 ( ) ) ;
2017-12-22 20:20:59 +01:00
button_height_size_group - > add_widget ( transport_ctrl . size_button ( ) ) ;
2019-11-19 02:52:35 +01:00
button_height_size_group - > add_widget ( sync_button ) ;
2016-12-17 22:32:38 -06:00
button_height_size_group - > add_widget ( auto_return_button ) ;
2017-02-08 22:24:17 +01:00
2017-01-18 08:28:25 -06:00
//tab selections
2016-12-17 22:32:38 -06:00
button_height_size_group - > add_widget ( editor_visibility_button ) ;
button_height_size_group - > add_widget ( mixer_visibility_button ) ;
2017-01-18 08:28:25 -06: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 ) ;
2019-11-19 02:52:35 +01:00
// PDC
button_height_size_group - > add_widget ( latency_disable_button ) ;
2019-11-19 02:47:11 +01:00
for ( int i = 0 ; i < MAX_LUA_ACTION_BUTTONS ; + + i ) {
button_height_size_group - > add_widget ( action_script_call_btn [ i ] ) ;
}
2017-01-18 10:21:11 -06:00
Glib : : RefPtr < SizeGroup > clock1_size_group = SizeGroup : : create ( SIZE_GROUP_HORIZONTAL ) ;
2016-12-11 17:24:30 +01:00
clock1_size_group - > add_widget ( * primary_clock - > left_btn ( ) ) ;
clock1_size_group - > add_widget ( * primary_clock - > right_btn ( ) ) ;
2017-01-18 10:21:11 -06:00
Glib : : RefPtr < SizeGroup > clock2_size_group = SizeGroup : : create ( SIZE_GROUP_HORIZONTAL ) ;
2016-12-11 17:24:30 +01:00
clock2_size_group - > add_widget ( * secondary_clock - > left_btn ( ) ) ;
clock2_size_group - > add_widget ( * secondary_clock - > right_btn ( ) ) ;
2016-12-18 23:20:14 +01: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-20 00:00:14 +01:00
ssbox - > pack_start ( shuttle_box , true , true , 0 ) ;
ssbox - > pack_start ( * shuttle_box . info_button ( ) , false , false , 0 ) ;
2016-12-18 23:20:14 +01:00
2016-12-11 17:24:30 +01:00
/* and the main table layout */
2017-02-16 14:37:56 -06:00
int vpadding = 1 ;
int hpadding = 2 ;
2016-12-18 23:20:14 +01:00
int col = 0 ;
# define TCOL col, col + 1
2017-12-22 20:20:59 +01:00
transport_table . attach ( transport_ctrl , TCOL , 0 , 1 , SHRINK , SHRINK , 0 , 0 ) ;
2016-12-18 23:20:14 +01:00
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 17:24:30 +01:00
2016-12-18 23:20:14 +01: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 13:29:19 -06:00
2017-02-16 14:37:56 -06: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 19:54:20 +01:00
col + = 3 ;
2017-01-16 21:58:53 +01:00
transport_table . attach ( recpunch_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
2017-01-16 19:54:20 +01:00
+ + col ;
2017-02-16 14:37:56 -06: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 17:14:02 -06:00
col + = 3 ;
2016-12-11 17:24:30 +01:00
2017-01-16 21:58:53 +01:00
transport_table . attach ( monitoring_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
2016-12-18 23:20:14 +01:00
+ + col ;
2016-12-11 17:24:30 +01:00
2019-09-29 01:23:48 +02:00
transport_table . attach ( latency_disable_button , TCOL , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
2019-11-19 02:52:35 +01:00
transport_table . attach ( io_latency_label , TCOL , 1 , 2 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
2019-09-29 01:23:48 +02:00
+ + col ;
2019-11-19 02:52:35 +01:00
transport_table . attach ( route_latency_value , TCOL , 0 , 1 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
transport_table . attach ( io_latency_value , TCOL , 1 , 2 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
2019-09-29 01:23:48 +02:00
+ + col ;
route_latency_value . set_alignment ( Gtk : : ALIGN_RIGHT , Gtk : : ALIGN_CENTER ) ;
io_latency_value . set_alignment ( Gtk : : ALIGN_RIGHT , Gtk : : ALIGN_CENTER ) ;
transport_table . attach ( latency_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2017-02-16 14:37:56 -06: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 23:20:14 +01:00
+ + col ;
2016-12-11 17:24:30 +01:00
2016-12-18 23:20:14 +01:00
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-12-11 17:24:30 +01:00
2017-02-16 14:37:56 -06: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 23:20:14 +01:00
col + = 2 ;
2016-12-18 13:29:19 -06:00
2016-12-18 23:20:14 +01:00
transport_table . attach ( * ( manage ( new ArdourVSpacer ( ) ) ) , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2016-12-11 17:24:30 +01:00
if ( ! ARDOUR : : Profile - > get_small_screen ( ) ) {
2017-02-16 14:37:56 -06: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 23:01:34 +01: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 23:20:14 +01:00
col + = 2 ;
2016-02-25 11:08:33 -05:00
2016-12-21 23:01:34 +01: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 13:29:19 -06:00
2017-02-16 14:37:56 -06:00
transport_table . attach ( * alert_box , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
2016-12-18 23:20:14 +01:00
+ + col ;
2016-12-18 13:29:19 -06:00
2016-12-20 03:11:21 +01:00
/* editor-meter, mini-timeline and selection clock are options in the transport_hbox */
transport_hbox . set_spacing ( 3 ) ;
2017-02-16 14:37:56 -06:00
transport_table . attach ( transport_hbox , TCOL , 0 , 2 , EXPAND | FILL , EXPAND | FILL , hpadding , 0 ) ;
2016-12-18 23:20:14 +01:00
+ + col ;
2016-02-25 11:08:33 -05:00
2016-12-17 01:43:24 +01:00
/* lua script action buttons */
2019-11-19 02:47:11 +01:00
for ( int i = 0 ; i < MAX_LUA_ACTION_BUTTONS ; + + i ) {
const int r = i % 2 ;
const int c = col + i / 2 ;
transport_table . attach ( action_script_call_btn [ i ] , c , c + 1 , r , r + 1 , FILL , SHRINK , 1 , vpadding ) ;
}
col + = MAX_LUA_ACTION_BUTTONS / 2 ;
2016-12-11 17:24:30 +01:00
2017-02-16 14:37:56 -06: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 23:20:14 +01:00
+ + col ;
2016-12-17 01:43:09 +01:00
2019-09-29 01:23:48 +02:00
/* initialize */
latency_switch_changed ( ) ;
session_latency_updated ( ) ;
2016-12-20 03:11:21 +01:00
repack_transport_hbox ( ) ;
2016-12-21 23:01:34 +01:00
update_clock_visibility ( ) ;
2011-11-09 17:29:23 +00:00
/* desensitize */
2016-12-11 17:24:30 +01: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 ) ;
2011-11-09 17:29:23 +00:00
set_transport_sensitivity ( false ) ;
2005-09-25 18:42:24 +00:00
}
2015-04-18 19:42:00 +02:00
# undef PX_SCALE
2016-12-18 23:20:14 +01:00
# undef TCOL
2005-09-25 18:42:24 +00:00
2019-09-29 01:23:48 +02:00
void
ARDOUR_UI : : latency_switch_changed ( )
{
bool pdc_off = ARDOUR : : Latent : : zero_latency ( ) ;
if ( latency_disable_button . get_active ( ) ! = pdc_off ) {
latency_disable_button . set_active ( pdc_off ) ;
}
}
void
ARDOUR_UI : : session_latency_updated ( )
{
if ( ! _session ) {
route_latency_value . set_text ( " -- " ) ;
io_latency_value . set_text ( " -- " ) ;
} else {
samplecnt_t wrl = _session - > worst_route_latency ( ) ;
samplecnt_t wpl = _session - > worst_latency_preroll ( ) ;
float rate = _session - > nominal_sample_rate ( ) ;
route_latency_value . set_text ( samples_as_time_string ( wrl , rate ) ) ;
2020-04-07 00:09:38 +02:00
if ( _session - > engine ( ) . check_for_amibiguous_latency ( true ) ) {
io_latency_value . set_markup ( " <span background= \" red \" foreground= \" white \" >ambiguous</span> " ) ;
} else {
io_latency_value . set_text ( samples_as_time_string ( wpl , rate ) ) ;
}
2019-09-29 01:23:48 +02:00
}
}
2005-09-25 18:42:24 +00: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 22:59:40 +00:00
auditioning_alert_button . set_active ( onoff ) ;
2016-12-11 17:24:30 +01:00
auditioning_alert_button . set_sensitive ( onoff ) ;
if ( ! onoff ) {
auditioning_alert_button . set_visual_state ( Gtkmm2ext : : NoVisualState ) ;
}
2011-11-14 22:59:40 +00:00
set_transport_sensitivity ( ! onoff ) ;
2005-09-25 18:42:24 +00:00
}
void
ARDOUR_UI : : auditioning_changed ( bool onoff )
{
2010-03-30 15:18:43 +00:00
UI : : instance ( ) - > call_slot ( MISSING_INVALIDATOR , boost : : bind ( & ARDOUR_UI : : _auditioning_changed , this , onoff ) ) ;
2005-09-25 18:42:24 +00:00
}
2016-12-11 17:24:30 +01:00
void
ARDOUR_UI : : audition_alert_clicked ( )
2005-09-25 18:42:24 +00:00
{
2009-12-17 18:24:23 +00:00
if ( _session ) {
_session - > cancel_audition ( ) ;
2005-09-25 18:42:24 +00:00
}
2011-11-11 13:52:27 +00:00
}
2015-03-14 17:28:20 +01:00
bool
2015-03-17 11:59:30 +01:00
ARDOUR_UI : : error_alert_press ( GdkEventButton * ev )
2015-03-14 17:28:20 +01:00
{
2015-03-20 22:48:53 +01:00
bool do_toggle = true ;
2015-03-20 22:12:40 +01:00
if ( ev - > button = = 1 ) {
2015-03-20 22:48:53 +01:00
if ( _log_not_acknowledged = = LogLevelError ) {
// just acknowledge the error, don't hide the log if it's already visible
2019-02-28 23:54:42 +01:00
RefPtr < ToggleAction > tact = ActionManager : : get_toggle_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
if ( tact - > get_active ( ) ) {
2015-03-20 22:48:53 +01:00
do_toggle = false ;
}
}
2015-03-20 22:12:40 +01:00
_log_not_acknowledged = LogLevelNone ;
error_blink ( false ) ; // immediate acknowledge
2015-03-17 11:59:30 +01:00
}
2015-03-20 22:48:53 +01:00
// maybe fall through to to button toggle
return ! do_toggle ;
2015-03-14 17:28:20 +01:00
}
2016-12-12 21:48:29 +01:00
void
ARDOUR_UI : : layered_button_clicked ( )
{
if ( _session ) {
_session - > config . set_layered_record_mode ( ! _session - > config . get_layered_record_mode ( ) ) ;
}
}
2005-09-25 18:42:24 +00:00
void
ARDOUR_UI : : solo_blink ( bool onoff )
{
2009-12-17 18:24:23 +00:00
if ( _session = = 0 ) {
2005-09-25 18:42:24 +00:00
return ;
}
2009-10-14 16:10:01 +00:00
2010-03-19 20:53:22 +00:00
if ( _session - > soloing ( ) | | _session - > listening ( ) ) {
2005-09-25 18:42:24 +00:00
if ( onoff ) {
2011-11-14 17:52:38 +00:00
solo_alert_button . set_active ( true ) ;
2005-09-25 18:42:24 +00:00
} else {
2011-11-14 17:52:38 +00:00
solo_alert_button . set_active ( false ) ;
2005-09-25 18:42:24 +00:00
}
} else {
solo_alert_button . set_active ( false ) ;
}
}
2009-11-09 20:05:18 +00:00
void
ARDOUR_UI : : sync_blink ( bool onoff )
{
2009-12-17 18:24:23 +00:00
if ( _session = = 0 | | ! _session - > config . get_external_sync ( ) ) {
2009-11-10 04:30:08 +00:00
/* internal sync */
2011-11-14 17:52:38 +00:00
sync_button . set_active ( false ) ;
2009-11-09 20:05:18 +00:00
return ;
}
2009-12-17 18:24:23 +00:00
if ( ! _session - > transport_locked ( ) ) {
2009-11-10 04:30:08 +00:00
/* not locked, so blink on and off according to the onoff argument */
2009-11-09 20:05:18 +00:00
if ( onoff ) {
2011-11-14 17:52:38 +00:00
sync_button . set_active ( true ) ;
2009-11-09 20:05:18 +00:00
} else {
2011-11-14 17:52:38 +00:00
sync_button . set_active ( false ) ;
2009-11-09 20:05:18 +00:00
}
} else {
2009-11-10 04:30:08 +00:00
/* locked */
2011-11-14 17:52:38 +00:00
sync_button . set_active ( true ) ;
2009-11-09 20:05:18 +00:00
}
}
2005-09-25 18:42:24 +00:00
void
ARDOUR_UI : : audition_blink ( bool onoff )
{
2009-12-17 18:24:23 +00:00
if ( _session = = 0 ) {
2005-09-25 18:42:24 +00:00
return ;
}
2009-10-14 16:10:01 +00:00
2009-12-17 18:24:23 +00:00
if ( _session - > is_auditioning ( ) ) {
2005-09-25 18:42:24 +00:00
if ( onoff ) {
2011-11-14 18:52:44 +00:00
auditioning_alert_button . set_active ( true ) ;
2005-09-25 18:42:24 +00:00
} else {
2011-11-14 18:52:44 +00:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 18:42:24 +00:00
}
} else {
2011-11-14 22:57:03 +00:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 18:42:24 +00:00
}
}
2011-11-11 13:52:27 +00:00
void
ARDOUR_UI : : feedback_blink ( bool onoff )
{
if ( _feedback_exists ) {
2019-09-01 18:37:49 +02:00
feedback_alert_button . set_active ( true ) ;
2011-11-11 13:52:27 +00:00
if ( onoff ) {
2019-09-01 18:37:49 +02:00
feedback_alert_button . reset_fixed_colors ( ) ;
2011-11-11 13:52:27 +00:00
} else {
2019-09-01 18:37:49 +02:00
feedback_alert_button . set_active_color ( UIConfigurationBase : : instance ( ) . color ( " feedback alert: alt active " , NULL ) ) ;
2011-11-11 13:52:27 +00:00
}
} else {
2019-09-01 18:37:49 +02:00
feedback_alert_button . reset_fixed_colors ( ) ;
2011-11-11 13:52:27 +00:00
feedback_alert_button . set_active ( false ) ;
}
}
2015-03-14 17:28:20 +01:00
void
ARDOUR_UI : : error_blink ( bool onoff )
{
2015-03-16 19:04:17 +01: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 17:28:20 +01:00
}
}
2005-09-25 18:42:24 +00:00
void
ARDOUR_UI : : set_transport_sensitivity ( bool yn )
{
2005-12-21 21:37:18 +00:00
ActionManager : : set_sensitive ( ActionManager : : transport_sensitive_actions , yn ) ;
2016-12-20 00:00:14 +01:00
shuttle_box . set_sensitive ( yn ) ;
2005-09-25 18:42:24 +00:00
}
2005-12-21 21:37:18 +00:00
2020-02-27 22:25:37 +01:00
void
ARDOUR_UI : : set_punch_sensitivity ( )
{
bool can_punch = _session & & _session - > punch_is_possible ( ) & & _session - > locations ( ) - > auto_punch_location ( ) ;
ActionManager : : get_action ( " Transport " , " TogglePunchIn " ) - > set_sensitive ( can_punch ) ;
ActionManager : : get_action ( " Transport " , " TogglePunchOut " ) - > set_sensitive ( can_punch ) ;
}
2005-12-21 21:37:18 +00:00
void
ARDOUR_UI : : editor_realized ( )
{
2009-12-12 15:02:15 +00:00
boost : : function < void ( string ) > pc ( boost : : bind ( & ARDOUR_UI : : parameter_changed , this , _1 ) ) ;
Config - > map_parameters ( pc ) ;
2006-09-25 21:24:00 +00:00
2015-01-02 21:44:54 +07:00
UIConfiguration : : instance ( ) . reset_dpi ( ) ;
2005-12-21 21:37:18 +00:00
}
2005-12-31 18:20:42 +00:00
2006-01-19 18:05:31 +00:00
void
2012-06-13 04:21:46 +00:00
ARDOUR_UI : : maximise_editing_space ( )
2006-01-19 18:05:31 +00:00
{
2012-01-25 03:03:25 +00:00
if ( editor ) {
2012-06-13 04:21:46 +00:00
editor - > maximise_editing_space ( ) ;
}
}
void
ARDOUR_UI : : restore_editing_space ( )
{
if ( editor ) {
editor - > restore_editing_space ( ) ;
2006-01-19 18:05:31 +00:00
}
}
2011-02-17 18:53:31 +00:00
2014-07-14 12:19:52 -05: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 10:05:05 +01:00
rc_option_editor - > set_current_page ( _ ( " Appearance " ) ) ;
2015-07-27 17:12:35 -04:00
}
2014-07-14 12:19:52 -05:00
}
2011-02-17 18:53:31 +00: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 10:05:05 +01:00
rc_option_editor - > set_current_page ( _ ( " Metronome " ) ) ;
2011-02-17 18:53:31 +00:00
return true ;
}
2011-12-01 23:22:05 +00:00
2016-12-19 19:21:38 +01: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 ) ;
2020-01-12 18:05:16 +01:00
rc_option_editor - > set_current_page ( _ ( " Transport " ) ) ;
2016-12-19 19:21:38 +01:00
return true ;
}
2011-12-01 23:22:05 +00:00
void
2014-07-03 12:25:35 -05:00
ARDOUR_UI : : toggle_follow_edits ( )
2011-12-01 23:22:05 +00:00
{
2019-02-28 23:54:42 +01:00
RefPtr < ToggleAction > tact = ActionManager : : get_toggle_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
2015-01-02 21:44:54 +07:00
UIConfiguration : : instance ( ) . set_follow_edits ( tact - > get_active ( ) ) ;
2011-12-01 23:22:05 +00:00
}
2012-01-30 22:53:22 +00:00
2015-07-09 13:56:12 -04:00
void
ARDOUR_UI : : update_title ( )
{
if ( _session ) {
bool dirty = _session - > dirty ( ) ;
2015-10-05 16:17:49 +02: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
}
2018-12-03 18:55:52 -06:00