2005-09-25 14:42:24 -04:00
/*
2019-08-02 17:26:43 -04: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 14:42:24 -04:00
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>
2021-06-18 16:26:22 -04:00
# include <gtkmm/menu.h>
# include <gtkmm/menuitem.h>
2005-10-10 16:38:53 -04:00
# include <sigc++/bind.h>
2017-07-16 21:48:18 -04:00
# include <gtkmm/settings.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/utils.h"
# include "gtkmm2ext/window_title.h"
2005-09-25 14:42:24 -04:00
2020-04-06 18:09:38 -04:00
# include "ardour/audioengine.h"
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"
2020-10-26 17:55:00 -04:00
# include "recorder_ui.h"
2021-11-08 20:27:38 -05:00
# include "trigger_page.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 ;
2017-07-15 11:38:28 -04:00
using namespace ArdourWidgets ;
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 ;
2021-06-18 16:26:22 -04:00
using namespace Menu_Helpers ;
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 ( ) ) ;
2015-06-25 12:47:29 -04:00
set_tip ( auto_return_button , _ ( " Return to last playback start when stopped " ) ) ;
2022-09-19 16:47:59 -04:00
set_tip ( record_mode_selector , _ ( " <b>Layered</b>, new recordings will be added as regions on a layer atop existing regions. \n <b>SoundOnSound</b>, behaves like <i>Layered</i>, except underlying regions will be audible. \n <b>Non Layered</b>, the underlying region will be spliced and replaced with the newly recorded region. " ) ) ;
2016-12-19 13:22:39 -05:00
set_tip ( follow_edits_button , _ ( " Playhead follows Range tool clicks, and Range selections " ) ) ;
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 " ) ) ;
2021-03-30 15:19:55 -04:00
set_tip ( feedback_alert_button , _ ( " When lit, there is a ports connection issue, leading to feedback loop or ambiguous alignment. \n This is caused by connecting an output back to some input (feedback), or by multiple connections from a source to the same output via different paths (ambiguous latency, record alignment). " ) ) ;
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 " ) ) ;
2019-06-04 08:56:50 -04:00
set_tip ( editor_meter_peak_display , _ ( " Reset All Peak Meters " ) ) ;
2015-03-16 14:04:17 -04:00
set_tip ( error_alert_button , _ ( " Show Error Log and acknowledge warnings " ) ) ;
2022-04-05 12:45:40 -04:00
set_tip ( _cue_rec_enable , _ ( " <b>When enabled</b>, triggering Cues will result in Cue Markers added to the timeline " ) ) ;
set_tip ( _cue_play_enable , _ ( " <b>When enabled</b>, Cue Markers will trigger the associated Cue when passed on the timeline " ) ) ;
2010-02-08 19:50:24 -05:00
2020-01-13 12:38:35 -05: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-28 19:23:48 -04: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 ;
}
2018-02-20 05:06:37 -05: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 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 ;
}
2022-02-12 22:45:53 -05:00
void
ARDOUR_UI : : cue_rec_state_clicked ( )
{
TriggerBox : : set_cue_recording ( ! TriggerBox : : cue_recording ( ) ) ;
}
void
ARDOUR_UI : : cue_ffwd_state_clicked ( )
{
if ( editor ) {
editor - > toggle_cue_behavior ( ) ;
}
}
void
ARDOUR_UI : : cue_rec_state_changed ( )
{
_cue_rec_enable . set_active_state ( TriggerBox : : cue_recording ( ) ? Gtkmm2ext : : ExplicitActive : Gtkmm2ext : : Off ) ;
//Config->get_cue_behavior()
}
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 ) {
2018-02-14 15:47:00 -05: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 16:05:49 -05:00
transport_hbox . remove ( meterbox_spacer2 ) ;
2016-12-19 21:11:21 -05:00
}
if ( UIConfiguration : : instance ( ) . get_show_editor_meter ( ) ) {
2018-02-14 15:47:00 -05:00
transport_hbox . pack_end ( meterbox_spacer , false , false , 3 ) ;
2018-02-14 16:05:49 -05:00
transport_hbox . pack_end ( editor_meter_table , false , false ) ;
2022-10-17 20:14:31 -04:00
transport_hbox . pack_end ( meterbox_spacer2 , false , false , 1 ) ;
meterbox_spacer2 . set_size_request ( 1 , - 1 ) ;
2018-02-14 15:47:00 -05:00
editor_meter_table . show ( ) ;
meterbox_spacer . show ( ) ;
2018-02-14 16:05:49 -05:00
meterbox_spacer2 . show ( ) ;
2016-12-19 21:11:21 -05:00
}
}
2017-01-16 15:58:53 -05:00
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 ( ) ;
2022-09-19 16:47:59 -04:00
record_mode_selector . show ( ) ;
2017-01-16 15:58:53 -05:00
recpunch_spacer . show ( ) ;
} else {
punch_label . hide ( ) ;
layered_label . hide ( ) ;
punch_in_button . hide ( ) ;
punch_out_button . hide ( ) ;
2022-09-19 16:47:59 -04:00
record_mode_selector . hide ( ) ;
2017-01-16 15:58:53 -05:00
recpunch_spacer . hide ( ) ;
}
2019-09-28 19:23:48 -04:00
bool show_pdc = UIConfiguration : : instance ( ) . get_show_toolbar_latency ( ) ;
if ( show_pdc ) {
latency_disable_button . show ( ) ;
route_latency_value . show ( ) ;
2019-09-29 10:59:18 -04:00
io_latency_label . show ( ) ;
2019-09-28 19:23:48 -04:00
io_latency_value . show ( ) ;
latency_spacer . show ( ) ;
} else {
latency_disable_button . hide ( ) ;
route_latency_value . hide ( ) ;
2019-09-29 10:59:18 -04:00
io_latency_label . hide ( ) ;
2019-09-28 19:23:48 -04:00
io_latency_value . hide ( ) ;
latency_spacer . hide ( ) ;
}
2020-09-17 16:37:12 -04:00
2022-03-01 11:53:11 -05:00
bool show_cue = UIConfiguration : : instance ( ) . get_show_toolbar_cuectrl ( ) ;
if ( show_cue ) {
_cue_rec_enable . show ( ) ;
_cue_play_enable . show ( ) ;
cuectrl_spacer . show ( ) ;
} else {
_cue_rec_enable . hide ( ) ;
_cue_play_enable . hide ( ) ;
cuectrl_spacer . hide ( ) ;
}
2020-09-17 16:37:12 -04:00
bool show_mnfo = UIConfiguration : : instance ( ) . get_show_toolbar_monitor_info ( ) ;
if ( show_mnfo ) {
monitor_dim_button . show ( ) ;
monitor_mono_button . show ( ) ;
monitor_mute_button . show ( ) ;
monitor_spacer . show ( ) ;
} else {
monitor_dim_button . hide ( ) ;
monitor_mono_button . hide ( ) ;
monitor_mute_button . hide ( ) ;
monitor_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 */
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleExternalSync " ) ) ;
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 */
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 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 ) ;
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
2015-03-16 21:05:02 -04:00
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
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 " ) ) ) ;
2020-10-26 17:55:00 -04:00
recorder_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-recorder-visibility " ) ) ) ;
2021-11-08 20:27:38 -05:00
trigger_page_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-trigger-visibility " ) ) ) ;
2005-09-25 14:42:24 -04:00
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoReturn " ) ;
2016-12-11 11:24:30 -05: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 11:24:30 -05:00
follow_edits_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2018-12-10 08:33:31 -05:00
act = ActionManager : : get_action ( " Transport " , " TogglePunchIn " ) ;
2016-12-11 11:24:30 -05: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 11:24:30 -05:00
punch_out_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2020-09-17 16:37:12 -04:00
act = ActionManager : : get_action ( X_ ( " Monitor Section " ) , X_ ( " monitor-dim-all " ) ) ;
monitor_dim_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( X_ ( " Monitor Section " ) , X_ ( " monitor-mono " ) ) ;
monitor_mono_button . set_related_action ( act ) ;
act = ActionManager : : get_action ( X_ ( " Monitor Section " ) , X_ ( " monitor-cut-all " ) ) ;
monitor_mute_button . set_related_action ( act ) ;
2019-09-28 19:23:48 -04: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 ) ;
2022-11-16 15:25:16 -05:00
set_size_request_to_display_given_text ( io_latency_value , " 888.88 ms " , 0 , 0 ) ;
2019-09-28 19:23:48 -04:00
2016-12-11 11:24:30 -05:00
/* connect signals */
2022-10-07 18:12:27 -04:00
ARDOUR_UI : : Clock . connect ( sigc : : bind ( sigc : : mem_fun ( primary_clock , & MainClock : : set ) , false ) ) ;
ARDOUR_UI : : Clock . connect ( sigc : : bind ( sigc : : mem_fun ( secondary_clock , & MainClock : : set ) , false ) ) ;
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 ) ) ;
2022-11-18 06:08:18 -05:00
primary_clock - > change_display_delta_mode_signal . connect ( sigc : : mem_fun ( UIConfiguration : : instance ( ) , & UIConfiguration : : set_primary_clock_delta_mode ) ) ;
2016-12-11 11:24:30 -05:00
secondary_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : secondary_clock_value_changed ) ) ;
2022-11-18 06:08:18 -05:00
secondary_clock - > change_display_delta_mode_signal . connect ( sigc : : mem_fun ( UIConfiguration : : instance ( ) , & UIConfiguration : : set_secondary_clock_delta_mode ) ) ;
2016-12-11 11:24:30 -05:00
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 ) ) ;
2020-10-26 17:55:00 -04:00
recorder_visibility_button . signal_drag_failed ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( drag_failed ) , recorder ) ) ;
2021-11-08 20:27:38 -05:00
trigger_page_visibility_button . signal_drag_failed ( ) . connect ( sigc : : bind ( sigc : : ptr_fun ( drag_failed ) , trigger_page ) ) ;
2005-09-25 14:42:24 -04:00
2022-02-12 22:45:53 -05:00
_cue_rec_enable . set_name ( " record enable button " ) ;
_cue_rec_enable . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : cue_rec_state_clicked ) ) ;
2022-03-12 12:49:13 -05:00
_cue_play_enable . set_name ( " transport option button " ) ;
2022-02-12 22:45:53 -05:00
_cue_play_enable . signal_clicked . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : cue_ffwd_state_clicked ) ) ;
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 ) ;
2020-10-26 17:55:00 -04:00
recorder_visibility_button . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_visibility_button_press ) , X_ ( " recorder " ) ) , false ) ;
2021-11-08 20:27:38 -05:00
trigger_page_visibility_button . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_visibility_button_press ) , X_ ( " trigger " ) ) , 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
2021-03-30 15:19:55 -04:00
feedback_alert_button . set_sizing_text ( _ ( " Facdbeek " ) ) ; //< longest of "Feedback" and "No Align"
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 " ) ) ;
2020-10-26 17:55:00 -04:00
recorder_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
2021-11-08 20:27:38 -05:00
trigger_page_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 " ) ;
2022-09-19 20:36:56 -04:00
record_mode_selector . set_name ( " record mode button " ) ;
2006-08-01 18:58:24 -04:00
2019-09-28 19:57:15 -04:00
latency_disable_button . set_name ( " latency button " ) ;
2019-09-28 19:23:48 -04:00
2020-09-17 16:37:12 -04:00
monitor_dim_button . set_name ( " monitor section dim " ) ;
monitor_mono_button . set_name ( " monitor section mono " ) ;
monitor_mute_button . set_name ( " mute button " ) ;
monitor_dim_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
monitor_mono_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
monitor_mute_button . set_layout_font ( UIConfiguration : : instance ( ) . get_SmallerFont ( ) ) ;
monitor_dim_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
monitor_mono_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
monitor_mute_button . set_elements ( ArdourButton : : Element ( ArdourButton : : Body | ArdourButton : : Text ) ) ;
2016-12-11 11:24:30 -05:00
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 " ) ) ;
2023-10-28 08:45:33 -04:00
punch_in_button . set_text ( S_ ( " Punch|In " ) ) ;
punch_out_button . set_text ( S_ ( " Punch|Out " ) ) ;
2022-09-19 16:47:59 -04:00
record_mode_selector . AddMenuElem ( MenuElem ( record_mode_strings [ ( int ) RecLayered ] , sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : set_record_mode ) , RecLayered ) ) ) ;
record_mode_selector . AddMenuElem ( MenuElem ( record_mode_strings [ ( int ) RecNonLayered ] , sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : set_record_mode ) , RecNonLayered ) ) ) ;
record_mode_selector . AddMenuElem ( MenuElem ( record_mode_strings [ ( int ) RecSoundOnSound ] , sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : set_record_mode ) , RecSoundOnSound ) ) ) ;
2022-09-19 20:36:56 -04:00
record_mode_selector . set_sizing_texts ( record_mode_strings ) ;
2008-01-10 16:20:59 -05:00
2019-09-28 19:23:48 -04:00
latency_disable_button . set_text ( _ ( " Disable PDC " ) ) ;
io_latency_label . set_text ( _ ( " I/O Latency: " ) ) ;
2020-09-17 16:37:12 -04:00
monitor_dim_button . set_text ( _ ( " Dim All " ) ) ;
monitor_mono_button . set_text ( _ ( " Mono " ) ) ;
monitor_mute_button . set_text ( _ ( " Mute All " ) ) ;
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 ,
2022-01-25 20:50:45 -05:00
string_compose ( _ ( " Left-Click to show the %1 window \n "
" Right-click to show more options " ) , 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 ,
2022-01-25 20:50:45 -05:00
string_compose ( _ ( " Left-Click to show the %1 window \n "
" Right-click to show more options " ) , 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 ,
2022-01-25 20:50:45 -05:00
string_compose ( _ ( " Left-Click to show the %1 window \n "
" Right-click to show more options " ) , rc_option_editor - > name ( ) ) ) ;
2011-06-09 17:51:15 -04:00
2020-10-26 17:55:00 -04:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( recorder_visibility_button ,
2022-01-25 20:50:45 -05:00
string_compose ( _ ( " Left-Click to show the %1 window \n "
" Right-click to show more options " ) , recorder - > name ( ) ) ) ;
2020-10-26 17:55:00 -04:00
2021-11-08 20:27:38 -05:00
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( trigger_page_visibility_button ,
2022-01-25 20:50:45 -05:00
string_compose ( _ ( " Left-Click to show the %1 window \n "
" Right-click to show more options " ) , trigger_page - > name ( ) ) ) ;
2021-11-08 20:27:38 -05: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
2020-09-17 16:37:12 -04:00
/* monitor section */
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( monitor_dim_button , _ ( " Monitor section dim output " ) ) ;
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( monitor_mono_button , _ ( " Monitor section mono output " ) ) ;
Gtkmm2ext : : UI : : instance ( ) - > set_tip ( monitor_mute_button , _ ( " Monitor section mute output " ) ) ;
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 > 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 ) ;
2020-09-17 16:37:12 -04:00
monitor_button_size_group - > add_widget ( monitor_dim_button ) ;
monitor_button_size_group - > add_widget ( monitor_mono_button ) ;
monitor_button_size_group - > add_widget ( monitor_mute_button ) ;
2017-01-16 13:54:20 -05:00
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 ) ;
2022-10-17 19:37:41 -04:00
transport_table . set_border_width ( 1 ) ;
2017-01-05 17:22:05 -05: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 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 ,
2019-04-08 15:40:33 -04:00
nothing inside the transport_frame actually draws a background . We
2017-01-05 17:22:05 -05: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 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 ) ;
2017-09-18 14:45:56 -04:00
transport_frame . add ( * ebox ) ;
2017-01-05 17:22:05 -05:00
ebox - > add ( transport_table ) ;
2016-12-11 11:24:30 -05:00
/* 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
2020-09-17 16:37:12 -04:00
/* monitor section sub-group */
VBox * monitor_box = manage ( new VBox ) ;
monitor_box - > set_homogeneous ( true ) ;
monitor_box - > set_spacing ( 1 ) ;
monitor_box - > set_border_width ( 0 ) ;
monitor_box - > pack_start ( monitor_mono_button , true , true ) ;
monitor_box - > pack_start ( monitor_dim_button , true , true ) ;
monitor_box - > pack_start ( monitor_mute_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 ( ) ) ;
2017-12-22 14:20:59 -05:00
button_height_size_group - > add_widget ( transport_ctrl . size_button ( ) ) ;
2019-11-18 20:52:35 -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
2021-11-08 20:27:38 -05:00
button_height_size_group - > add_widget ( trigger_page_visibility_button ) ;
2020-10-26 17:55:00 -04:00
button_height_size_group - > add_widget ( recorder_visibility_button ) ;
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 ) ;
2020-10-26 17:55:00 -04:00
button_height_size_group - > add_widget ( prefs_visibility_button ) ;
2016-12-17 23:32:38 -05:00
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 ) ;
2022-09-19 16:47:59 -04:00
button_height_size_group - > add_widget ( record_mode_selector ) ;
2017-01-18 09:28:25 -05:00
2019-11-18 20:52:35 -05:00
// PDC
button_height_size_group - > add_widget ( latency_disable_button ) ;
2019-11-18 20:47:11 -05: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 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 ) ;
2021-06-27 17:25:33 -04:00
ssbox - > pack_start ( * shuttle_box . vari_button ( ) , false , false , 0 ) ;
2016-12-19 18:00:14 -05:00
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
2017-12-22 14:20:59 -05:00
transport_table . attach ( transport_ctrl , TCOL , 0 , 1 , SHRINK , SHRINK , 0 , 0 ) ;
2016-12-18 17:20:14 -05: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 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
2022-09-19 16:47:59 -04: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 ( record_mode_selector , 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 ;
2019-09-28 19:23:48 -04:00
transport_table . attach ( latency_disable_button , TCOL , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
2019-11-18 20:52:35 -05:00
transport_table . attach ( io_latency_label , TCOL , 1 , 2 , SHRINK , EXPAND | FILL , hpadding , 0 ) ;
2019-09-28 19:23:48 -04:00
+ + col ;
2019-11-18 20:52:35 -05: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-28 19:23:48 -04:00
+ + col ;
2022-01-26 16:20:26 -05:00
route_latency_value . set_alignment ( Gtk : : ALIGN_END , Gtk : : ALIGN_CENTER ) ;
io_latency_value . set_alignment ( Gtk : : ALIGN_END , Gtk : : ALIGN_CENTER ) ;
2019-09-28 19:23:48 -04:00
transport_table . attach ( latency_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
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
2020-09-17 16:37:12 -04:00
transport_table . attach ( monitor_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
transport_table . attach ( * monitor_box , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2022-03-01 11:53:11 -05:00
transport_table . attach ( cuectrl_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2022-02-12 22:45:53 -05:00
transport_table . attach ( _cue_rec_enable , TCOL , 0 , 1 , FILL , FILL , 3 , 0 ) ;
transport_table . attach ( _cue_play_enable , TCOL , 1 , 2 , FILL , FILL , 3 , 0 ) ;
+ + col ;
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 */
2019-11-18 20:47:11 -05: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 11:24:30 -05:00
2021-02-25 08:29:12 -05:00
transport_table . attach ( scripts_spacer , TCOL , 0 , 2 , SHRINK , EXPAND | FILL , 3 , 0 ) ;
+ + col ;
2021-11-08 20:27:38 -05:00
transport_table . attach ( recorder_visibility_button , TCOL , 0 , 1 , FILL , SHRINK , hpadding , vpadding ) ;
transport_table . attach ( trigger_page_visibility_button , TCOL , 1 , 2 , FILL , SHRINK , hpadding , vpadding ) ;
2020-10-26 17:55:00 -04:00
+ + col ;
2021-11-08 20:27:38 -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
2019-09-28 19:23:48 -04:00
/* initialize */
latency_switch_changed ( ) ;
2020-04-06 18:11:19 -04:00
session_latency_updated ( true ) ;
2019-09-28 19:23:48 -04: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 ) ;
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
2019-09-28 19:23:48 -04: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
2020-04-06 18:11:19 -04:00
ARDOUR_UI : : session_latency_updated ( bool for_playback )
2019-09-28 19:23:48 -04:00
{
2020-04-06 18:11:19 -04:00
if ( ! for_playback ) {
/* latency updates happen in pairs, in the following order:
* - for capture
* - for playback
*/
return ;
}
2019-09-28 19:23:48 -04:00
if ( ! _session ) {
route_latency_value . set_text ( " -- " ) ;
io_latency_value . set_text ( " -- " ) ;
} else {
samplecnt_t wrl = _session - > worst_route_latency ( ) ;
2021-09-08 15:45:52 -04:00
samplecnt_t iol = _session - > io_latency ( ) ;
2019-09-28 19:23:48 -04:00
float rate = _session - > nominal_sample_rate ( ) ;
route_latency_value . set_text ( samples_as_time_string ( wrl , rate ) ) ;
2020-04-06 18:09:38 -04:00
2020-04-06 22:07:34 -04:00
if ( _session - > engine ( ) . check_for_ambiguous_latency ( true ) ) {
2021-03-30 15:19:55 -04:00
_ambiguous_latency = true ;
2020-04-06 18:09:38 -04:00
io_latency_value . set_markup ( " <span background= \" red \" foreground= \" white \" >ambiguous</span> " ) ;
} else {
2021-03-30 15:19:55 -04:00
_ambiguous_latency = false ;
2021-09-08 15:45:52 -04:00
io_latency_value . set_text ( samples_as_time_string ( iol , rate ) ) ;
2020-04-06 18:09:38 -04:00
}
2019-09-28 19:23:48 -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 ) ;
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
2019-02-28 17:54:42 -05:00
RefPtr < ToggleAction > tact = ActionManager : : get_toggle_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
if ( tact - > get_active ( ) ) {
2015-03-20 17:48:53 -04:00
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
2022-09-19 16:47:59 -04:00
ARDOUR_UI : : set_record_mode ( RecordMode m )
2016-12-12 15:48:29 -05:00
{
if ( _session ) {
2022-09-19 16:47:59 -04:00
_session - > config . set_record_mode ( m ) ;
2016-12-12 15:48:29 -05: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 ) {
2021-03-30 15:19:55 -04:00
feedback_alert_button . set_active ( true ) ;
feedback_alert_button . set_text ( _ ( " Feedback " ) ) ;
if ( onoff ) {
feedback_alert_button . reset_fixed_colors ( ) ;
} else {
feedback_alert_button . set_active_color ( UIConfigurationBase : : instance ( ) . color ( " feedback alert: alt active " , NULL ) ) ;
}
} else if ( _ambiguous_latency & & ! UIConfiguration : : instance ( ) . get_show_toolbar_latency ( ) ) {
feedback_alert_button . set_text ( _ ( " No Align " ) ) ;
2019-09-01 12:37:49 -04:00
feedback_alert_button . set_active ( true ) ;
2011-11-11 08:52:27 -05:00
if ( onoff ) {
2019-09-01 12:37:49 -04:00
feedback_alert_button . reset_fixed_colors ( ) ;
2011-11-11 08:52:27 -05:00
} else {
2019-09-01 12:37:49 -04:00
feedback_alert_button . set_active_color ( UIConfigurationBase : : instance ( ) . color ( " feedback alert: alt active " , NULL ) ) ;
2011-11-11 08:52:27 -05:00
}
} else {
2023-10-05 15:11:59 -04:00
feedback_alert_button . set_text ( _ ( " Feedback " ) ) ;
2019-09-01 12:37:49 -04:00
feedback_alert_button . reset_fixed_colors ( ) ;
2011-11-11 08:52:27 -05:00
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 ) ;
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
2020-02-27 16:25:37 -05: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 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
}
2021-07-06 20:11:06 -04:00
2020-07-20 23:51:56 -04:00
void
ARDOUR_UI : : show_mixer_prefs ( )
{
if ( rc_option_editor ) {
show_tabbable ( rc_option_editor ) ;
2021-02-18 10:46:57 -05:00
rc_option_editor - > set_current_page ( _ ( " Signal Flow " ) ) ;
2020-07-20 23:51:56 -04:00
}
}
2014-07-14 13:19:52 -04:00
2021-07-06 20:11:06 -04:00
void
ARDOUR_UI : : show_plugin_prefs ( )
{
if ( rc_option_editor ) {
show_tabbable ( rc_option_editor ) ;
rc_option_editor - > set_current_page ( _ ( " Plugins " ) ) ;
}
}
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
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 ;
}
2021-02-18 10:46:57 -05:00
Glib : : RefPtr < ToggleAction > tact = ActionManager : : get_toggle_action ( " Window " , " toggle-transport-masters " ) ;
tact - > set_active ( ) ;
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
{
2019-02-28 17:54:42 -05:00
RefPtr < ToggleAction > tact = ActionManager : : get_toggle_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
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 ( )
{
2020-10-01 12:27:59 -04:00
stringstream snap_label ;
snap_label < < X_ ( " <span weight= \" ultralight \" > " )
< < _ ( " Name " )
< < X_ ( " </span>: " ) ;
2015-07-09 13:56:12 -04:00
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 ( ) ) ;
2020-10-01 12:27:59 -04:00
snap_label < < Gtkmm2ext : : markup_escape_text ( session_name ) ;
2015-07-09 13:56:12 -04:00
} else {
WindowTitle title ( Glib : : get_application_name ( ) ) ;
_main_window . set_title ( title . get_string ( ) ) ;
2020-10-01 12:27:59 -04:00
snap_label < < " - " ;
2015-07-09 13:56:12 -04:00
}
2020-10-01 12:27:59 -04:00
snapshot_name_label . set_markup ( snap_label . str ( ) ) ;
2015-07-09 13:56:12 -04:00
}
2018-12-03 19:55:52 -05:00