2005-09-25 14:42:24 -04:00
/*
2019-08-02 17:26:43 -04:00
* Copyright ( C ) 2005 - 2019 Paul Davis < paul @ linuxaudiosystems . com >
* Copyright ( C ) 2005 Taybin Rutkin < taybin @ taybin . com >
* Copyright ( C ) 2006 - 2015 Tim Mayberry < mojofunk @ gmail . com >
* Copyright ( C ) 2007 - 2011 David Robillard < d @ drobilla . net >
* Copyright ( C ) 2009 - 2012 Carl Hetherington < carl @ carlh . net >
* Copyright ( C ) 2013 - 2018 Robin Gareus < robin @ gareus . org >
* Copyright ( C ) 2016 - 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
/* this file exists solely to break compilation dependencies that
would connect changes to the mixer or editor objects .
*/
# include <cstdio>
2005-11-29 17:48:54 -05:00
2009-02-25 13:26:51 -05:00
# include "pbd/error.h"
2007-01-03 13:48:27 -05:00
2009-10-30 11:30:22 -04:00
# include "ardour/session.h"
2019-11-22 14:05:04 -05:00
# include "ardour/lv2_plugin.h"
2024-03-20 08:49:18 -04:00
# include "ardour/profile.h"
2009-10-30 11:30:22 -04:00
2015-08-10 14:31:59 -04:00
# include "gtkmm2ext/bindings.h"
2024-03-20 08:49:18 -04:00
# include "widgets/ardour_button.h"
2014-07-04 07:49:26 -04:00
# include "actions.h"
2019-12-14 17:31:24 -05:00
# include "ardour_message.h"
2005-09-25 14:42:24 -04:00
# include "ardour_ui.h"
2021-12-10 17:15:56 -05:00
# include "audio_clip_editor.h"
2005-09-25 14:42:24 -04:00
# include "public_editor.h"
2015-01-02 09:44:54 -05:00
# include "meterbridge.h"
2017-02-17 05:15:14 -05:00
# include "luainstance.h"
2016-02-23 09:42:13 -05:00
# include "luawindow.h"
2024-03-22 20:57:59 -04:00
# include "livetrax_meters.h"
2024-04-08 13:12:10 -04:00
# include "livetrax_tc_widget.h"
2024-03-20 08:49:18 -04:00
# include "main_clock.h"
2024-03-21 00:20:05 -04:00
# include "meterbridge.h"
2005-09-25 14:42:24 -04: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-09-25 14:42:24 -04:00
# include "keyboard.h"
2017-02-18 10:14:41 -05:00
# include "keyeditor.h"
2015-10-22 19:19:24 -04:00
# include "rc_option_editor.h"
2005-09-25 14:42:24 -04:00
# include "route_params_ui.h"
2024-03-20 08:49:18 -04:00
# include "selection_properties_box.h"
2016-12-19 21:11:21 -05:00
# include "time_info_box.h"
2021-12-30 11:53:17 -05:00
# include "trigger_ui.h"
2018-12-19 16:17:05 -05:00
# include "step_entry.h"
2008-02-16 17:43:18 -05:00
# include "opts.h"
2015-07-23 08:35:24 -04:00
2019-11-22 14:05:04 -05:00
# ifdef GDK_WINDOWING_X11
# include <gdk/gdkx.h>
# endif
2005-09-25 14:42:24 -04:00
2020-08-19 11:40:02 -04:00
# include "pbd/i18n.h"
2005-11-29 17:48:54 -05:00
using namespace Gtk ;
2006-06-21 19:01:03 -04:00
using namespace PBD ;
2024-03-20 08:49:18 -04:00
using namespace ArdourWidgets ;
2005-09-25 14:42:24 -04:00
namespace ARDOUR {
class Session ;
class Route ;
}
2008-02-16 17:43:18 -05:00
using namespace ARDOUR ;
2018-12-10 16:24:27 -05:00
using namespace Gtkmm2ext ;
2008-02-16 17:43:18 -05:00
2005-09-25 14:42:24 -04:00
void
ARDOUR_UI : : we_have_dependents ( )
{
2019-01-13 13:01:18 -05:00
install_dependent_actions ( ) ;
2018-12-11 10:28:47 -05:00
/* The monitor section relies on at least 1 action defined by us. Since that
* action now exists , give it a chance to use it .
*/
mixer - > monitor_section ( ) . use_others_actions ( ) ;
2018-12-19 17:15:23 -05:00
StepEntry : : setup_actions_and_bindings ( ) ;
2021-12-10 17:15:56 -05:00
ClipEditorBox : : init ( ) ;
2019-01-13 13:01:18 -05:00
2015-08-10 14:31:59 -04:00
/* Global, editor, mixer, processor box actions are defined now. Link
them with any bindings , so that GTK does not get a chance to define
the GTK accel map entries first when we ask the GtkUIManager to
2015-10-26 14:35:06 -04:00
create menus / widgets .
2015-08-10 14:31:59 -04:00
If GTK adds the actions to its accel map before we do , we lose our
freedom to use any keys . More precisely , we can use any keys , but
ones that GTK considers illegal as accelerators will not show up in
menus .
There are other dynamic actions that can be created by a monitor
section , by step entry dialogs . These need to be handled
separately . They don ' t tend to use GTK - illegal bindings and more
importantly they don ' t have menus showing the bindings , so it is
less of an issue .
*/
2015-10-26 14:35:06 -04:00
2015-08-10 14:31:59 -04:00
Gtkmm2ext : : Bindings : : associate_all ( ) ;
2015-10-26 14:35:06 -04:00
2009-12-11 18:29:48 -05:00
editor - > UpdateAllTransportClocks . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : update_transport_clocks ) ) ;
2011-11-15 14:33:09 -05:00
2014-07-04 07:49:26 -04:00
/* all actions are defined */
ActionManager : : load_menus ( ARDOUR_COMMAND_LINE : : menus_file ) ;
2015-07-23 08:35:24 -04:00
/* catch up on parameters */
2015-10-26 14:35:06 -04:00
2015-07-23 08:35:24 -04:00
boost : : function < void ( std : : string ) > pc ( boost : : bind ( & ARDOUR_UI : : parameter_changed , this , _1 ) ) ;
Config - > map_parameters ( pc ) ;
2015-10-22 19:19:24 -04:00
UIConfiguration : : instance ( ) . reset_dpi ( ) ;
2005-09-25 14:42:24 -04:00
}
void
ARDOUR_UI : : connect_dependents_to_session ( ARDOUR : : Session * s )
{
2014-09-06 06:52:29 -04:00
DisplaySuspender ds ;
2008-02-16 17:43:18 -05:00
BootMessage ( _ ( " Setup Editor " ) ) ;
2009-12-17 13:24:23 -05:00
editor - > set_session ( s ) ;
2024-05-02 10:21:34 -04:00
_livetrax_sections - > set_session ( s ) ;
2008-02-16 17:43:18 -05:00
BootMessage ( _ ( " Setup Mixer " ) ) ;
2009-12-17 13:24:23 -05:00
mixer - > set_session ( s ) ;
2024-03-20 08:49:18 -04:00
if ( ! Profile - > get_livetrax ( ) ) {
recorder - > set_session ( s ) ;
trigger_page - > set_session ( s ) ;
meterbridge - > set_session ( s ) ;
} else {
livetrax_time_info_box - > set_session ( s ) ;
}
2006-12-18 21:41:19 -05:00
/* its safe to do this now */
2009-10-14 12:10:01 -04:00
2008-02-16 17:43:18 -05:00
BootMessage ( _ ( " Reload Session History " ) ) ;
2006-12-18 21:41:19 -05:00
s - > restore_history ( " " ) ;
2005-09-25 14:42:24 -04:00
}
2009-11-26 08:26:30 -05:00
/** The main editor window has been closed */
2005-09-25 14:42:24 -04:00
gint
2009-07-21 11:55:17 -04:00
ARDOUR_UI : : exit_on_main_window_close ( GdkEventAny * /*ev*/ )
2005-09-25 14:42:24 -04:00
{
2018-02-15 17:32:37 -05:00
# ifdef __APPLE__
2008-12-12 09:43:24 -05:00
/* just hide the window, and return - the top menu stays up */
editor - > hide ( ) ;
return TRUE ;
# else
/* time to get out of here */
2005-09-25 14:42:24 -04:00
finish ( ) ;
return TRUE ;
2008-12-12 09:43:24 -05:00
# endif
2005-09-25 14:42:24 -04:00
}
2010-03-18 22:49:01 -04:00
2015-07-07 22:12:21 -04:00
GtkNotebook *
2015-04-21 15:10:49 -04:00
ARDOUR_UI : : tab_window_root_drop ( GtkNotebook * src ,
GtkWidget * w ,
gint x ,
gint y ,
gpointer )
{
using namespace std ;
2015-07-07 22:12:21 -04:00
Gtk : : Notebook * nb = 0 ;
Gtk : : Window * win = 0 ;
2017-07-16 22:55:52 -04:00
ArdourWidgets : : Tabbable * tabbable = 0 ;
2015-07-07 22:12:21 -04:00
2015-04-21 15:10:49 -04:00
2015-07-08 15:38:04 -04:00
if ( w = = GTK_WIDGET ( editor - > contents ( ) . gobj ( ) ) ) {
tabbable = editor ;
} else if ( w = = GTK_WIDGET ( mixer - > contents ( ) . gobj ( ) ) ) {
tabbable = mixer ;
2024-04-17 22:49:54 -04:00
# ifndef LIVETRAX
2015-07-08 15:38:04 -04:00
} else if ( w = = GTK_WIDGET ( rc_option_editor - > contents ( ) . gobj ( ) ) ) {
tabbable = rc_option_editor ;
2024-04-17 22:49:54 -04:00
# endif
2020-10-26 17:55:00 -04:00
} else if ( w = = GTK_WIDGET ( recorder - > contents ( ) . gobj ( ) ) ) {
tabbable = recorder ;
2021-11-08 20:27:38 -05:00
} else if ( w = = GTK_WIDGET ( trigger_page - > contents ( ) . gobj ( ) ) ) {
tabbable = trigger_page ;
2016-01-25 15:56:59 -05:00
} else {
2015-07-08 15:38:04 -04:00
return 0 ;
2015-04-21 15:10:49 -04:00
}
2015-07-08 15:38:04 -04:00
nb = tabbable - > tab_root_drop ( ) ;
win = tabbable - > own_window ( ) ;
2015-07-07 22:12:21 -04:00
if ( nb ) {
win - > move ( x , y ) ;
win - > show_all ( ) ;
win - > present ( ) ;
return nb - > gobj ( ) ;
}
2015-10-26 14:35:06 -04:00
2015-07-07 22:12:21 -04:00
return 0 ; /* what was that? */
2015-04-21 15:10:49 -04:00
}
2015-07-27 10:50:35 -04:00
bool
ARDOUR_UI : : idle_ask_about_quit ( )
{
2022-05-06 04:11:06 -04:00
const auto ask_before_closing = UIConfiguration : : instance ( ) . get_ask_before_closing_last_window ( ) ;
if ( ( _session & & _session - > dirty ( ) ) | | ! ask_before_closing ) {
2015-07-27 10:50:35 -04:00
finish ( ) ;
} else {
/* no session or session not dirty, but still ask anyway */
2019-12-14 17:31:24 -05:00
ArdourMessageDialog msg ( string_compose ( _ ( " Quit %1? " ) , PROGRAM_NAME ) ,
false , /* no markup */
Gtk : : MESSAGE_INFO ,
Gtk : : BUTTONS_YES_NO ,
true ) ; /* modal */
2015-07-27 10:50:35 -04:00
msg . set_default_response ( Gtk : : RESPONSE_YES ) ;
2023-03-11 22:20:59 -05:00
msg . set_position ( WIN_POS_MOUSE ) ;
2015-07-27 10:50:35 -04:00
2022-05-06 04:11:06 -04:00
if ( msg . run ( ) = = Gtk : : RESPONSE_YES ) {
2015-07-27 10:50:35 -04:00
finish ( ) ;
}
}
/* not reached but keep the compiler happy */
return false ;
}
bool
ARDOUR_UI : : main_window_delete_event ( GdkEventAny * ev )
{
/* quit the application as soon as we go idle. If we call this here,
* the window manager / desktop can think we ' re taking too longer to
* handle the " delete " event
*/
2015-10-26 14:35:06 -04:00
Glib : : signal_idle ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : idle_ask_about_quit ) ) ;
2015-07-27 10:50:35 -04:00
return true ;
}
2015-07-27 17:12:35 -04:00
static GtkNotebook *
tab_window_root_drop ( GtkNotebook * src ,
2017-07-01 12:42:24 -04:00
GtkWidget * w ,
gint x ,
gint y ,
gpointer user_data )
2015-07-27 17:12:35 -04:00
{
return ARDOUR_UI : : instance ( ) - > tab_window_root_drop ( src , w , x , y , user_data ) ;
}
int
ARDOUR_UI : : setup_windows ( )
{
2024-03-20 08:49:18 -04:00
if ( ARDOUR : : Profile - > get_livetrax ( ) ) {
return livetrax_setup_windows ( ) ;
}
2016-12-18 10:02:13 -05:00
_tabs . set_show_border ( false ) ;
2015-11-18 22:25:18 -05:00
_tabs . signal_switch_page ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabs_switch ) ) ;
2015-11-18 23:45:48 -05:00
_tabs . signal_page_added ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabs_page_added ) ) ;
_tabs . signal_page_removed ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabs_page_removed ) ) ;
2015-07-27 17:12:35 -04:00
rc_option_editor = new RCOptionEditor ;
2024-04-17 22:49:54 -04:00
# ifndef LIVETRAX
2015-07-27 17:12:35 -04:00
rc_option_editor - > StateChange . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : tabbable_state_change ) ) ;
2024-04-17 22:49:54 -04:00
# endif
2015-07-27 17:12:35 -04:00
if ( create_editor ( ) ) {
error < < _ ( " UI: cannot setup editor " ) < < endmsg ;
return - 1 ;
}
if ( create_mixer ( ) ) {
error < < _ ( " UI: cannot setup mixer " ) < < endmsg ;
return - 1 ;
}
2020-10-26 17:55:00 -04:00
if ( create_recorder ( ) ) {
error < < _ ( " UI: cannot setup recorder " ) < < endmsg ;
return - 1 ;
}
2021-11-08 20:27:38 -05:00
if ( create_trigger_page ( ) ) {
2023-01-12 14:08:56 -05:00
error < < _ ( " UI: cannot setup trigger " ) < < endmsg ;
2021-11-08 20:27:38 -05:00
return - 1 ;
}
2015-07-27 17:12:35 -04:00
if ( create_meterbridge ( ) ) {
error < < _ ( " UI: cannot setup meterbridge " ) < < endmsg ;
return - 1 ;
}
2018-12-10 18:19:31 -05:00
time_info_box = new TimeInfoBox ( " ToolbarTimeInfo " , false ) ;
/* all other dialogs are created conditionally */
we_have_dependents ( ) ;
2015-07-27 17:12:35 -04:00
/* order of addition affects order seen in initial window display */
2015-10-26 14:35:06 -04:00
2024-04-17 22:49:54 -04:00
# ifndef LIVETRAX
2021-02-18 12:04:57 -05:00
rc_option_editor - > add_to_notebook ( _tabs ) ;
2024-04-17 22:49:54 -04:00
# endif
2021-02-18 12:04:57 -05:00
mixer - > add_to_notebook ( _tabs ) ;
editor - > add_to_notebook ( _tabs ) ;
recorder - > add_to_notebook ( _tabs ) ;
2021-11-08 20:27:38 -05:00
trigger_page - > add_to_notebook ( _tabs ) ;
2015-07-27 17:12:35 -04:00
top_packer . pack_start ( menu_bar_base , false , false ) ;
main_vpacker . pack_start ( top_packer , false , false ) ;
2018-02-19 09:05:55 -05:00
ArdourWidgets : : ArdourDropShadow * spacer = manage ( new ( ArdourWidgets : : ArdourDropShadow ) ) ;
spacer - > set_size_request ( - 1 , 4 ) ;
spacer - > show ( ) ;
2017-09-18 12:39:17 -04:00
/* now add the transport sample to the top of main window */
2015-10-26 14:35:06 -04:00
2018-02-19 09:05:55 -05:00
main_vpacker . pack_start ( * spacer , false , false ) ;
2017-09-18 14:45:56 -04:00
main_vpacker . pack_start ( transport_frame , false , false ) ;
2015-07-27 17:12:35 -04:00
main_vpacker . pack_start ( _tabs , true , true ) ;
2020-04-23 20:31:30 -04:00
LuaInstance : : instance ( ) - > ActionChanged . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : action_script_changed ) ) ;
2017-02-17 12:56:18 -05:00
2019-09-02 22:31:35 -04:00
for ( int i = 0 ; i < MAX_LUA_ACTION_BUTTONS ; + + i ) {
2020-04-28 12:32:24 -04:00
std : : string const a = string_compose ( X_ ( " script-%1 " ) , i + 1 ) ;
2019-09-02 22:31:35 -04:00
Glib : : RefPtr < Action > act = ActionManager : : get_action ( X_ ( " LuaAction " ) , a . c_str ( ) ) ;
2016-04-24 18:16:08 -04:00
assert ( act ) ;
2020-01-12 18:22:39 -05:00
action_script_call_btn [ i ] . set_name ( " lua action button " ) ;
2019-11-18 20:47:11 -05:00
action_script_call_btn [ i ] . set_text ( string_compose ( " %1%2 " , std : : hex , i + 1 ) ) ;
2016-04-24 18:16:08 -04:00
action_script_call_btn [ i ] . set_related_action ( act ) ;
2017-02-17 05:15:14 -05:00
action_script_call_btn [ i ] . signal_button_press_event ( ) . connect ( sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : bind_lua_action_script ) , i ) , false ) ;
2016-05-24 21:17:53 -04:00
if ( act - > get_sensitive ( ) ) {
action_script_call_btn [ i ] . set_visual_state ( Gtkmm2ext : : VisualState ( action_script_call_btn [ i ] . visual_state ( ) & ~ Gtkmm2ext : : Insensitive ) ) ;
} else {
action_script_call_btn [ i ] . set_visual_state ( Gtkmm2ext : : VisualState ( action_script_call_btn [ i ] . visual_state ( ) | Gtkmm2ext : : Insensitive ) ) ;
}
2019-12-04 18:44:10 -05:00
action_script_call_btn [ i ] . set_sizing_text ( " 88 " ) ;
2016-04-24 18:16:08 -04:00
action_script_call_btn [ i ] . set_no_show_all ( ) ;
}
2015-07-27 17:12:35 -04:00
setup_transport ( ) ;
build_menu_bar ( ) ;
setup_tooltips ( ) ;
_main_window . signal_delete_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : main_window_delete_event ) ) ;
2015-10-26 14:35:06 -04:00
2015-07-27 17:12:35 -04:00
/* pack the main vpacker into the main window and show everything
*/
_main_window . add ( main_vpacker ) ;
2017-09-18 14:45:56 -04:00
transport_frame . show_all ( ) ;
2015-07-27 17:12:35 -04:00
2022-09-03 11:39:24 -04:00
apply_window_settings ( true ) ;
2015-10-26 14:35:06 -04:00
2015-07-27 17:12:35 -04:00
setup_toplevel_window ( _main_window , " " , this ) ;
2015-11-19 17:46:44 -05:00
_main_window . show_all ( ) ;
2015-10-26 14:35:06 -04:00
2015-11-17 17:49:27 -05:00
_tabs . set_show_tabs ( false ) ;
2015-07-27 17:12:35 -04:00
/* It would be nice if Gtkmm had wrapped this rather than just
* deprecating the old set_window_creation_hook ( ) method , but oh well . . .
*/
g_signal_connect ( _tabs . gobj ( ) , " create-window " , ( GCallback ) : : tab_window_root_drop , this ) ;
2019-11-22 14:05:04 -05:00
# ifdef GDK_WINDOWING_X11
/* allow externalUIs to be transient, on top of the main window */
LV2Plugin : : set_main_window_id ( GDK_DRAWABLE_XID ( _main_window . get_window ( ) - > gobj ( ) ) ) ;
# endif
2022-09-03 11:39:24 -04:00
return 0 ;
2022-08-09 18:46:54 -04:00
}
2024-03-20 08:49:18 -04:00
int
ARDOUR_UI : : livetrax_setup_windows ( )
{
2024-03-26 13:37:16 -04:00
using namespace Menu_Helpers ;
using namespace Gtk ;
2024-04-17 22:49:54 -04:00
rc_option_editor = new RCOptionEditor ;
2024-05-02 13:10:46 -04:00
rc_option_editor - > hide ( ) ;
2024-04-17 22:49:54 -04:00
2024-05-02 13:10:46 -04:00
ArdourButton : : set_default_tweaks ( ArdourButton : : Tweaks ( ArdourButton : : ForceFlat ) ) ;
2024-03-20 08:49:18 -04:00
if ( create_editor ( ) ) {
error < < _ ( " UI: cannot setup editor " ) < < endmsg ;
return - 1 ;
}
if ( create_mixer ( ) ) {
error < < _ ( " UI: cannot setup mixer " ) < < endmsg ;
return - 1 ;
}
2024-05-02 13:10:46 -04:00
_livetrax_sections = new EditorSections ( ) ;
Image * icon = manage ( new Image ( ARDOUR_UI_UTILS : : get_icon ( " harrison " ) ) ) ;
VBox * icon_vb = manage ( new VBox ( ) ) ;
icon_vb - > pack_start ( * icon ) ;
2024-03-20 08:49:18 -04:00
2024-03-26 13:37:16 -04:00
VBox * vb ;
HBox * hb ;
2024-03-22 20:57:59 -04:00
ArdourButton : : Element elements ( ArdourButton : : Element ( ArdourButton : : Text | ArdourButton : : VectorIcon ) ) ;
2024-03-25 20:36:11 -04:00
Gtkmm2ext : : Bindings * bindings ;
2024-03-25 21:05:45 -04:00
Glib : : RefPtr < Action > act ;
2024-03-20 08:49:18 -04:00
2024-05-02 13:10:46 -04:00
livetrax_top_table . set_border_width ( 4 ) ;
2024-03-20 08:49:18 -04:00
2024-03-26 13:37:16 -04:00
EventBox * ev_dsp = manage ( new EventBox ) ;
EventBox * ev_timecode = manage ( new EventBox ) ;
2024-03-20 08:49:18 -04:00
ev_dsp - > set_name ( " MainMenuBar " ) ;
ev_timecode - > set_name ( " MainMenuBar " ) ;
ev_dsp - > add ( dsp_load_label ) ;
ev_timecode - > add ( timecode_format_label ) ;
2024-03-26 13:37:16 -04:00
livetrax_ff_dropdown = manage ( new ArdourDropdown ( ) ) ;
Menu_Helpers : : MenuList & items ( livetrax_ff_dropdown - > items ( ) ) ;
items . push_back ( MenuElem ( _ ( " 24 bit WAV/RF64 " ) , sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : livetrax_set_file_format ) , LiveTraxFileFormat ( ARDOUR : : FormatInt24 , ARDOUR : : RF64_WAV ) ) ) ) ;
items . push_back ( MenuElem ( _ ( " 24 bit FLAC " ) , sigc : : bind ( sigc : : mem_fun ( * this , & ARDOUR_UI : : livetrax_set_file_format ) , LiveTraxFileFormat ( ARDOUR : : FormatInt24 , ARDOUR : : FLAC ) ) ) ) ;
2024-03-22 20:57:59 -04:00
livetrax_sr_button = manage ( new ArdourButton ( " " ) ) ;
2024-03-20 08:49:18 -04:00
2024-04-08 13:12:10 -04:00
CairoWidget * cw = new LiveTraxTCWidget ;
cw - > show ( ) ;
2024-03-20 08:49:18 -04:00
2024-03-21 00:20:05 -04:00
livetrax_multi_out_button = manage ( new ArdourButton ( _ ( " Multi Out " ) ) ) ;
livetrax_stereo_out_button = manage ( new ArdourButton ( _ ( " Stereo Out " ) ) ) ;
2024-04-04 18:06:39 -04:00
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " disable-virtual-soundcheck " ) ) ;
livetrax_stereo_out_button - > set_related_action ( act ) ;
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " enable-virtual-soundcheck " ) ) ;
livetrax_multi_out_button - > set_related_action ( act ) ;
2024-03-20 08:49:18 -04:00
2024-05-02 13:10:46 -04:00
livetrax_view_in_folder_button = manage ( new ArdourButton ( elements ) ) ;
livetrax_view_in_folder_button - > set_icon ( ArdourWidgets : : ArdourIcon : : Folder ) ;
2024-03-20 08:49:18 -04:00
2024-05-02 13:10:46 -04:00
livetrax_editor_view_button = manage ( new ArdourButton ( _ ( " TRACKS " ) , ArdourButton : : Element ( ArdourButton : : Text | ArdourButton : : Edge | ArdourButton : : Body ) , true ) ) ;
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " livetrax-toggle-editor " ) ) ;
livetrax_editor_view_button - > set_related_action ( act ) ;
2024-03-20 08:49:18 -04:00
2024-05-02 13:10:46 -04:00
livetrax_prefs_view_button = manage ( new ArdourButton ( _ ( " PREFS " ) , ArdourButton : : Element ( ArdourButton : : Text | ArdourButton : : Edge | ArdourButton : : Body ) , true ) ) ;
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " livetrax-toggle-prefs " ) ) ;
livetrax_prefs_view_button - > set_related_action ( act ) ;
2024-03-20 08:49:18 -04:00
2024-04-25 10:52:35 -04:00
livetrax_meter_view_button = manage ( new ArdourButton ( ArdourButton : : Element ( ArdourButton : : Text | ArdourButton : : Edge | ArdourButton : : Body ) , true ) ) ; ;
livetrax_meter_view_button - > set_icon ( ArdourWidgets : : ArdourIcon : : Meters ) ;
2024-03-25 21:05:45 -04:00
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " livetrax-toggle-meter " ) ) ;
livetrax_meter_view_button - > set_related_action ( act ) ;
2024-04-25 10:52:35 -04:00
livetrax_mixer_view_button = manage ( new ArdourButton ( ArdourButton : : Element ( ArdourButton : : Text | ArdourButton : : Edge | ArdourButton : : Body ) , true ) ) ;
livetrax_mixer_view_button - > set_icon ( ArdourWidgets : : ArdourIcon : : Mixer ) ;
2024-03-25 21:05:45 -04:00
act = ActionManager : : get_action ( X_ ( " Common " ) , X_ ( " livetrax-toggle-mixer " ) ) ;
livetrax_mixer_view_button - > set_related_action ( act ) ;
2024-05-02 13:10:46 -04:00
HBox * view_box = manage ( new HBox ) ;
view_box - > set_spacing ( 4 ) ;
view_box - > pack_start ( * livetrax_meter_view_button , false , false ) ;
view_box - > pack_start ( * livetrax_editor_view_button , false , false ) ;
view_box - > pack_start ( * livetrax_mixer_view_button , false , false ) ;
2024-03-21 00:20:05 -04:00
2024-05-02 13:10:46 -04:00
livetrax_lock_button = manage ( new ArdourButton ( elements , true ) ) ;
2024-04-25 10:52:35 -04:00
livetrax_lock_button - > set_icon ( ArdourWidgets : : ArdourIcon : : Lock ) ;
act = ActionManager : : get_action ( X_ ( " Editor " ) , X_ ( " lock " ) ) ;
livetrax_lock_button - > set_related_action ( act ) ;
2024-03-21 00:20:05 -04:00
2024-05-02 13:10:46 -04:00
int TCOL = 0 ;
livetrax_top_table . attach ( * livetrax_lock_button , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * livetrax_view_in_folder_button , TCOL + 1 , TCOL + 2 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * livetrax_prefs_view_button , TCOL + 2 , TCOL + 3 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * view_box , TCOL , TCOL + 3 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + = 3 ;
livetrax_top_table . attach ( * manage ( new Label ( " " ) ) , TCOL , TCOL + 1 , 0 , 2 , EXPAND , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( transport_ctrl , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( _livetrax_btn_prev_marker , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( _livetrax_btn_marker_new , TCOL + 1 , TCOL + 2 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( _livetrax_btn_next_marker , TCOL + 2 , TCOL + 3 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * primary_clock , TCOL , TCOL + 3 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + = 3 ;
// livetrax_top_table.attach (*manage(new Label("")), TCOL, TCOL+1, 0, 2, EXPAND, FILL, 4, 4); TCOL++;
livetrax_top_table . attach ( * icon_vb , TCOL , TCOL + 1 , 0 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( _livetrax_btn_rec_all , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( _livetrax_btn_rec_none , TCOL + 1 , TCOL + 2 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( _livetrax_btn_peak_reset , TCOL + 2 , TCOL + 3 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( editor - > _track_box , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( * editor - > mouse_mode_hbox , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( editor - > _zoom_box , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
2024-03-21 00:20:05 -04:00
2024-05-02 13:10:46 -04:00
livetrax_top_table . attach ( * manage ( new Label ( " " ) ) , TCOL , TCOL + 1 , 0 , 2 , EXPAND , FILL , 4 , 4 ) ; TCOL + + ;
2024-03-21 00:20:05 -04:00
2024-05-02 13:10:46 -04:00
livetrax_top_table . attach ( sync_button , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( * livetrax_ff_dropdown , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * livetrax_sr_button , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
// livetrax_top_table.attach (*cw, TCOL, TCOL+1, 0, 2, FILL, FILL, 4, 4); TCOL++;
livetrax_top_table . attach ( * livetrax_stereo_out_button , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( * livetrax_multi_out_button , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
livetrax_top_table . attach ( * ev_dsp , TCOL , TCOL + 1 , 0 , 1 , FILL , FILL , 4 , 4 ) ;
livetrax_top_table . attach ( disk_space_label , TCOL , TCOL + 1 , 1 , 2 , FILL , FILL , 4 , 4 ) ; TCOL + + ;
/* editor bar */
TCOL = 0 ;
livetrax_time_info_box = new TimeInfoBox ( " LiveTraxTimeInfo " , false ) ;
// livetrax_edit_table.attach (*livetrax_time_info_box, TCOL, TCOL+1, 0, 2, FILL, FILL, 4, 4); TCOL++;
livetrax_edit_table . show_all ( ) ;
2024-03-20 08:49:18 -04:00
/* meter display */
2024-03-23 01:00:04 -04:00
livetrax_meters = manage ( new LiveTraxMeters ( 48 ) ) ;
2024-03-22 20:57:59 -04:00
livetrax_meters - > show_all ( ) ;
2024-05-02 13:10:46 -04:00
// livetrax_meter_bar.set_border_width (4);
livetrax_meter_bar . pack_start ( * livetrax_meters , true , true , 0 ) ;
hb = manage ( new HBox ) ;
hb - > pack_start ( rc_option_editor - > contents ( ) , true , true ) ;
livetrax_prefs_bar . pack_start ( * hb , true , true ) ;
2024-03-20 08:49:18 -04:00
2024-03-26 13:37:16 -04:00
hb = manage ( new HBox ) ;
livetrax_edit_vscrollbar = manage ( new VScrollbar ( editor - > vertical_adjustment ) ) ;
2024-03-21 00:20:05 -04:00
livetrax_edit_vscrollbar - > show ( ) ;
hb - > pack_start ( editor - > contents ( ) , true , true ) ;
hb - > pack_start ( * livetrax_edit_vscrollbar , false , false ) ;
2024-05-02 13:10:46 -04:00
// hb->pack_start (livetrax_edit_table, false, false);
livetrax_section_pane . set_child_minsize ( _livetrax_sections - > widget ( ) , 30 ) ;
livetrax_section_pane . set_divider ( 0 , 0.99 ) ;
livetrax_section_pane . add ( * hb ) ;
livetrax_section_pane . add ( _livetrax_sections - > widget ( ) ) ;
2024-03-25 21:05:45 -04:00
2024-03-26 13:37:16 -04:00
vb = manage ( new VBox ) ;
livetrax_edit_hscrollbar = manage ( new HScrollbar ( editor - > horizontal_adjustment ) ) ;
2024-03-21 00:20:05 -04:00
livetrax_edit_hscrollbar - > show ( ) ;
2024-05-02 13:10:46 -04:00
vb - > pack_start ( livetrax_section_pane , true , true ) ;
2024-03-21 00:20:05 -04:00
vb - > pack_start ( * livetrax_edit_hscrollbar , false , false ) ;
livetrax_editor_bar . pack_start ( * vb , true , true ) ;
2024-05-02 13:10:46 -04:00
livetrax_section_pane . set_divider ( 0 , 0.99 ) ;
2024-03-20 08:49:18 -04:00
livetrax_mixer_bar . pack_start ( mixer - > contents ( ) , true , true ) ;
we_have_dependents ( ) ;
/* order of addition affects order seen in initial window display */
main_vpacker . pack_start ( menu_bar_base , false , false ) ;
2024-05-02 13:10:46 -04:00
main_vpacker . pack_start ( livetrax_top_table , false , false ) ;
2024-03-20 08:49:18 -04:00
main_vpacker . pack_start ( livetrax_meter_bar , false , false ) ;
main_vpacker . pack_start ( livetrax_editor_bar , true , true ) ;
2024-05-02 13:10:46 -04:00
main_vpacker . pack_start ( livetrax_prefs_bar , true , false ) ;
2024-05-03 14:36:41 -04:00
main_vpacker . pack_start ( livetrax_mixer_bar , false , false ) ;
2024-03-20 08:49:18 -04:00
2024-03-21 00:20:05 -04:00
connect_transport_elements ( ) ;
setup_tooltips ( ) ;
2024-03-22 20:57:59 -04:00
build_menu_bar ( ) ;
2024-03-21 00:20:05 -04:00
2024-03-25 20:36:11 -04:00
bindings = Bindings : : get_bindings ( X_ ( " Editor " ) ) ;
livetrax_editor_bar . set_data ( " ardour-bindings " , bindings ) ;
bindings = Bindings : : get_bindings ( X_ ( " Mixer " ) ) ;
livetrax_mixer_bar . set_data ( " ardour-bindings " , bindings ) ;
2024-03-20 08:49:18 -04:00
// setup_tooltips ();
_main_window . signal_delete_event ( ) . connect ( sigc : : mem_fun ( * this , & ARDOUR_UI : : main_window_delete_event ) ) ;
/* pack the main vpacker into the main window and show everything
*/
_main_window . add ( main_vpacker ) ;
apply_window_settings ( true ) ;
setup_toplevel_window ( _main_window , " " , this ) ;
_main_window . show_all ( ) ;
2024-05-02 13:10:46 -04:00
_livetrax_visibility = LiveTraxVisibility ( LiveTraxMeterVisible | LiveTraxMixerVisible | LiveTraxEditorVisible ) ;
livetrax_visibility_change ( ) ;
2024-03-20 08:49:18 -04:00
# ifdef GDK_WINDOWING_X11
/* allow externalUIs to be transient, on top of the main window */
LV2Plugin : : set_main_window_id ( GDK_DRAWABLE_XID ( _main_window . get_window ( ) - > gobj ( ) ) ) ;
# endif
return 0 ;
}
2022-09-03 11:39:24 -04:00
void
2022-08-09 18:46:54 -04:00
ARDOUR_UI : : apply_window_settings ( bool with_size )
{
const XMLNode * mnode = main_window_settings ( ) ;
if ( ! mnode ) {
2022-09-03 11:39:24 -04:00
return ;
2022-08-09 18:46:54 -04:00
}
2022-08-09 19:00:29 -04:00
XMLProperty const * prop ;
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( with_size ) {
gint x = - 1 ;
gint y = - 1 ;
gint w = - 1 ;
gint h = - 1 ;
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( ( prop = mnode - > property ( X_ ( " x " ) ) ) ! = 0 ) {
x = atoi ( prop - > value ( ) ) ;
}
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( ( prop = mnode - > property ( X_ ( " y " ) ) ) ! = 0 ) {
y = atoi ( prop - > value ( ) ) ;
}
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( ( prop = mnode - > property ( X_ ( " w " ) ) ) ! = 0 ) {
w = atoi ( prop - > value ( ) ) ;
}
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( ( prop = mnode - > property ( X_ ( " h " ) ) ) ! = 0 ) {
h = atoi ( prop - > value ( ) ) ;
}
if ( x > = 0 & & y > = 0 & & w > = 0 & & h > = 0 ) {
_main_window . set_position ( Gtk : : WIN_POS_NONE ) ;
}
if ( x > = 0 & & y > = 0 ) {
_main_window . move ( x , y ) ;
}
2022-08-09 18:46:54 -04:00
2022-08-09 19:00:29 -04:00
if ( w > 0 & & h > 0 ) {
_main_window . set_default_size ( w , h ) ;
}
2022-08-09 18:46:54 -04:00
}
std : : string current_tab ;
if ( ( prop = mnode - > property ( X_ ( " current-tab " ) ) ) ! = 0 ) {
current_tab = prop - > value ( ) ;
} else {
current_tab = " editor " ;
}
if ( mixer & & current_tab = = " mixer " ) {
_tabs . set_current_page ( _tabs . page_num ( mixer - > contents ( ) ) ) ;
2024-04-17 22:49:54 -04:00
# ifndef LIVETRAX
2022-08-09 18:46:54 -04:00
} else if ( rc_option_editor & & current_tab = = " preferences " ) {
_tabs . set_current_page ( _tabs . page_num ( rc_option_editor - > contents ( ) ) ) ;
2024-04-17 22:49:54 -04:00
# endif
2022-08-09 18:46:54 -04:00
} else if ( recorder & & current_tab = = " recorder " ) {
_tabs . set_current_page ( _tabs . page_num ( recorder - > contents ( ) ) ) ;
2023-01-12 14:08:56 -05:00
} else if ( trigger_page & & current_tab = = " trigger " ) {
2022-08-09 18:46:54 -04:00
_tabs . set_current_page ( _tabs . page_num ( trigger_page - > contents ( ) ) ) ;
} else if ( editor ) {
_tabs . set_current_page ( _tabs . page_num ( editor - > contents ( ) ) ) ;
}
2022-09-03 11:39:24 -04:00
return ;
2015-07-27 17:12:35 -04:00
}
2017-02-17 05:15:14 -05:00
bool
ARDOUR_UI : : bind_lua_action_script ( GdkEventButton * ev , int i )
{
2019-12-13 10:33:12 -05:00
if ( ! _session ) {
return false ;
}
2019-12-12 14:50:34 -05:00
LuaInstance * li = LuaInstance : : instance ( ) ;
std : : string name ;
if ( ev - > button ! = 3 & & ! ( ev - > button = = 1 & & ! li - > lua_action_name ( i , name ) ) ) {
2017-02-17 05:15:14 -05:00
return false ;
}
2017-02-17 20:24:23 -05:00
if ( Gtkmm2ext : : Keyboard : : modifier_state_equals ( ev - > state , Gtkmm2ext : : Keyboard : : TertiaryModifier ) ) {
li - > remove_lua_action ( i ) ;
} else {
2023-06-10 15:37:09 -04:00
li - > interactive_add ( * editor - > current_toplevel ( ) , LuaScriptInfo : : EditorAction , i ) ;
2017-02-17 20:24:23 -05:00
}
2017-02-17 05:15:14 -05:00
return true ;
}
2017-02-17 12:56:18 -05:00
void
2020-04-23 20:31:30 -04:00
ARDOUR_UI : : action_script_changed ( int i , const std : : string & n )
2017-02-17 12:56:18 -05:00
{
2020-04-23 20:31:30 -04:00
if ( i < 0 | | i > = MAX_LUA_ACTION_SCRIPTS ) {
2019-09-02 22:31:35 -04:00
return ;
}
2020-04-23 20:31:30 -04:00
if ( i < MAX_LUA_ACTION_BUTTONS ) {
if ( LuaInstance : : instance ( ) - > lua_action_has_icon ( i ) ) {
uintptr_t ii = i ;
action_script_call_btn [ i ] . set_icon ( & LuaInstance : : render_action_icon , ( void * ) ii ) ;
} else {
action_script_call_btn [ i ] . set_icon ( 0 , 0 ) ;
}
2020-06-12 18:58:32 -04:00
if ( n . empty ( ) ) {
action_script_call_btn [ i ] . set_text ( string_compose ( " %1%2 " , std : : hex , i + 1 ) ) ;
} else {
action_script_call_btn [ i ] . set_text ( n . substr ( 0 , 1 ) ) ;
}
2017-02-17 12:56:18 -05:00
}
2017-02-18 10:14:41 -05:00
2020-04-28 12:32:24 -04:00
std : : string const a = string_compose ( X_ ( " script-%1 " ) , i + 1 ) ;
2019-09-02 22:31:35 -04:00
Glib : : RefPtr < Action > act = ActionManager : : get_action ( X_ ( " LuaAction " ) , a . c_str ( ) ) ;
2017-02-18 10:14:41 -05:00
assert ( act ) ;
if ( n . empty ( ) ) {
act - > set_label ( string_compose ( _ ( " Unset #%1 " ) , i + 1 ) ) ;
act - > set_tooltip ( _ ( " No action bound \n Right-click to assign " ) ) ;
act - > set_sensitive ( false ) ;
} else {
act - > set_label ( n ) ;
act - > set_tooltip ( string_compose ( _ ( " %1 \n \n Click to run \n Right-click to re-assign \n Shift+right-click to unassign " ) , n ) ) ;
act - > set_sensitive ( true ) ;
}
KeyEditor : : UpdateBindings ( ) ;
2017-02-17 12:56:18 -05:00
}
2024-03-25 21:05:45 -04:00
2024-05-02 10:21:34 -04:00
void
ARDOUR_UI : : update_section_visibility ( bool show )
{
# ifdef LIVETRAX
if ( ! _livetrax_sections ) {
return ;
}
if ( show ) {
_livetrax_sections - > widget ( ) . show ( ) ;
} else {
_livetrax_sections - > widget ( ) . hide ( ) ;
}
# endif
}
2024-03-25 21:05:45 -04:00
void
ARDOUR_UI : : livetrax_visibility_change ( )
{
if ( _livetrax_visibility & LiveTraxMeterVisible ) {
livetrax_meter_bar . show ( ) ;
livetrax_meter_view_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
} else {
livetrax_meter_bar . hide ( ) ;
livetrax_meter_view_button - > set_active_state ( Gtkmm2ext : : Off ) ;
}
if ( _livetrax_visibility & LiveTraxEditorVisible ) {
2024-05-02 13:10:46 -04:00
livetrax_edit_table . show ( ) ;
2024-03-25 21:05:45 -04:00
livetrax_editor_bar . show ( ) ;
livetrax_editor_view_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
} else {
2024-05-02 13:10:46 -04:00
livetrax_edit_table . hide ( ) ;
2024-03-25 21:05:45 -04:00
livetrax_editor_bar . hide ( ) ;
livetrax_editor_view_button - > set_active_state ( Gtkmm2ext : : Off ) ;
}
2024-05-02 13:10:46 -04:00
if ( _livetrax_visibility & LiveTraxPrefsVisible ) {
livetrax_prefs_bar . show ( ) ;
livetrax_prefs_view_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
} else {
livetrax_prefs_bar . hide ( ) ;
livetrax_prefs_view_button - > set_active_state ( Gtkmm2ext : : Off ) ;
}
2024-03-25 21:05:45 -04:00
if ( _livetrax_visibility & LiveTraxMixerVisible ) {
livetrax_mixer_bar . show ( ) ;
livetrax_mixer_view_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
} else {
livetrax_mixer_bar . hide ( ) ;
livetrax_mixer_view_button - > set_active_state ( Gtkmm2ext : : Off ) ;
}
}
void
ARDOUR_UI : : livetrax_toggle_visibility ( LiveTraxVisibility v )
{
if ( _livetrax_visibility & v ) {
_livetrax_visibility = LiveTraxVisibility ( _livetrax_visibility & ~ v ) ;
} else {
2024-05-02 13:10:46 -04:00
_livetrax_visibility = LiveTraxVisibility ( _livetrax_visibility | v ) ;
}
if ( _livetrax_visibility = = 0 ) { //at minimum always show tracks
_livetrax_visibility = LiveTraxVisibility ( LiveTraxEditorVisible ) ;
}
//enforce exclusivity between tracks and prefs
if ( v = = LiveTraxEditorVisible ) {
_livetrax_visibility = LiveTraxVisibility ( _livetrax_visibility & ~ LiveTraxPrefsVisible ) ;
}
if ( v = = LiveTraxPrefsVisible ) {
_livetrax_visibility = LiveTraxVisibility ( LiveTraxPrefsVisible ) ; //ONLY show prefs
2024-03-25 21:05:45 -04:00
}
livetrax_visibility_change ( ) ;
}
2024-03-26 13:37:16 -04:00
void
ARDOUR_UI : : livetrax_set_file_format ( LiveTraxFileFormat const & ff )
{
if ( ! _session ) {
return ;
}
/* Don't reset write sources on header format change */
_session - > disable_file_format_reset ( ) ;
_session - > config . set_native_file_header_format ( ff . hf ) ;
_session - > config . set_native_file_data_format ( ff . sf ) ;
_session - > enable_file_format_reset ( ) ;
_session - > reset_native_file_format ( ) ;
}
2024-04-04 19:01:42 -04:00
void
ARDOUR_UI : : virtual_soundcheck_changed ( bool onoff )
{
if ( ! Profile - > get_livetrax ( ) ) {
return ;
}
if ( onoff ) {
livetrax_stereo_out_button - > set_active_state ( Gtkmm2ext : : Off ) ;
livetrax_multi_out_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
} else {
livetrax_stereo_out_button - > set_active_state ( Gtkmm2ext : : ExplicitActive ) ;
livetrax_multi_out_button - > set_active_state ( Gtkmm2ext : : Off ) ;
}
}