From ec89c3b45e8a38c29eb221545513a06c20979a1d Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 20 Mar 2024 06:49:18 -0600 Subject: [PATCH] initial work on livetrax --- gtk2_ardour/ardour_ui.h | 12 ++ gtk2_ardour/ardour_ui_dependents.cc | 118 +++++++++++++++- gtk2_ardour/ardour_ui_dialogs.cc | 19 +-- gtk2_ardour/ardour_ui_ed.cc | 60 +++++--- gtk2_ardour/ardour_ui_mixer.cc | 6 +- gtk2_ardour/ardour_ui_startup.cc | 2 + gtk2_ardour/editor.cc | 174 ++++++++++++++---------- gtk2_ardour/editor.h | 2 + gtk2_ardour/editor_canvas.cc | 5 +- gtk2_ardour/editor_rulers.cc | 24 ++-- gtk2_ardour/mixer_ui.cc | 82 +++++------ gtk2_ardour/public_editor.h | 3 + gtk2_ardour/selection_properties_box.cc | 2 +- 13 files changed, 353 insertions(+), 156 deletions(-) diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 331d776b4f..9758b9d3e5 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -620,6 +620,18 @@ private: void primary_clock_value_changed (); void secondary_clock_value_changed (); + /* LiveTrax */ + + Gtk::HBox livetrax_top_bar; + Gtk::HBox livetrax_transport_bar; + Gtk::HBox livetrax_meter_bar; + Gtk::HBox livetrax_editor_bar; + Gtk::HBox livetrax_mixer_bar; + TimeInfoBox* livetrax_time_info_box; + ArdourWidgets::ArdourButton* livetrax_multi_out_button; + ArdourWidgets::ArdourButton* livetrax_stereo_out_button; + int livetrax_setup_windows (); + /* menu bar and associated stuff */ Gtk::MenuBar* menu_bar; diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index b9f77c3b42..dc40040b2f 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -36,9 +36,12 @@ #include "ardour/session.h" #include "ardour/lv2_plugin.h" +#include "ardour/profile.h" #include "gtkmm2ext/bindings.h" +#include "widgets/ardour_button.h" + #include "actions.h" #include "ardour_message.h" #include "ardour_ui.h" @@ -47,6 +50,7 @@ #include "meterbridge.h" #include "luainstance.h" #include "luawindow.h" +#include "main_clock.h" #include "mixer_ui.h" #include "recorder_ui.h" #include "trigger_page.h" @@ -54,6 +58,7 @@ #include "keyeditor.h" #include "rc_option_editor.h" #include "route_params_ui.h" +#include "selection_properties_box.h" #include "time_info_box.h" #include "trigger_ui.h" #include "step_entry.h" @@ -67,6 +72,7 @@ using namespace Gtk; using namespace PBD; +using namespace ArdourWidgets; namespace ARDOUR { class Session; @@ -130,9 +136,14 @@ ARDOUR_UI::connect_dependents_to_session (ARDOUR::Session *s) editor->set_session (s); BootMessage (_("Setup Mixer")); mixer->set_session (s); - recorder->set_session (s); - trigger_page->set_session (s); - meterbridge->set_session (s); + + 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); + } /* its safe to do this now */ @@ -249,11 +260,16 @@ tab_window_root_drop (GtkNotebook* src, int ARDOUR_UI::setup_windows () { + if (ARDOUR::Profile->get_livetrax()) { + return livetrax_setup_windows (); + } + _tabs.set_show_border(false); _tabs.signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch)); _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)); + rc_option_editor = new RCOptionEditor; rc_option_editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); @@ -360,6 +376,102 @@ ARDOUR_UI::setup_windows () return 0; } +int +ARDOUR_UI::livetrax_setup_windows () +{ + ArdourButton::set_default_tweaks (ArdourButton::Tweaks (ArdourButton::ForceBoxy|ArdourButton::ForceFlat)); + + if (create_editor()) { + error << _("UI: cannot setup editor") << endmsg; + return -1; + } + + if (create_mixer()) { + error << _("UI: cannot setup mixer") << endmsg; + return -1; + } + + livetrax_time_info_box = new TimeInfoBox ("LiveTraxTimeInfo", false); + + Gtk::Label* l; + Gtk::VBox* vb; + + livetrax_top_bar.set_spacing (12); + livetrax_top_bar.set_border_width (12); + livetrax_top_bar.pack_start (*livetrax_time_info_box, false, false); + livetrax_top_bar.pack_start (*primary_clock, false, false); + + Gtk::EventBox* ev_dsp = manage (new EventBox); + Gtk::EventBox* ev_timecode = manage (new EventBox); + ev_dsp->set_name ("MainMenuBar"); + ev_timecode->set_name ("MainMenuBar"); + ev_dsp->add (dsp_load_label); + ev_timecode->add (timecode_format_label); + + vb = manage (new Gtk::VBox); + + vb->pack_start (*ev_dsp, true, true); + vb->pack_start (disk_space_label, true, true); + vb->show_all (); + + livetrax_top_bar.pack_end (*vb, false, false); + + livetrax_multi_out_button = manage (new ArdourWidgets::ArdourButton (_("Multi Out"))); + livetrax_stereo_out_button = manage (new ArdourWidgets::ArdourButton (_("Stereo Out"))); + + vb = manage (new Gtk::VBox); + vb->pack_start (*livetrax_stereo_out_button, true, true); + vb->pack_start (*livetrax_multi_out_button, true, true); + vb->show_all (); + + livetrax_top_bar.pack_end (*vb, false, false); + + /* transport bar */ + + l = new Gtk::Label ("this is the transport bar with other controls too"); + livetrax_transport_bar.pack_start (*l, true, true); + + /* meter display */ + + l = new Gtk::Label ("this is the meter display"); + livetrax_meter_bar.pack_start (*l, true, true); + + livetrax_editor_bar.pack_start (editor->contents(), true, true); + 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); + main_vpacker.pack_start (livetrax_top_bar, false, false); + main_vpacker.pack_start (livetrax_transport_bar, false, false); + main_vpacker.pack_start (livetrax_meter_bar, false, false); + main_vpacker.pack_start (livetrax_editor_bar, true, true); + main_vpacker.pack_start (livetrax_mixer_bar, true, true); + + // 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 (); + +#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; +} + void ARDOUR_UI::apply_window_settings (bool with_size) { diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 89a14a5c7e..7ff6d6ef37 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -156,15 +156,18 @@ ARDOUR_UI::set_session (Session *s) AutomationWatch::instance().set_session (s); - shuttle_box.set_session (s); - mini_timeline.set_session (s); - time_info_box->set_session (s); - primary_clock->set_session (s); - secondary_clock->set_session (s); - big_clock->set_session (s); - video_timeline->set_session (s); - rc_option_editor->set_session (s); + + if (!Profile->get_livetrax()) { + shuttle_box.set_session (s); + mini_timeline.set_session (s); + time_info_box->set_session (s); + + secondary_clock->set_session (s); + big_clock->set_session (s); + video_timeline->set_session (s); + rc_option_editor->set_session (s); + } roll_controllable->set_session (s); stop_controllable->set_session (s); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index d846e15653..ece029df93 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -99,7 +99,9 @@ ARDOUR_UI::create_editor () { try { editor = new Editor (); - editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + if (!ARDOUR::Profile->get_livetrax()) { + editor->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + } } catch (failed_constructor& err) { @@ -116,7 +118,9 @@ ARDOUR_UI::create_recorder () { try { recorder = new RecorderUI (); - recorder->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + if (!ARDOUR::Profile->get_livetrax()) { + recorder->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + } } catch (failed_constructor& err) { return -1; } @@ -128,7 +132,9 @@ ARDOUR_UI::create_trigger_page () { try { trigger_page = new TriggerPage (); - trigger_page->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + if (!ARDOUR::Profile->get_livetrax()) { + trigger_page->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + } } catch (failed_constructor& err) { return -1; } @@ -762,19 +768,25 @@ ARDOUR_UI::build_menu_bar () ev->set_name ("MainMenuBar"); ev->show (); - EventBox* ev_dsp = manage (new EventBox); + EventBox* ev_dsp; + EventBox* ev_timecode; EventBox* ev_path = manage (new EventBox); EventBox* ev_name = manage (new EventBox); EventBox* ev_audio = manage (new EventBox); EventBox* ev_format = manage (new EventBox); - EventBox* ev_timecode = manage (new EventBox); - ev_dsp->set_name ("MainMenuBar"); + if (!Profile->get_livetrax()) { + ev_dsp = manage (new EventBox); + ev_timecode = manage (new EventBox); + + ev_dsp->set_name ("MainMenuBar"); + ev_timecode->set_name ("MainMenuBar"); + } + ev_path->set_name ("MainMenuBar"); ev_name->set_name ("MainMenuBar"); ev_audio->set_name ("MainMenuBar"); ev_format->set_name ("MainMenuBar"); - ev_timecode->set_name ("MainMenuBar"); Gtk::HBox* hbox = manage (new Gtk::HBox); hbox->show (); @@ -794,18 +806,22 @@ ARDOUR_UI::build_menu_bar () snapshot_name_label.set_name ("Name"); format_label.set_use_markup (); - ev_dsp->add (dsp_load_label); + if (!Profile->get_livetrax()) { + ev_dsp->add (dsp_load_label); + ev_timecode->add (timecode_format_label); + } ev_path->add (session_path_label); ev_name->add (snapshot_name_label); ev_audio->add (sample_rate_label); ev_format->add (format_label); - ev_timecode->add (timecode_format_label); - ev_dsp->show (); + if (!Profile->get_livetrax()) { + ev_dsp->show (); + ev_timecode->show (); + } ev_path->show (); ev_audio->show (); ev_format->show (); - ev_timecode->show (); #ifdef __APPLE__ use_menubar_as_top_menubar (); @@ -817,7 +833,9 @@ ARDOUR_UI::build_menu_bar () hbox->pack_end (wall_clock_label, false, false, 10); hbox->pack_end (*ev_dsp, false, false, 6); - hbox->pack_end (disk_space_label, false, false, 6); + if (!Profile->get_livetrax()) { + hbox->pack_end (disk_space_label, false, false, 6); + } hbox->pack_end (*ev_audio, false, false, 6); hbox->pack_end (*ev_timecode, false, false, 6); hbox->pack_end (*ev_format, false, false, 6); @@ -834,10 +852,13 @@ ARDOUR_UI::build_menu_bar () _status_bar_visibility.add (&snapshot_name_label ,X_("Name"), _("Snapshot Name and Modified Indicator"), false); _status_bar_visibility.add (&peak_thread_work_label,X_("Peakfile"), _("Active Peak-file Work"), false); _status_bar_visibility.add (&format_label, X_("Format"), _("File Format"), false); - _status_bar_visibility.add (&timecode_format_label, X_("TCFormat"), _("Timecode Format"), false); _status_bar_visibility.add (&sample_rate_label, X_("Audio"), _("Audio"), true); - _status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), !Profile->get_small_screen()); - _status_bar_visibility.add (&dsp_load_label, X_("DSP"), _("DSP"), true); + + if (!Profile->get_livetrax()) { + _status_bar_visibility.add (&timecode_format_label, X_("TCFormat"), _("Timecode Format"), false); + _status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), !Profile->get_small_screen()); + _status_bar_visibility.add (&dsp_load_label, X_("DSP"), _("DSP"), true); + } #ifndef __APPLE__ // OSX provides its own wallclock, thank you very much _status_bar_visibility.add (&wall_clock_label, X_("WallClock"), _("Wall Clock"), false); @@ -845,13 +866,16 @@ ARDOUR_UI::build_menu_bar () ev->signal_button_press_event().connect (sigc::mem_fun (_status_bar_visibility, &VisibilityGroup::button_press_event)); - ev_dsp->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::xrun_button_press)); - ev_dsp->signal_button_release_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::xrun_button_release)); + if (!Profile->get_livetrax()) { + ev_dsp->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::xrun_button_press)); + ev_dsp->signal_button_release_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::xrun_button_release)); + ev_timecode->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::timecode_button_press)); + } + ev_path->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::path_button_press)); ev_name->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::path_button_press)); ev_audio->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::audio_button_press)); ev_format->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::format_button_press)); - ev_timecode->signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::timecode_button_press)); ArdourWidgets::set_tooltip (session_path_label, _("Double click to open session folder.")); ArdourWidgets::set_tooltip (format_label, _("Double click to edit audio file format.")); diff --git a/gtk2_ardour/ardour_ui_mixer.cc b/gtk2_ardour/ardour_ui_mixer.cc index e4fc1b36c7..872967667a 100644 --- a/gtk2_ardour/ardour_ui_mixer.cc +++ b/gtk2_ardour/ardour_ui_mixer.cc @@ -26,6 +26,8 @@ is to cut down on the nasty compile times for these classes. */ +#include "ardour/profile.h" + #include "gtkmm2ext/keyboard.h" #include "actions.h" @@ -44,7 +46,9 @@ ARDOUR_UI::create_mixer () { try { mixer = Mixer_UI::instance (); - mixer->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + if (!ARDOUR::Profile->get_livetrax()) { + mixer->StateChange.connect (sigc::mem_fun (*this, &ARDOUR_UI::tabbable_state_change)); + } } catch (failed_constructor& err) { diff --git a/gtk2_ardour/ardour_ui_startup.cc b/gtk2_ardour/ardour_ui_startup.cc index 9490527c0a..da5acbbffb 100644 --- a/gtk2_ardour/ardour_ui_startup.cc +++ b/gtk2_ardour/ardour_ui_startup.cc @@ -121,6 +121,8 @@ ARDOUR_UI::setup_profile () if (g_getenv ("MIXBUS")) { Profile->set_mixbus (); } + + Profile->set_livetrax (); } int diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 0100322d85..1161b3fad2 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -610,7 +610,9 @@ Editor::Editor () CairoWidget::set_focus_handler (sigc::mem_fun (ARDOUR_UI::instance(), &ARDOUR_UI::reset_focus)); - _summary = new EditorSummary (this); + if (!Profile->get_livetrax()) { + _summary = new EditorSummary (this); + } TempoMap::MapChanged.connect (tempo_map_connection, invalidator (*this), boost::bind (&Editor::tempo_map_changed, this), gui_context()); @@ -740,93 +742,104 @@ Editor::Editor () settings->get_property ("notebook-shrunk", _notebook_shrunk); } - editor_summary_pane.set_check_divider_position (true); - editor_summary_pane.add (edit_packer); + if (!Profile->get_livetrax()) { + editor_summary_pane.set_check_divider_position (true); + editor_summary_pane.add (edit_packer); - Button* summary_arrow_left = manage (new Button); - summary_arrow_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE))); - summary_arrow_left->signal_pressed().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*this, &Editor::scroll_press), LEFT))); - summary_arrow_left->signal_released().connect (sigc::mem_fun (*this, &Editor::scroll_release)); + Button* summary_arrow_left = manage (new Button); + summary_arrow_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE))); + summary_arrow_left->signal_pressed().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*this, &Editor::scroll_press), LEFT))); + summary_arrow_left->signal_released().connect (sigc::mem_fun (*this, &Editor::scroll_release)); - Button* summary_arrow_right = manage (new Button); - summary_arrow_right->add (*manage (new Arrow (ARROW_RIGHT, SHADOW_NONE))); - summary_arrow_right->signal_pressed().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*this, &Editor::scroll_press), RIGHT))); - summary_arrow_right->signal_released().connect (sigc::mem_fun (*this, &Editor::scroll_release)); + Button* summary_arrow_right = manage (new Button); + summary_arrow_right->add (*manage (new Arrow (ARROW_RIGHT, SHADOW_NONE))); + summary_arrow_right->signal_pressed().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*this, &Editor::scroll_press), RIGHT))); + summary_arrow_right->signal_released().connect (sigc::mem_fun (*this, &Editor::scroll_release)); - VBox* summary_arrows_left = manage (new VBox); - summary_arrows_left->pack_start (*summary_arrow_left); + VBox* summary_arrows_left = manage (new VBox); + summary_arrows_left->pack_start (*summary_arrow_left); - VBox* summary_arrows_right = manage (new VBox); - summary_arrows_right->pack_start (*summary_arrow_right); + VBox* summary_arrows_right = manage (new VBox); + summary_arrows_right->pack_start (*summary_arrow_right); - Gtk::Frame* summary_frame = manage (new Gtk::Frame); - summary_frame->set_shadow_type (Gtk::SHADOW_ETCHED_IN); + Gtk::Frame* summary_frame = manage (new Gtk::Frame); + summary_frame->set_shadow_type (Gtk::SHADOW_ETCHED_IN); - summary_frame->add (*_summary); - summary_frame->show (); + summary_frame->add (*_summary); + summary_frame->show (); - _summary_hbox.pack_start (*summary_arrows_left, false, false); - _summary_hbox.pack_start (*summary_frame, true, true); - _summary_hbox.pack_start (*summary_arrows_right, false, false); + _summary_hbox.pack_start (*summary_arrows_left, false, false); + _summary_hbox.pack_start (*summary_frame, true, true); + _summary_hbox.pack_start (*summary_arrows_right, false, false); - editor_summary_pane.add (_summary_hbox); - edit_pane.set_check_divider_position (true); - edit_pane.add (editor_summary_pane); - _editor_list_vbox.pack_start (_the_notebook); - _editor_list_vbox.pack_start (*_properties_box, false, false, 0); - edit_pane.add (_editor_list_vbox); - edit_pane.set_child_minsize (_editor_list_vbox, 30); /* rough guess at width of notebook tabs */ + editor_summary_pane.add (_summary_hbox); + edit_pane.set_check_divider_position (true); + edit_pane.add (editor_summary_pane); + _editor_list_vbox.pack_start (_the_notebook); + _editor_list_vbox.pack_start (*_properties_box, false, false, 0); + edit_pane.add (_editor_list_vbox); + edit_pane.set_child_minsize (_editor_list_vbox, 30); /* rough guess at width of notebook tabs */ - edit_pane.set_drag_cursor (*_cursors->expand_left_right); - editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down); + edit_pane.set_drag_cursor (*_cursors->expand_left_right); + editor_summary_pane.set_drag_cursor (*_cursors->expand_up_down); - float fract; - if (!settings || !settings->get_property ("edit-horizontal-pane-pos", fract) || fract > 1.0) { - /* initial allocation is 90% to canvas, 10% to notebook */ - fract = 0.90; + float fract; + if (!settings || !settings->get_property ("edit-horizontal-pane-pos", fract) || fract > 1.0) { + /* initial allocation is 90% to canvas, 10% to notebook */ + fract = 0.90; + } + edit_pane.set_divider (0, fract); + + if (!settings || !settings->get_property ("edit-vertical-pane-pos", fract) || fract > 1.0) { + /* initial allocation is 90% to canvas, 10% to summary */ + fract = 0.90; + } + editor_summary_pane.set_divider (0, fract); } - edit_pane.set_divider (0, fract); - - if (!settings || !settings->get_property ("edit-vertical-pane-pos", fract) || fract > 1.0) { - /* initial allocation is 90% to canvas, 10% to summary */ - fract = 0.90; - } - editor_summary_pane.set_divider (0, fract); global_vpacker.set_spacing (0); global_vpacker.set_border_width (0); - /* the next three EventBoxes provide the ability for their child widgets to have a background color. That is all. */ + if (!Profile->get_livetrax()) { + /* the next three EventBoxes provide the ability for their child widgets to have a background color. That is all. */ - Gtk::EventBox* ebox = manage (new Gtk::EventBox); // a themeable box - ebox->set_name("EditorWindow"); - ebox->add (ebox_hpacker); + Gtk::EventBox* ebox = manage (new Gtk::EventBox); // a themeable box + ebox->set_name("EditorWindow"); + ebox->add (ebox_hpacker); - Gtk::EventBox* epane_box = manage (new EventBoxExt); // a themeable box - epane_box->set_name("EditorWindow"); - epane_box->add (edit_pane); + Gtk::EventBox* epane_box = manage (new EventBoxExt); // a themeable box + epane_box->set_name("EditorWindow"); + epane_box->add (edit_pane); - Gtk::EventBox* epane_box2 = manage (new EventBoxExt); // a themeable box - epane_box2->set_name("EditorWindow"); - epane_box2->add (global_vpacker); + Gtk::EventBox* epane_box2 = manage (new EventBoxExt); // a themeable box + epane_box2->set_name("EditorWindow"); + epane_box2->add (global_vpacker); - ArdourWidgets::ArdourDropShadow *toolbar_shadow = manage (new (ArdourWidgets::ArdourDropShadow)); - toolbar_shadow->set_size_request (-1, 4); - toolbar_shadow->set_mode(ArdourWidgets::ArdourDropShadow::DropShadowBoth); - toolbar_shadow->set_name("EditorWindow"); - toolbar_shadow->show(); + ArdourWidgets::ArdourDropShadow *toolbar_shadow = manage (new (ArdourWidgets::ArdourDropShadow)); + toolbar_shadow->set_size_request (-1, 4); + toolbar_shadow->set_mode(ArdourWidgets::ArdourDropShadow::DropShadowBoth); + toolbar_shadow->set_name("EditorWindow"); + toolbar_shadow->show(); + global_vpacker.pack_start (*toolbar_shadow, false, false); - global_vpacker.pack_start (*toolbar_shadow, false, false); - global_vpacker.pack_start (*ebox, false, false); - global_vpacker.pack_start (*epane_box, true, true); - global_hpacker.pack_start (*epane_box2, true, true); + global_vpacker.pack_start (*ebox, false, false); - /* need to show the "contents" widget so that notebook will show if tab is switched to - */ + if (!Profile->get_livetrax()) { + global_vpacker.pack_start (*epane_box, true, true); + global_hpacker.pack_start (*epane_box2, true, true); + } + /* need to show the "contents" widget so that notebook will show if tab is switched to + */ - global_hpacker.show (); - ebox_hpacker.show(); - ebox->show(); + global_hpacker.show (); + ebox_hpacker.show(); + ebox->show(); + + } else { + global_vpacker.pack_start (edit_packer, true, true); + global_hpacker.pack_start (global_vpacker, true, true); + global_hpacker.show (); + } /* register actions now so that set_state() can find them and set toggles/checks etc */ @@ -1361,16 +1374,19 @@ Editor::set_session (Session *t) * before the visible state has been loaded from instant.xml */ _leftmost_sample = session_gui_extents().first.samples(); - nudge_clock->set_session (_session); - _summary->set_session (_session); + if (!Profile->get_livetrax()) { + nudge_clock->set_session (_session); + _summary->set_session (_session); + } + _group_tabs->set_session (_session); _route_groups->set_session (_session); _regions->set_session (_session); _sources->set_session (_session); _snapshots->set_session (_session); - _sections->set_session (_session); _routes->set_session (_session); _locations->set_session (_session); + _sections->set_session (_session); _properties_box->set_session (_session); if (rhythm_ferret) { @@ -5106,7 +5122,9 @@ Editor::on_samples_per_pixel_changed () } refresh_location_display(); - _summary->set_overlays_dirty (); + if (_summary) { + _summary->set_overlays_dirty (); + } update_section_box (); update_marker_labels (); @@ -5245,7 +5263,9 @@ Editor::visual_changer (const VisualChange& vc) } _region_peak_cursor->hide (); - _summary->set_overlays_dirty (); + if (_summary) { + _summary->set_overlays_dirty (); + } } struct EditorOrderTimeAxisSorter { @@ -5817,7 +5837,9 @@ Editor::region_view_added (RegionView * rv) } } - _summary->set_background_dirty (); + if (_summary) { + _summary->set_background_dirty (); + } mark_region_boundary_cache_dirty (); } @@ -5825,7 +5847,9 @@ Editor::region_view_added (RegionView * rv) void Editor::region_view_removed () { - _summary->set_background_dirty (); + if (_summary) { + _summary->set_background_dirty (); + } mark_region_boundary_cache_dirty (); } @@ -6224,7 +6248,9 @@ Editor::redisplay_track_views () vertical_adjustment.set_value (_full_canvas_height - _visible_canvas_height); } - _summary->set_background_dirty(); + if (_summary) { + _summary->set_background_dirty(); + } _group_tabs->set_dirty (); return false; diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index bbc9300f97..b69b6656e1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -632,6 +632,8 @@ public: void remove_region_marker (ARDOUR::CueMarker&); void make_region_markers_global (bool as_cd_markers); + SelectionPropertiesBox& properties_box() const { return *_properties_box; } + protected: void map_transport_state (); void map_position_change (samplepos_t); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index b4e357196a..95aae70515 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -373,7 +373,10 @@ Editor::track_canvas_viewport_size_allocated () update_tempo_based_rulers (); redisplay_grid (false); redisplay_track_views (); - _summary->set_overlays_dirty (); + + if (_summary) { + _summary->set_overlays_dirty (); + } } void diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 79f85fb691..3f0dc65601 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -490,7 +490,7 @@ Editor::update_ruler_visibility () videotl_label.hide(); #endif - if (ruler_minsec_action->get_active()) { + if (!Profile->get_livetrax() && ruler_minsec_action->get_active()) { old_unit_pos = minsec_ruler->position().y; if (tbpos != old_unit_pos) { minsec_ruler->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -506,7 +506,7 @@ Editor::update_ruler_visibility () minsec_label.hide(); } - if (ruler_timecode_action->get_active()) { + if (Profile->get_livetrax() || ruler_timecode_action->get_active()) { old_unit_pos = timecode_ruler->position().y; if (tbpos != old_unit_pos) { timecode_ruler->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -522,7 +522,7 @@ Editor::update_ruler_visibility () timecode_label.hide(); } - if (ruler_samples_action->get_active()) { + if (!Profile->get_livetrax() && ruler_samples_action->get_active()) { old_unit_pos = samples_ruler->position().y; if (tbpos != old_unit_pos) { samples_ruler->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -538,7 +538,7 @@ Editor::update_ruler_visibility () samples_label.hide(); } - if (ruler_bbt_action->get_active()) { + if (!Profile->get_livetrax() && ruler_bbt_action->get_active()) { old_unit_pos = bbt_ruler->position().y; if (tbpos != old_unit_pos) { bbt_ruler->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -554,7 +554,7 @@ Editor::update_ruler_visibility () bbt_label.hide(); } - if (ruler_tempo_action->get_active()) { + if (!Profile->get_livetrax() && ruler_tempo_action->get_active()) { old_unit_pos = tempo_group->position().y; if (tbpos != old_unit_pos) { tempo_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -569,7 +569,7 @@ Editor::update_ruler_visibility () tempo_label.hide(); } - if (ruler_meter_action->get_active()) { + if (!Profile->get_livetrax() && ruler_meter_action->get_active()) { old_unit_pos = meter_group->position().y; if (tbpos != old_unit_pos) { meter_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -584,7 +584,7 @@ Editor::update_ruler_visibility () meter_label.hide(); } - if (ruler_range_action->get_active()) { + if (!Profile->get_livetrax() && ruler_range_action->get_active()) { old_unit_pos = range_marker_group->position().y; if (tbpos != old_unit_pos) { range_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -602,7 +602,7 @@ Editor::update_ruler_visibility () range_mark_label.hide(); } - if (ruler_loop_punch_action->get_active()) { + if (!Profile->get_livetrax() && ruler_loop_punch_action->get_active()) { old_unit_pos = transport_marker_group->position().y; if (tbpos != old_unit_pos) { transport_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -620,7 +620,7 @@ Editor::update_ruler_visibility () transport_mark_label.hide(); } - if (ruler_cd_marker_action->get_active()) { + if (!Profile->get_livetrax() && ruler_cd_marker_action->get_active()) { old_unit_pos = cd_marker_group->position().y; if (tbpos != old_unit_pos) { cd_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -642,7 +642,7 @@ Editor::update_ruler_visibility () update_marker_display(); } - if (ruler_marker_action->get_active()) { + if (Profile->get_livetrax() || ruler_marker_action->get_active()) { old_unit_pos = marker_group->position().y; if (tbpos != old_unit_pos) { marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -660,7 +660,7 @@ Editor::update_ruler_visibility () mark_label.hide(); } - if (ruler_cue_marker_action->get_active()) { + if (!Profile->get_livetrax() && ruler_cue_marker_action->get_active()) { old_unit_pos = cue_marker_group->position().y; if (tbpos != old_unit_pos) { cue_marker_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); @@ -717,7 +717,7 @@ Editor::update_ruler_visibility () update_marker_display(); } - if (ruler_video_action->get_active()) { + if (!Profile->get_livetrax() && ruler_video_action->get_active()) { old_unit_pos = videotl_group->position().y; if (tbpos != old_unit_pos) { videotl_group->move (ArdourCanvas::Duple (0.0, tbpos - old_unit_pos)); diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index ab0329737f..0097a494eb 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -56,6 +56,7 @@ #include "ardour/monitor_control.h" #include "ardour/panner_shell.h" #include "ardour/plugin_manager.h" +#include "ardour/profile.h" #include "ardour/route_group.h" #include "ardour/selection.h" #include "ardour/session.h" @@ -330,57 +331,62 @@ Mixer_UI::Mixer_UI () } _mixer_scene_vbox.pack_start(_mixer_scene_table, false, false); - rhs_pane1.add (favorite_plugins_frame); - rhs_pane1.add (track_display_frame); + if (!Profile->get_livetrax()) { + rhs_pane1.add (favorite_plugins_frame); + rhs_pane1.add (track_display_frame); - rhs_pane2.add (rhs_pane1); - rhs_pane2.add (group_display_frame); + rhs_pane2.add (rhs_pane1); + rhs_pane2.add (group_display_frame); - list_vpacker.pack_start (rhs_pane2, true, true); + list_vpacker.pack_start (rhs_pane2, true, true); - //add a spacer; this fills the area that is normally taken by the pane resizers - _mixer_scene_spacer.set_size_request (-1, 6); - list_vpacker.pack_start (_mixer_scene_spacer, false, false); - _mixer_scene_frame.add(_mixer_scene_vbox); - list_vpacker.pack_start (_mixer_scene_frame, false, false); + //add a spacer; this fills the area that is normally taken by the pane resizers + _mixer_scene_spacer.set_size_request (-1, 6); + list_vpacker.pack_start (_mixer_scene_spacer, false, false); - vca_label_bar.set_size_request (-1, 16 + 1); /* must match height in GroupTabs::set_size_request() + 1 border px*/ - vca_vpacker.pack_start (vca_label_bar, false, false); + _mixer_scene_frame.add(_mixer_scene_vbox); + list_vpacker.pack_start (_mixer_scene_frame, false, false); - vca_scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); - vca_scroller_base.set_name (X_("MixerWindow")); - vca_scroller_base.signal_button_press_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); - vca_scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); + vca_label_bar.set_size_request (-1, 16 + 1); /* must match height in GroupTabs::set_size_request() + 1 border px*/ + vca_vpacker.pack_start (vca_label_bar, false, false); - vca_hpacker.signal_scroll_event().connect (sigc::mem_fun (*this, &Mixer_UI::on_vca_scroll_event), false); - vca_scroller.add (vca_hpacker); - vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC); + vca_scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); + vca_scroller_base.set_name (X_("MixerWindow")); + vca_scroller_base.signal_button_press_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); + vca_scroller_base.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_event)); - vca_vpacker.pack_start (vca_scroller, true, true); + vca_hpacker.signal_scroll_event().connect (sigc::mem_fun (*this, &Mixer_UI::on_vca_scroll_event), false); + vca_scroller.add (vca_hpacker); + vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC); - inner_pane.add (scroller); - inner_pane.add (vca_vpacker); + vca_vpacker.pack_start (vca_scroller, true, true); - global_hpacker.pack_start (inner_pane, true, true); - global_hpacker.pack_start (out_packer, false, false); + inner_pane.add (scroller); + inner_pane.add (vca_vpacker); - list_hpane.set_check_divider_position (true); - list_hpane.add (list_vpacker); - list_hpane.add (global_hpacker); - list_hpane.set_child_minsize (list_vpacker, 30); + global_hpacker.pack_start (inner_pane, true, true); + global_hpacker.pack_start (out_packer, false, false); - rhs_pane1.set_divider (0, .6); - rhs_pane2.set_divider (0, .7); - list_hpane.set_divider (0, .2); - inner_pane.set_divider (0, .8); + list_hpane.set_check_divider_position (true); + list_hpane.add (list_vpacker); + list_hpane.add (global_hpacker); + list_hpane.set_child_minsize (list_vpacker, 30); - rhs_pane1.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down); - rhs_pane2.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down); - list_hpane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right); - inner_pane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right); + rhs_pane1.set_divider (0, .6); + rhs_pane2.set_divider (0, .7); + list_hpane.set_divider (0, .2); + inner_pane.set_divider (0, .8); - _content.pack_start (list_hpane, true, true); + rhs_pane1.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down); + rhs_pane2.set_drag_cursor (*PublicEditor::instance().cursors()->expand_up_down); + list_hpane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right); + inner_pane.set_drag_cursor (*PublicEditor::instance().cursors()->expand_left_right); + + _content.pack_start (list_hpane, true, true); + } else { + _content.pack_start (scroller, true, true); + } update_title (); @@ -2293,7 +2299,7 @@ Mixer_UI::toggle_mixer_list () void Mixer_UI::showhide_mixer_list (bool yn) { - if (yn) { + if (!Profile->get_livetrax() && yn) { list_vpacker.show (); } else { list_vpacker.hide (); diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index e474b95dfb..38e08845e1 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -105,6 +105,7 @@ class TempoMarker; class TimeAxisView; class VerboseCursor; struct SelectionRect; +class SelectionPropertiesBox; class DisplaySuspender; @@ -600,6 +601,8 @@ public: Gtkmm2ext::Bindings* bindings; + virtual SelectionPropertiesBox& properties_box() const = 0; + protected: friend class DisplaySuspender; virtual void suspend_route_redisplay () = 0; diff --git a/gtk2_ardour/selection_properties_box.cc b/gtk2_ardour/selection_properties_box.cc index 7b70beac7d..4cc6968dd2 100644 --- a/gtk2_ardour/selection_properties_box.cc +++ b/gtk2_ardour/selection_properties_box.cc @@ -175,7 +175,7 @@ SelectionPropertiesBox::selection_changed () _header_label.hide(); - if (!selection.time.empty()) { + if (Profile->get_livetrax() || !selection.time.empty()) { _time_info_box->show(); _header_label.set_text(_("Range Properties (Press ESC to Deselect All)")); _header_label.show();