first pass hiding/rearrangement of UI elements related to trx
[ardour.git] / gtk2_ardour / mixer_strip.cc
index a8ec7d5c79d971dfa12d132770d621f47596223f..6c4b4428700e194ac0a98c5817a1bcbf1670350e 100644 (file)
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/internal_send.h"
+#include "ardour/meter.h"
 #include "ardour/midi_track.h"
 #include "ardour/pannable.h"
 #include "ardour/panner.h"
 #include "ardour/panner_shell.h"
+#include "ardour/panner_manager.h"
 #include "ardour/port.h"
 #include "ardour/profile.h"
 #include "ardour/route.h"
@@ -130,6 +132,8 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
 void
 MixerStrip::init ()
 {
+       int button_table_row = 0;
+
        input_selector = 0;
        output_selector = 0;
        group_menu = 0;
@@ -205,15 +209,19 @@ MixerStrip::init ()
 
        top_button_table.set_homogeneous (true);
        top_button_table.set_spacings (2);
-       top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
-        top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+       if (!ARDOUR::Profile->get_trx()) {
+               top_button_table.attach (*monitor_input_button, 0, 1, 0, 1);
+               top_button_table.attach (*monitor_disk_button, 1, 2, 0, 1);
+       }
        top_button_table.show ();
 
        rec_solo_table.set_homogeneous (true);
        rec_solo_table.set_row_spacings (2);
        rec_solo_table.set_col_spacings (2);
-        rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
-        rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+       if (!ARDOUR::Profile->get_trx()) {
+               rec_solo_table.attach (*solo_isolated_led, 1, 2, 0, 1);
+               rec_solo_table.attach (*solo_safe_led, 1, 2, 1, 2);
+       }
         rec_solo_table.show ();
 
        button_table.set_homogeneous (false);
@@ -235,17 +243,24 @@ MixerStrip::init ()
                button_size_group->add_widget (*monitor_input_button);
        }
 
-       button_table.attach (name_button, 0, 1, 0, 1);
-       button_table.attach (input_button_box, 0, 1, 1, 2);
-       button_table.attach (_invert_button_box, 0, 1, 2, 3);
+       if (!ARDOUR::Profile->get_trx()) {
+               button_table.attach (name_button, button_table_row, button_table_row+1, 0, 1);
+               button_table_row++;
+               button_table.attach (input_button_box, button_table_row, button_table_row+1, 1, 2);
+               button_table_row++;
+               button_table.attach (_invert_button_box, button_table_row, button_table_row+1, 2, 3);
+               button_table_row++;
+       }
 
        middle_button_table.set_homogeneous (true);
        middle_button_table.set_spacings (2);
 
        bottom_button_table.set_spacings (2);
        bottom_button_table.set_homogeneous (true);
-//     bottom_button_table.attach (group_button, 0, 1, 0, 1);
-       bottom_button_table.attach (gpm.gain_automation_state_button, 0, 1, 0, 1);
+       bottom_button_table.attach (group_button, button_table_row, button_table_row+1, 0, 1);
+       button_table_row++;
+       bottom_button_table.attach (gpm.gain_automation_state_button, button_table_row, button_table_row+1, 0, 1);
+       button_table_row++;
 
        name_button.set_name ("mixer strip button");
        name_button.set_text (" "); /* non empty text, forces creation of the layout */
@@ -279,17 +294,23 @@ MixerStrip::init ()
        whvbox.pack_start (width_hide_box, true, true);
 
        global_vpacker.set_spacing (2);
-       global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (processor_box, true, true);
+       if (!ARDOUR::Profile->get_trx()) {
+               global_vpacker.pack_start (whvbox, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (button_table, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (processor_box, true, true);
+       }
        global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (top_button_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (rec_solo_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (middle_button_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
-       global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+       if (!ARDOUR::Profile->get_trx()) {
+               global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
+               global_vpacker.pack_start (_comment_button, Gtk::PACK_SHRINK);
+       } else {
+               global_vpacker.pack_start (name_button, Gtk::PACK_SHRINK);
+       }
 
        global_frame.add (global_vpacker);
        global_frame.set_shadow_type (Gtk::SHADOW_IN);
@@ -495,6 +516,10 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                rec_enable_button->set_sensitive (_session->writable());
                rec_enable_button->show();
 
+               if (ARDOUR::Profile->get_trx()) {
+                       rec_solo_table.attach (*monitor_input_button, 1, 2, 0, 2);
+               }
+
        } else {
 
                /* non-master bus */
@@ -515,7 +540,10 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        _route->output()->changed.connect (*this, invalidator (*this), boost::bind (&MixerStrip::update_output_display, this), gui_context());
        _route->route_group_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::route_group_changed, this), gui_context());
 
+       _route->io_changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::io_changed_proxy, this), gui_context ());
+
        if (_route->panner_shell()) {
+               update_panner_choices();
                _route->panner_shell()->Changed.connect (route_connections, invalidator (*this), boost::bind (&MixerStrip::connect_to_pan, this), gui_context());
        }
 
@@ -988,18 +1016,11 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
 void
 MixerStrip::update_diskstream_display ()
 {
-       if (is_track()) {
-
-               if (input_selector) {
-                       input_selector->hide_all ();
-               }
+        if (is_track() && input_selector) {
+                        input_selector->hide_all ();
+        }
 
-               route_color_changed ();
-
-       } else {
-
-               show_passthru_color ();
-       }
+        route_color_changed ();
 }
 
 void
@@ -1019,9 +1040,33 @@ MixerStrip::connect_to_pan ()
        p->automation_state_changed.connect (panstate_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_state_changed, &panners), gui_context());
        p->automation_style_changed.connect (panstyle_connection, invalidator (*this), boost::bind (&PannerUI::pan_automation_style_changed, &panners), gui_context());
 
-       panners.panshell_changed ();
+       /* This call reduncant, PannerUI::set_panner() connects to _panshell->Changed itself
+        * However, that only works a panner was previously set.
+        *
+        * PannerUI must remain subscribed to _panshell->Changed() in case
+        * we switch the panner eg. AUX-Send and back
+        * _route->panner_shell()->Changed() vs _panshell->Changed
+        */
+       if (panners._panner == 0) {
+               panners.panshell_changed ();
+       }
+       update_panner_choices();
 }
 
+void
+MixerStrip::update_panner_choices ()
+{
+       ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices)
+       if (!_route->panner_shell()) { return; }
+
+       uint32_t in = _route->output()->n_ports().n_audio();
+       uint32_t out = in;
+       if (_route->panner()) {
+               in = _route->panner()->in().n_audio();
+       }
+
+       panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
+}
 
 /*
  * Output port labelling
@@ -1272,6 +1317,12 @@ MixerStrip::diskstream_changed ()
        Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&MixerStrip::update_diskstream_display, this));
 }
 
+void
+MixerStrip::io_changed_proxy ()
+{
+       Glib::signal_idle().connect_once (sigc::mem_fun (*this, &MixerStrip::update_panner_choices));
+}
+
 void
 MixerStrip::port_connected_or_disconnected (boost::weak_ptr<Port> wa, boost::weak_ptr<Port> wb)
 {
@@ -1836,22 +1887,20 @@ MixerStrip::show_send (boost::shared_ptr<Send> send)
 
        set_current_delivery (send);
 
+       send->meter()->set_type(_route->shared_peak_meter()->get_type());
        send->set_metering (true);
        _current_delivery->DropReferences.connect (send_gone_connection, invalidator (*this), boost::bind (&MixerStrip::revert_to_default_display, this), gui_context());
 
        gain_meter().set_controls (_route, send->meter(), send->amp());
        gain_meter().setup_meters ();
 
+       uint32_t const in = _current_delivery->pans_required();
+       uint32_t const out = _current_delivery->pan_outs();
+
        panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner());
+       panner_ui().set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out));
        panner_ui().setup_pan ();
-
-       /* make sure the send has audio output */
-
-       if (_current_delivery->output() && _current_delivery->output()->n_ports().n_audio() > 0) {
-               panners.show_all ();
-       } else {
-               panners.hide_all ();
-       }
+       panner_ui().show_all ();
 
        input_button.set_sensitive (false);
        group_button.set_sensitive (false);
@@ -1884,6 +1933,7 @@ MixerStrip::revert_to_default_display ()
        gain_meter().setup_meters ();
 
        panner_ui().set_panner (_route->main_outs()->panner_shell(), _route->main_outs()->panner());
+       update_panner_choices();
        panner_ui().setup_pan ();
 
        if (has_audio_outputs ()) {
@@ -2105,6 +2155,9 @@ MixerStrip::ab_plugins ()
 bool
 MixerStrip::level_meter_button_press (GdkEventButton* ev)
 {
+       if (_current_delivery && boost::dynamic_pointer_cast<Send>(_current_delivery)) {
+               return false;
+       }
        if (ev->button == 3) {
                popup_level_meter_menu (ev);
                return true;
@@ -2125,8 +2178,8 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
 
        _suspend_menu_callbacks = true;
        add_level_meter_item_point (items, group, _("Input"), MeterInput);
-       add_level_meter_item_point (items, group, _("Pre-fader"), MeterPreFader);
-       add_level_meter_item_point (items, group, _("Post-fader"), MeterPostFader);
+       add_level_meter_item_point (items, group, _("Pre Fader"), MeterPreFader);
+       add_level_meter_item_point (items, group, _("Post Fader"), MeterPostFader);
        add_level_meter_item_point (items, group, _("Output"), MeterOutput);
        add_level_meter_item_point (items, group, _("Custom"), MeterCustom);
 
@@ -2141,6 +2194,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14);
+       add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK12), MeterK12);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU),  MeterVU);
 
        int _strip_type;