2005-09-25 14:42:24 -04:00
/*
2009-10-14 12:10:01 -04:00
Copyright ( C ) 1999 Paul Davis
2005-09-25 14:42:24 -04:00
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2010-11-13 00:14:48 -05:00
# ifdef WAF_BUILD
# include "gtk2ardour-config.h"
# endif
2005-09-25 14:42:24 -04:00
# include <fcntl.h>
# include <signal.h>
# include <unistd.h>
# include <cerrno>
# include <iostream>
# include <cmath>
2005-10-10 16:38:53 -04:00
# include <sigc++/bind.h>
2016-05-02 14:24:54 -04:00
# include "canvas/canvas.h"
2009-02-25 13:26:51 -05:00
# include "pbd/error.h"
# include "pbd/basename.h"
# include "pbd/fastlog.h"
2015-07-09 13:56:12 -04:00
# include "gtkmm2ext/cairocell.h"
# include "gtkmm2ext/utils.h"
# include "gtkmm2ext/click_box.h"
# include "gtkmm2ext/window_title.h"
2005-09-25 14:42:24 -04:00
2009-02-25 13:26:51 -05:00
# include "ardour/profile.h"
2012-05-24 02:09:29 -04:00
# include "ardour/session.h"
# include "ardour/types.h"
2005-09-25 14:42:24 -04:00
# include "ardour_ui.h"
2007-02-08 22:36:00 -05:00
# include "keyboard.h"
2005-09-25 14:42:24 -04:00
# include "public_editor.h"
# include "audio_clock.h"
2005-11-28 10:29:49 -05:00
# include "actions.h"
2012-05-31 19:14:03 -04:00
# include "main_clock.h"
2016-02-25 11:08:33 -05:00
# include "mixer_ui.h"
2005-10-10 16:38:53 -04:00
# include "utils.h"
2007-05-25 16:29:12 -04:00
# include "theme_manager.h"
2010-07-06 20:40:58 -04:00
# include "midi_tracer.h"
2011-04-19 22:48:20 -04:00
# include "shuttle_control.h"
2010-08-17 22:20:15 -04:00
# include "global_port_matrix.h"
# include "location_ui.h"
2011-02-17 13:53:31 -05:00
# include "rc_option_editor.h"
2011-06-03 18:18:47 -04:00
# include "time_info_box.h"
2005-09-25 14:42:24 -04:00
2016-07-14 14:44:52 -04:00
# include "pbd/i18n.h"
2005-09-25 14:42:24 -04:00
using namespace std ;
using namespace ARDOUR ;
2006-06-21 19:01:03 -04:00
using namespace PBD ;
2005-09-25 16:33:00 -04:00
using namespace Gtkmm2ext ;
2005-09-25 14:42:24 -04:00
using namespace Gtk ;
2005-12-04 23:11:08 -05:00
using namespace Glib ;
2014-06-25 15:27:37 -04:00
using namespace ARDOUR_UI_UTILS ;
2005-09-25 14:42:24 -04:00
2015-04-21 15:10:49 -04:00
2010-02-08 19:50:24 -05:00
void
ARDOUR_UI : : setup_tooltips ( )
{
2016-05-02 14:24:54 -04:00
ArdourCanvas : : Canvas : : set_tooltip_timeout ( Gtk : : Settings : : get_default ( ) - > property_gtk_tooltip_timeout ( ) ) ;
2010-02-08 19:50:24 -05:00
set_tip ( roll_button , _ ( " Play from playhead " ) ) ;
set_tip ( stop_button , _ ( " Stop playback " ) ) ;
set_tip ( rec_button , _ ( " Toggle record " ) ) ;
set_tip ( play_selection_button , _ ( " Play range/selection " ) ) ;
set_tip ( goto_start_button , _ ( " Go to start of session " ) ) ;
set_tip ( goto_end_button , _ ( " Go to end of session " ) ) ;
set_tip ( auto_loop_button , _ ( " Play loop range " ) ) ;
2011-11-10 13:04:34 -05:00
set_tip ( midi_panic_button , _ ( " MIDI Panic \n Send note off and reset controller messages on all MIDI channels " ) ) ;
2015-06-25 12:47:29 -04:00
set_tip ( auto_return_button , _ ( " Return to last playback start when stopped " ) ) ;
2015-11-29 14:17:11 -05:00
set_tip ( follow_edits_button , _ ( " Playhead follows range selections and edits " ) ) ;
2010-02-08 19:50:24 -05:00
set_tip ( auto_input_button , _ ( " Be sensible about input monitoring " ) ) ;
set_tip ( click_button , _ ( " Enable/Disable audio click " ) ) ;
set_tip ( solo_alert_button , _ ( " When active, something is soloed. \n Click to de-solo everything " ) ) ;
2015-11-29 14:17:11 -05:00
set_tip ( auditioning_alert_button , _ ( " When active, auditioning is taking place. \n Click to stop the audition " ) ) ;
2011-11-11 08:52:27 -05:00
set_tip ( feedback_alert_button , _ ( " When active, there is a feedback loop. " ) ) ;
2013-03-09 08:50:02 -05:00
set_tip ( primary_clock , _ ( " <b>Primary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify. \n Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times. \n " ) ) ;
set_tip ( secondary_clock , _ ( " <b>Secondary Clock</b> right-click to set display mode. Click to edit, click+drag a digit or mouse-over+scroll wheel to modify. \n Text edits: right-to-left overwrite <tt>Esc</tt>: cancel; <tt>Enter</tt>: confirm; postfix the edit with '+' or '-' to enter delta times. \n " ) ) ;
2014-08-22 12:45:34 -04:00
set_tip ( editor_meter_peak_display , _ ( " Reset All Peak Indicators " ) ) ;
2015-03-16 14:04:17 -04:00
set_tip ( error_alert_button , _ ( " Show Error Log and acknowledge warnings " ) ) ;
2010-02-08 19:50:24 -05:00
2010-11-25 15:37:39 -05:00
synchronize_sync_source_and_video_pullup ( ) ;
2010-08-30 21:49:33 -04:00
2010-02-08 19:50:24 -05:00
editor - > setup_tooltips ( ) ;
}
2010-04-20 22:24:38 -04:00
bool
ARDOUR_UI : : status_bar_button_press ( GdkEventButton * ev )
{
bool handled = false ;
switch ( ev - > button ) {
case 1 :
status_bar_label . set_text ( " " ) ;
handled = true ;
break ;
default :
break ;
}
return handled ;
}
2009-10-22 14:11:22 -04:00
void
2007-10-11 18:07:47 -04:00
ARDOUR_UI : : display_message ( const char * prefix , gint prefix_len , RefPtr < TextBuffer : : Tag > ptag , RefPtr < TextBuffer : : Tag > mtag , const char * msg )
{
2010-09-14 12:51:02 -04:00
string text ;
2007-10-11 18:07:47 -04:00
UI : : display_message ( prefix , prefix_len , ptag , mtag , msg ) ;
2015-03-14 12:28:20 -04:00
2015-03-16 14:04:17 -04:00
ArdourLogLevel ll = LogLevelNone ;
2007-10-11 18:07:47 -04:00
if ( strcmp ( prefix , _ ( " [ERROR]: " ) ) = = 0 ) {
text = " <span color= \" red \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelError ;
2007-10-11 18:07:47 -04:00
} else if ( strcmp ( prefix , _ ( " [WARNING]: " ) ) = = 0 ) {
text = " <span color= \" yellow \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelWarning ;
2007-10-11 18:07:47 -04:00
} else if ( strcmp ( prefix , _ ( " [INFO]: " ) ) = = 0 ) {
text = " <span color= \" green \" weight= \" bold \" > " ;
2015-03-16 14:04:17 -04:00
ll = LogLevelInfo ;
2007-10-11 18:07:47 -04:00
} else {
2008-09-19 02:30:49 -04:00
text = " <span color= \" white \" weight= \" bold \" >??? " ;
2007-10-11 18:07:47 -04:00
}
2015-03-16 14:04:17 -04:00
_log_not_acknowledged = std : : max ( _log_not_acknowledged , ll ) ;
# ifdef TOP_MENUBAR
2007-10-11 18:07:47 -04:00
text + = prefix ;
text + = " </span> " ;
text + = msg ;
status_bar_label . set_markup ( text ) ;
# endif
}
2010-03-19 16:53:22 -04:00
XMLNode *
ARDOUR_UI : : tearoff_settings ( const char * name ) const
{
2010-11-25 15:37:39 -05:00
XMLNode * ui_node = Config - > extra_xml ( X_ ( " UI " ) ) ;
2011-06-01 13:00:29 -04:00
2010-11-25 15:37:39 -05:00
if ( ui_node ) {
XMLNode * tearoff_node = ui_node - > child ( X_ ( " Tearoffs " ) ) ;
if ( tearoff_node ) {
XMLNode * mnode = tearoff_node - > child ( name ) ;
return mnode ;
}
}
return 0 ;
2010-03-19 16:53:22 -04:00
}
2015-01-02 09:44:54 -05:00
# define PX_SCALE(px) std::max((float)px, rintf((float)px * UIConfiguration::instance().get_ui_scale()))
2015-04-18 13:42:00 -04:00
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 ;
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : setup_transport ( )
{
2011-11-09 09:38:58 -05:00
RefPtr < Action > act ;
2015-07-27 18:05:42 -04:00
transport_hbox . set_border_width ( PX_SCALE ( 3 ) ) ;
transport_hbox . set_spacing ( PX_SCALE ( 3 ) ) ;
2005-09-25 14:42:24 -04:00
transport_base . set_name ( " TransportBase " ) ;
transport_base . add ( transport_hbox ) ;
2005-12-21 16:37:18 -05:00
transport_frame . set_shadow_type ( SHADOW_OUT ) ;
2005-09-25 14:42:24 -04:00
transport_frame . set_name ( " BaseFrame " ) ;
transport_frame . add ( transport_base ) ;
2015-06-25 12:47:29 -04:00
auto_return_button . set_text ( _ ( " Auto Return " ) ) ;
2012-12-06 15:48:44 -05:00
2012-11-20 14:43:43 -05:00
follow_edits_button . set_text ( _ ( " Follow Edits " ) ) ;
2012-12-06 15:48:44 -05:00
// auto_input_button.set_text (_("Auto Input"));
2011-11-09 09:38:58 -05:00
2015-05-24 15:45:39 -04:00
click_button . set_icon ( ArdourIcon : : TransportMetronom ) ;
2015-04-07 19:28:52 -04:00
2011-11-09 09:38:58 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleClick " ) ;
click_button . set_related_action ( act ) ;
click_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : click_button_clicked ) , false ) ;
2015-06-25 12:47:29 -04:00
auto_return_button . set_name ( " transport option button " ) ;
2012-11-20 14:43:43 -05:00
follow_edits_button . set_name ( " transport option button " ) ;
2011-11-09 09:38:58 -05:00
auto_input_button . set_name ( " transport option button " ) ;
2011-11-10 10:25:01 -05:00
/* these have to provide a clear indication of active state */
2012-11-12 13:23:58 -05:00
click_button . set_name ( " transport button " ) ;
2011-11-10 10:25:01 -05:00
sync_button . set_name ( " transport active option button " ) ;
2012-02-07 12:43:55 -05:00
stop_button . set_active ( true ) ;
2011-11-07 12:23:27 -05:00
2015-05-24 15:45:39 -04:00
goto_start_button . set_icon ( ArdourIcon : : TransportStart ) ;
goto_end_button . set_icon ( ArdourIcon : : TransportEnd ) ;
roll_button . set_icon ( ArdourIcon : : TransportPlay ) ;
stop_button . set_icon ( ArdourIcon : : TransportStop ) ;
play_selection_button . set_icon ( ArdourIcon : : TransportRange ) ;
auto_loop_button . set_icon ( ArdourIcon : : TransportLoop ) ;
rec_button . set_icon ( ArdourIcon : : RecButton ) ;
midi_panic_button . set_icon ( ArdourIcon : : TransportPanic ) ;
2015-04-07 16:33:43 -04:00
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Stop " ) ) ;
2011-11-07 12:23:27 -05:00
stop_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Roll " ) ) ;
2011-11-07 12:23:27 -05:00
roll_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Record " ) ) ;
2011-11-07 12:23:27 -05:00
rec_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " GotoStart " ) ) ;
2011-11-07 12:23:27 -05:00
goto_start_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " GotoEnd " ) ) ;
2011-11-07 12:23:27 -05:00
goto_end_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " Loop " ) ) ;
2011-11-07 12:23:27 -05:00
auto_loop_button . set_related_action ( act ) ;
2005-12-29 19:34:21 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " PlaySelection " ) ) ;
2011-11-07 12:23:27 -05:00
play_selection_button . set_related_action ( act ) ;
2011-11-10 13:04:34 -05:00
act = ActionManager : : get_action ( X_ ( " MIDI " ) , X_ ( " panic " ) ) ;
midi_panic_button . set_related_action ( act ) ;
2009-11-09 23:30:08 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleExternalSync " ) ) ;
2011-11-10 10:25:01 -05:00
sync_button . set_related_action ( act ) ;
2012-02-02 23:18:30 -05:00
2005-09-25 14:42:24 -04:00
/* clocks, etc. */
2011-11-18 13:06:16 -05:00
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( primary_clock , & AudioClock : : set ) ) ;
ARDOUR_UI : : Clock . connect ( sigc : : mem_fun ( secondary_clock , & AudioClock : : set ) ) ;
2005-09-25 14:42:24 -04:00
2011-06-02 13:50:37 -04:00
primary_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : primary_clock_value_changed ) ) ;
secondary_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : secondary_clock_value_changed ) ) ;
big_clock - > ValueChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : big_clock_value_changed ) ) ;
2005-09-25 14:42:24 -04:00
2015-06-25 12:47:29 -04:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoReturn " ) ;
auto_return_button . set_related_action ( act ) ;
2012-11-20 14:43:43 -05:00
act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
follow_edits_button . set_related_action ( act ) ;
2011-11-09 09:38:58 -05:00
act = ActionManager : : get_action ( " Transport " , " ToggleAutoInput " ) ;
auto_input_button . set_related_action ( act ) ;
2011-02-17 13:53:31 -05:00
2005-09-25 14:42:24 -04:00
/* alerts */
2009-12-11 18:29:48 -05:00
/* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
2005-09-25 14:42:24 -04:00
2011-11-10 10:25:01 -05:00
solo_alert_button . set_name ( " rude solo " ) ;
2015-10-02 07:32:49 -04:00
act = ActionManager : : get_action ( X_ ( " Main " ) , X_ ( " cancel-solo " ) ) ;
solo_alert_button . set_related_action ( act ) ;
2011-11-10 10:25:01 -05:00
auditioning_alert_button . set_name ( " rude audition " ) ;
2010-03-19 16:53:22 -04:00
auditioning_alert_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : audition_alert_press ) , false ) ;
2011-11-11 08:52:27 -05:00
feedback_alert_button . set_name ( " feedback alert " ) ;
feedback_alert_button . signal_button_press_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : feedback_alert_press ) , false ) ;
2015-03-14 12:28:20 -04:00
error_alert_button . set_name ( " error alert " ) ;
2015-03-20 17:12:40 -04:00
error_alert_button . signal_button_release_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : error_alert_press ) , false ) ;
2015-03-16 21:05:02 -04:00
act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
error_alert_button . set_related_action ( act ) ;
2015-03-17 06:59:30 -04:00
error_alert_button . set_fallthrough_to_parent ( true ) ;
2005-09-25 14:42:24 -04:00
2014-09-05 11:30:34 -04:00
alert_box . set_homogeneous ( true ) ;
2015-04-22 18:22:20 -04:00
alert_box . set_spacing ( PX_SCALE ( 2 ) ) ;
2014-09-05 11:30:34 -04:00
alert_box . pack_start ( solo_alert_button , true , true ) ;
alert_box . pack_start ( auditioning_alert_button , true , true ) ;
alert_box . pack_start ( feedback_alert_button , true , true ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
/* all transport buttons should be the same size vertically and
2015-10-04 14:51:05 -04:00
* horizontally
2012-02-02 23:18:30 -05:00
*/
Glib : : RefPtr < SizeGroup > transport_button_size_group = SizeGroup : : create ( SIZE_GROUP_BOTH ) ;
transport_button_size_group - > add_widget ( goto_start_button ) ;
transport_button_size_group - > add_widget ( goto_end_button ) ;
transport_button_size_group - > add_widget ( auto_loop_button ) ;
transport_button_size_group - > add_widget ( rec_button ) ;
transport_button_size_group - > add_widget ( play_selection_button ) ;
transport_button_size_group - > add_widget ( roll_button ) ;
2012-02-29 15:16:50 -05:00
transport_button_size_group - > add_widget ( stop_button ) ;
2012-02-02 23:18:30 -05:00
2015-04-18 13:42:00 -04:00
/* the icon for this has an odd aspect ratio, so fatten up the button */
2015-04-22 18:22:20 -04:00
midi_panic_button . set_size_request ( PX_SCALE ( 25 ) , - 1 ) ;
goto_start_button . set_size_request ( PX_SCALE ( 28 ) , PX_SCALE ( 44 ) ) ;
click_button . set_size_request ( PX_SCALE ( 32 ) , PX_SCALE ( 44 ) ) ;
2015-04-18 13:42:00 -04:00
2012-12-06 15:48:44 -05:00
2012-02-02 23:18:30 -05:00
HBox * tbox1 = manage ( new HBox ) ;
HBox * tbox2 = manage ( new HBox ) ;
2011-11-07 12:47:49 -05:00
HBox * tbox = manage ( new HBox ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
VBox * vbox1 = manage ( new VBox ) ;
VBox * vbox2 = manage ( new VBox ) ;
2005-09-25 14:42:24 -04:00
2012-02-02 23:18:30 -05:00
Alignment * a1 = manage ( new Alignment ) ;
Alignment * a2 = manage ( new Alignment ) ;
2011-11-07 15:06:13 -05:00
2015-04-22 18:22:20 -04:00
tbox1 - > set_spacing ( PX_SCALE ( 2 ) ) ;
tbox2 - > set_spacing ( PX_SCALE ( 2 ) ) ;
tbox - > set_spacing ( PX_SCALE ( 2 ) ) ;
2011-11-07 15:06:13 -05:00
2014-04-10 04:16:13 -04:00
if ( ! Profile - > get_trx ( ) ) {
2014-12-18 23:20:17 -05:00
tbox1 - > pack_start ( midi_panic_button , true , true , 5 ) ;
tbox1 - > pack_start ( click_button , true , true , 5 ) ;
2014-04-10 04:16:13 -04:00
}
2014-12-18 23:20:17 -05:00
tbox1 - > pack_start ( goto_start_button , true , true ) ;
tbox1 - > pack_start ( goto_end_button , true , true ) ;
tbox1 - > pack_start ( auto_loop_button , true , true ) ;
2011-11-07 15:06:13 -05:00
2014-04-10 04:16:13 -04:00
if ( ! Profile - > get_trx ( ) ) {
2014-12-18 23:20:17 -05:00
tbox2 - > pack_start ( play_selection_button , true , true ) ;
2014-04-10 04:16:13 -04:00
}
2014-12-18 23:20:17 -05:00
tbox2 - > pack_start ( roll_button , true , true ) ;
tbox2 - > pack_start ( stop_button , true , true ) ;
tbox2 - > pack_start ( rec_button , true , true , 5 ) ;
2011-04-19 22:48:20 -04:00
2014-12-18 23:20:17 -05:00
vbox1 - > pack_start ( * tbox1 , true , true ) ;
vbox2 - > pack_start ( * tbox2 , true , true ) ;
2011-11-07 15:06:13 -05:00
2012-02-02 23:18:30 -05:00
a1 - > add ( * vbox1 ) ;
2014-12-18 23:20:17 -05:00
a1 - > set ( 0.5 , 0.5 , 0.0 , 1.0 ) ;
2012-02-02 23:18:30 -05:00
a2 - > add ( * vbox2 ) ;
2014-12-18 23:20:17 -05:00
a2 - > set ( 0.5 , 0.5 , 0.0 , 1.0 ) ;
2011-11-07 15:06:13 -05:00
2012-02-02 23:18:30 -05:00
tbox - > pack_start ( * a1 , false , false ) ;
tbox - > pack_start ( * a2 , false , false ) ;
2006-08-01 18:58:24 -04:00
HBox * clock_box = manage ( new HBox ) ;
2011-11-17 17:49:13 -05:00
2011-06-02 13:50:37 -04:00
clock_box - > pack_start ( * primary_clock , false , false ) ;
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_small_screen ( ) & & ! ARDOUR : : Profile - > get_trx ( ) ) {
2011-06-02 13:50:37 -04:00
clock_box - > pack_start ( * secondary_clock , false , false ) ;
2007-04-06 20:35:07 -04:00
}
2015-04-22 18:22:20 -04:00
clock_box - > set_spacing ( PX_SCALE ( 3 ) ) ;
2008-01-10 16:20:59 -05:00
2014-09-10 20:34:09 -04:00
shuttle_box = manage ( new ShuttleControl ) ;
2011-04-19 22:48:20 -04:00
shuttle_box - > show ( ) ;
2015-10-05 10:17:49 -04:00
2011-04-19 22:48:20 -04:00
VBox * transport_vbox = manage ( new VBox ) ;
transport_vbox - > set_name ( " TransportBase " ) ;
2012-12-06 15:48:44 -05:00
transport_vbox - > set_border_width ( 0 ) ;
2015-04-22 18:22:20 -04:00
transport_vbox - > set_spacing ( PX_SCALE ( 3 ) ) ;
2011-11-07 12:47:49 -05:00
transport_vbox - > pack_start ( * tbox , true , true , 0 ) ;
2014-04-10 13:30:25 -04:00
if ( ! Profile - > get_trx ( ) ) {
transport_vbox - > pack_start ( * shuttle_box , false , false , 0 ) ;
}
time_info_box = manage ( new TimeInfoBox ) ;
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( * transport_vbox , false , true ) ;
2011-06-09 17:51:15 -04:00
2011-11-09 12:29:23 -05:00
/* transport related toggle controls */
VBox * auto_box = manage ( new VBox ) ;
auto_box - > set_homogeneous ( true ) ;
2015-04-22 18:22:20 -04:00
auto_box - > set_spacing ( PX_SCALE ( 2 ) ) ;
2014-09-04 17:16:48 -04:00
auto_box - > pack_start ( sync_button , true , true ) ;
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
2014-09-04 17:16:48 -04:00
auto_box - > pack_start ( follow_edits_button , true , true ) ;
2015-06-25 12:47:29 -04:00
auto_box - > pack_start ( auto_return_button , true , true ) ;
2014-04-10 13:30:25 -04:00
}
2011-11-09 12:29:23 -05:00
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( * auto_box , false , false ) ;
2014-04-10 13:30:25 -04:00
}
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( * clock_box , true , true ) ;
2011-06-09 11:44:09 -04:00
2014-04-10 13:30:25 -04:00
if ( ARDOUR : : Profile - > get_trx ( ) ) {
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( * auto_box , false , false ) ;
2014-04-10 13:30:25 -04:00
}
2011-06-03 18:18:47 -04:00
2014-04-10 13:30:25 -04:00
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( * time_info_box , false , false ) ;
2014-04-10 13:30:25 -04:00
}
if ( ! ARDOUR : : Profile - > get_trx ( ) ) {
2015-07-27 18:05:42 -04:00
transport_hbox . pack_start ( alert_box , false , false ) ;
transport_hbox . pack_start ( meter_box , false , false ) ;
transport_hbox . pack_start ( editor_meter_peak_display , false , false ) ;
2014-04-10 13:30:25 -04:00
}
2009-10-14 12:10:01 -04:00
2016-02-25 11:08:33 -05:00
Gtk : : VBox * window_button_box = manage ( new Gtk : : VBox ) ;
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 ) ) ;
/* catch context clicks so that we can show a menu on these buttons */
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 ) ;
editor_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-editor-visibility " ) ) ) ;
editor_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
mixer_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-mixer-visibility " ) ) ) ;
mixer_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
prefs_visibility_button . set_related_action ( ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " change-preferences-visibility " ) ) ) ;
prefs_visibility_button . set_name ( X_ ( " page switch button " ) ) ;
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 "
" To put the window back, use the Window > %1 > Attach menu action " ) , editor - > name ( ) ) ) ;
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 "
" To put the window back, use the Window > %1 > Attach menu action " ) , mixer - > name ( ) ) ) ;
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 "
" To put the window back, use the Window > %1 > Attach menu action " ) , rc_option_editor - > name ( ) ) ) ;
window_button_box - > pack_start ( editor_visibility_button , true , false ) ;
window_button_box - > pack_start ( mixer_visibility_button , true , false ) ;
window_button_box - > pack_start ( prefs_visibility_button , true , false ) ;
transport_hbox . pack_end ( * window_button_box , false , false ) ;
2016-04-24 18:16:08 -04:00
transport_hbox . pack_end ( action_script_table , false , false ) ;
2016-02-25 11:08:33 -05:00
2011-11-09 12:29:23 -05:00
/* desensitize */
set_transport_sensitivity ( false ) ;
2005-09-25 14:42:24 -04:00
}
2015-04-18 13:42:00 -04:00
# undef PX_SCALE
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : soloing_changed ( bool onoff )
{
if ( solo_alert_button . get_active ( ) ! = onoff ) {
solo_alert_button . set_active ( onoff ) ;
}
}
void
ARDOUR_UI : : _auditioning_changed ( bool onoff )
{
2011-11-14 17:59:40 -05:00
auditioning_alert_button . set_active ( onoff ) ;
set_transport_sensitivity ( ! onoff ) ;
2005-09-25 14:42:24 -04:00
}
void
ARDOUR_UI : : auditioning_changed ( bool onoff )
{
2010-03-30 11:18:43 -04:00
UI : : instance ( ) - > call_slot ( MISSING_INVALIDATOR , boost : : bind ( & ARDOUR_UI : : _auditioning_changed , this , onoff ) ) ;
2005-09-25 14:42:24 -04:00
}
2010-03-19 16:53:22 -04:00
bool
2010-09-02 13:01:36 -04:00
ARDOUR_UI : : audition_alert_press ( GdkEventButton * )
2005-09-25 14:42:24 -04:00
{
2009-12-17 13:24:23 -05:00
if ( _session ) {
_session - > cancel_audition ( ) ;
2005-09-25 14:42:24 -04:00
}
2010-11-25 15:37:39 -05:00
return true ;
2005-09-25 14:42:24 -04:00
}
2011-11-11 08:52:27 -05:00
bool
ARDOUR_UI : : feedback_alert_press ( GdkEventButton * )
{
return true ;
}
2015-03-14 12:28:20 -04:00
bool
2015-03-17 06:59:30 -04:00
ARDOUR_UI : : error_alert_press ( GdkEventButton * ev )
2015-03-14 12:28:20 -04:00
{
2015-03-20 17:48:53 -04:00
bool do_toggle = true ;
2015-03-20 17:12:40 -04:00
if ( ev - > button = = 1 ) {
2015-03-20 17:48:53 -04:00
if ( _log_not_acknowledged = = LogLevelError ) {
// just acknowledge the error, don't hide the log if it's already visible
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " toggle-log-window " ) ) ;
Glib : : RefPtr < ToggleAction > tact = Glib : : RefPtr < ToggleAction > : : cast_dynamic ( act ) ;
if ( tact & & tact - > get_active ( ) ) {
do_toggle = false ;
}
}
2015-03-20 17:12:40 -04:00
_log_not_acknowledged = LogLevelNone ;
error_blink ( false ) ; // immediate acknowledge
2015-03-17 06:59:30 -04:00
}
2015-03-20 17:48:53 -04:00
// maybe fall through to to button toggle
return ! do_toggle ;
2015-03-14 12:28:20 -04:00
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : solo_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 ) {
2005-09-25 14:42:24 -04:00
return ;
}
2009-10-14 12:10:01 -04:00
2010-03-19 16:53:22 -04:00
if ( _session - > soloing ( ) | | _session - > listening ( ) ) {
2005-09-25 14:42:24 -04:00
if ( onoff ) {
2011-11-14 12:52:38 -05:00
solo_alert_button . set_active ( true ) ;
2005-09-25 14:42:24 -04:00
} else {
2011-11-14 12:52:38 -05:00
solo_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
} else {
solo_alert_button . set_active ( false ) ;
}
}
2009-11-09 15:05:18 -05:00
void
ARDOUR_UI : : sync_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 | | ! _session - > config . get_external_sync ( ) ) {
2009-11-09 23:30:08 -05:00
/* internal sync */
2011-11-14 12:52:38 -05:00
sync_button . set_active ( false ) ;
2009-11-09 15:05:18 -05:00
return ;
}
2009-12-17 13:24:23 -05:00
if ( ! _session - > transport_locked ( ) ) {
2009-11-09 23:30:08 -05:00
/* not locked, so blink on and off according to the onoff argument */
2009-11-09 15:05:18 -05:00
if ( onoff ) {
2011-11-14 12:52:38 -05:00
sync_button . set_active ( true ) ;
2009-11-09 15:05:18 -05:00
} else {
2011-11-14 12:52:38 -05:00
sync_button . set_active ( false ) ;
2009-11-09 15:05:18 -05:00
}
} else {
2009-11-09 23:30:08 -05:00
/* locked */
2011-11-14 12:52:38 -05:00
sync_button . set_active ( true ) ;
2009-11-09 15:05:18 -05:00
}
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : audition_blink ( bool onoff )
{
2009-12-17 13:24:23 -05:00
if ( _session = = 0 ) {
2005-09-25 14:42:24 -04:00
return ;
}
2009-10-14 12:10:01 -04:00
2009-12-17 13:24:23 -05:00
if ( _session - > is_auditioning ( ) ) {
2005-09-25 14:42:24 -04:00
if ( onoff ) {
2011-11-14 13:52:44 -05:00
auditioning_alert_button . set_active ( true ) ;
2005-09-25 14:42:24 -04:00
} else {
2011-11-14 13:52:44 -05:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
} else {
2011-11-14 17:57:03 -05:00
auditioning_alert_button . set_active ( false ) ;
2005-09-25 14:42:24 -04:00
}
}
2011-11-11 08:52:27 -05:00
void
ARDOUR_UI : : feedback_blink ( bool onoff )
{
if ( _feedback_exists ) {
if ( onoff ) {
feedback_alert_button . set_active ( true ) ;
} else {
feedback_alert_button . set_active ( false ) ;
}
} else {
feedback_alert_button . set_active ( false ) ;
}
}
2015-03-14 12:28:20 -04:00
void
ARDOUR_UI : : error_blink ( bool onoff )
{
2015-03-16 14:04:17 -04:00
switch ( _log_not_acknowledged ) {
case LogLevelError :
// blink
if ( onoff ) {
error_alert_button . set_custom_led_color ( 0xff0000ff ) ; // bright red
} else {
error_alert_button . set_custom_led_color ( 0x880000ff ) ; // dark red
}
break ;
case LogLevelWarning :
error_alert_button . set_custom_led_color ( 0xccaa00ff ) ; // yellow
break ;
case LogLevelInfo :
error_alert_button . set_custom_led_color ( 0x88cc00ff ) ; // lime green
break ;
default :
error_alert_button . set_custom_led_color ( 0x333333ff ) ; // gray
break ;
2015-03-14 12:28:20 -04:00
}
}
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : set_transport_sensitivity ( bool yn )
{
2005-12-21 16:37:18 -05:00
ActionManager : : set_sensitive ( ActionManager : : transport_sensitive_actions , yn ) ;
2011-04-19 22:48:20 -04:00
shuttle_box - > set_sensitive ( yn ) ;
2005-09-25 14:42:24 -04:00
}
2005-12-21 16:37:18 -05:00
void
ARDOUR_UI : : editor_realized ( )
{
2009-12-12 10:02:15 -05:00
boost : : function < void ( string ) > pc ( boost : : bind ( & ARDOUR_UI : : parameter_changed , this , _1 ) ) ;
Config - > map_parameters ( pc ) ;
2006-09-25 17:24:00 -04:00
2015-01-02 09:44:54 -05:00
UIConfiguration : : instance ( ) . reset_dpi ( ) ;
2005-12-21 16:37:18 -05:00
}
2005-12-31 13:20:42 -05:00
2006-01-19 13:05:31 -05:00
void
2012-06-13 00:21:46 -04:00
ARDOUR_UI : : 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 ) ;
rc_option_editor - > set_current_page ( _ ( " GUI " ) ) ;
}
2014-07-14 13:19:52 -04:00
}
2011-02-17 13:53:31 -05:00
bool
ARDOUR_UI : : click_button_clicked ( GdkEventButton * ev )
{
if ( ev - > button ! = 3 ) {
/* this handler is just for button-3 clicks */
return false ;
}
2015-07-27 17:12:35 -04:00
show_tabbable ( rc_option_editor ) ;
2016-07-25 19:46:16 -04:00
rc_option_editor - > set_current_page ( _ ( " Misc/Click " ) ) ;
2011-02-17 13:53:31 -05:00
return true ;
}
2011-12-01 18:22:05 -05:00
void
2014-07-03 13:25:35 -04:00
ARDOUR_UI : : toggle_follow_edits ( )
2011-12-01 18:22:05 -05:00
{
2012-11-20 14:43:43 -05:00
RefPtr < Action > act = ActionManager : : get_action ( X_ ( " Transport " ) , X_ ( " ToggleFollowEdits " ) ) ;
2012-01-30 17:53:22 -05:00
assert ( act ) ;
RefPtr < ToggleAction > tact = RefPtr < ToggleAction > : : cast_dynamic ( act ) ;
assert ( tact ) ;
2015-01-02 09:44:54 -05:00
UIConfiguration : : instance ( ) . set_follow_edits ( tact - > get_active ( ) ) ;
2011-12-01 18:22:05 -05:00
}
2012-01-30 17:53:22 -05:00
2015-07-09 13:56:12 -04:00
void
ARDOUR_UI : : update_title ( )
{
if ( _session ) {
bool dirty = _session - > dirty ( ) ;
2015-10-05 10:17:49 -04:00
2015-07-09 13:56:12 -04:00
string session_name ;
if ( _session - > snap_name ( ) ! = _session - > name ( ) ) {
session_name = _session - > snap_name ( ) ;
} else {
session_name = _session - > name ( ) ;
}
if ( dirty ) {
session_name = " * " + session_name ;
}
WindowTitle title ( session_name ) ;
title + = Glib : : get_application_name ( ) ;
_main_window . set_title ( title . get_string ( ) ) ;
} else {
WindowTitle title ( Glib : : get_application_name ( ) ) ;
_main_window . set_title ( title . get_string ( ) ) ;
}
2015-07-23 08:35:24 -04:00
2015-07-09 13:56:12 -04:00
}