initial part of vca assignment via context menu
[ardour.git] / gtk2_ardour / mixer_strip.cc
index adb18dec24bdc9d931d83319a531eb7782cb2d92..591b4f42507f9106060f74d125dd85b7a2c19733 100644 (file)
@@ -52,6 +52,8 @@
 #include "ardour/session.h"
 #include "ardour/types.h"
 #include "ardour/user_bundle.h"
+#include "ardour/vca.h"
+#include "ardour/vca_manager.h"
 
 #include "ardour_window.h"
 #include "mixer_strip.h"
@@ -79,9 +81,10 @@ using namespace std;
 using namespace ArdourMeter;
 
 MixerStrip* MixerStrip::_entered_mixer_strip;
-
 PBD::Signal1<void,MixerStrip*> MixerStrip::CatchDeletion;
 
+static const uint32_t n_vca_buttons = 4;
+
 MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
        : AxisView(sess)
        , RouteUI (sess)
@@ -95,6 +98,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
        , solo_iso_table (1, 2)
        , mute_solo_table (1, 2)
        , bottom_button_table (1, 3)
+       , vca_table (1, 4)
        , meter_point_button (_("pre"))
        , monitor_section_button (0)
        , midi_input_enable_button (0)
@@ -126,6 +130,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
        , solo_iso_table (1, 2)
        , mute_solo_table (1, 2)
        , bottom_button_table (1, 3)
+       , vca_table (1, 4)
        , meter_point_button (_("pre"))
        , monitor_section_button (0)
        , midi_input_enable_button (0)
@@ -209,6 +214,22 @@ MixerStrip::init ()
        }
        solo_iso_table.show ();
 
+       vca_table.set_homogeneous (true);
+       vca_table.set_spacings (1);
+       for (uint32_t n = 0; n < n_vca_buttons; ++n) {
+               ArdourButton* v = manage (new ArdourButton (ArdourButton::default_elements));
+               vca_buttons.push_back (v); /* no ownership transfer, button is managed by its container */
+               v->set_no_show_all (true);
+               v->set_name (X_("vca assign"));
+               v->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+               v->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_button_release), n), false);
+               UI::instance()->set_tip (*v, string_compose (_("VCA %1 assign"), n));
+               v->set_text (_("v."));
+               v->show ();
+               vca_table.attach (*v, n, n+1, 0, 1);
+       }
+       vca_table.show ();
+
        rec_mon_table.set_homogeneous (true);
        rec_mon_table.set_row_spacings (2);
        rec_mon_table.set_col_spacings (2);
@@ -304,6 +325,7 @@ MixerStrip::init ()
        global_vpacker.pack_start (solo_iso_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (mute_solo_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+       global_vpacker.pack_start (vca_table, Gtk::PACK_SHRINK);
        global_vpacker.pack_start (bottom_button_table, Gtk::PACK_SHRINK);
        if (!ARDOUR::Profile->get_trx()) {
                global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
@@ -385,6 +407,7 @@ MixerStrip::init ()
        _visibility.add (&solo_iso_table, X_("SoloIsoLock"), _("Solo Iso / Lock"), false);
        _visibility.add (&output_button, X_("Output"), _("Output"), false);
        _visibility.add (&_comment_button, X_("Comments"), _("Comments"), false);
+       _visibility.add (&vca_table, X_("VCA"), _("VCA Assigns"), false);
 
        parameter_changed (X_("mixer-element-visibility"));
        UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &MixerStrip::parameter_changed));
@@ -583,7 +606,6 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
        if (is_track ()) {
 
                rec_mon_table.attach (*rec_enable_button, 0, 1, 0, ARDOUR::Profile->get_mixbus() ? 1 : 2);
-               rec_enable_button->set_sensitive (_session->writable());
                rec_enable_button->show();
 
                if (ARDOUR::Profile->get_mixbus()) {
@@ -1039,9 +1061,9 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
 {
        using namespace Menu_Helpers;
 
-       if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
-               return;
-       }
+       if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs() || *b == *_route->output()->bundle()) {
+               return;
+       }
 
        list<boost::shared_ptr<Bundle> >::iterator i = input_menu_bundles.begin ();
        while (i != input_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1067,9 +1089,9 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
 {
        using namespace Menu_Helpers;
 
-       if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
-               return;
-       }
+       if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) {
+               return;
+       }
 
        list<boost::shared_ptr<Bundle> >::iterator i = output_menu_bundles.begin ();
        while (i != output_menu_bundles.end() && b->has_same_ports (*i) == false) {
@@ -1353,7 +1375,7 @@ MixerStrip::update_io_button (boost::shared_ptr<ARDOUR::Route> route, Width widt
 
        if (for_input) {
                set_tooltip (&input_button, tooltip_cstr);
-       } else {
+       } else {
                set_tooltip (&output_button, tooltip_cstr);
        }
 
@@ -1407,7 +1429,7 @@ void
 MixerStrip::update_input_display ()
 {
        update_io_button (_route, _width, true);
-       panners.setup_pan ();
+       panners.setup_pan ();
 
        if (has_audio_outputs ()) {
                panners.show_all ();
@@ -1421,8 +1443,8 @@ void
 MixerStrip::update_output_display ()
 {
        update_io_button (_route, _width, false);
-       gpm.setup_meters ();
-       panners.setup_pan ();
+       gpm.setup_meters ();
+       panners.setup_pan ();
 
        if (has_audio_outputs ()) {
                panners.show_all ();
@@ -1600,8 +1622,12 @@ MixerStrip::build_route_ops_menu ()
                i->signal_activate().connect (sigc::hide_return (sigc::bind (sigc::mem_fun (*_route, &Route::set_strict_io), !_route->strict_io())));
        }
 
-       items.push_back (SeparatorElem());
+       if (1 /* TODO IFF >= 1 plugin-insert */) {
+               items.push_back (SeparatorElem());
+               items.push_back (MenuElem (_("Pin Connections..."), sigc::mem_fun (*this, &RouteUI::manage_pins)));
+       }
 
+       items.push_back (SeparatorElem());
        items.push_back (MenuElem (_("Adjust Latency..."), sigc::mem_fun (*this, &RouteUI::adjust_latency)));
 
        items.push_back (SeparatorElem());
@@ -1629,7 +1655,7 @@ MixerStrip::build_route_ops_menu ()
                                items.push_back (SeparatorElem());
                                items.push_back (MenuElem (_("Duplicate..."), sigc::mem_fun (*this, &RouteUI::duplicate_selected_routes)));
                        }
-       
+
                        items.push_back (SeparatorElem());
                        items.push_back (MenuElem (_("Remove"), sigc::mem_fun(PublicEditor::instance(), &PublicEditor::remove_tracks)));
                }
@@ -1834,6 +1860,7 @@ MixerStrip::map_frozen ()
        } else {
                processor_box.set_sensitive (true);
        }
+       RouteUI::map_frozen ();
 }
 
 void
@@ -2021,12 +2048,13 @@ MixerStrip::drop_send ()
        meter_point_button.set_sensitive (true);
        mute_button->set_sensitive (true);
        solo_button->set_sensitive (true);
-       rec_enable_button->set_sensitive (true);
        solo_isolated_led->set_sensitive (true);
        solo_safe_led->set_sensitive (true);
        monitor_input_button->set_sensitive (true);
        monitor_disk_button->set_sensitive (true);
        _comment_button.set_sensitive (true);
+       RouteUI::check_rec_enable_sensitivity ();
+       set_button_names (); // update solo button visual state
 }
 
 void
@@ -2462,3 +2490,48 @@ MixerStrip::set_meter_type (MeterType t)
        if (_suspend_menu_callbacks) return;
        gpm.set_type (t);
 }
+
+void
+MixerStrip::vca_menu_toggle (uint32_t n)
+{
+       if (!_route) {
+               return;
+       }
+
+       boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n);
+
+       if (!vca) {
+               return;
+       }
+
+       vca->add (_route);
+}
+
+bool
+MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
+{
+       using namespace Gtk::Menu_Helpers;
+
+       if (!_session || !Keyboard::is_context_menu_event (ev)) {
+               return false;
+       }
+
+       VCAManager::VCAS vcas (_session->vca_manager().vcas());
+
+       if (vcas.empty()) {
+               /* XXX should probably show a message saying "No VCA masters" */
+               return true;
+       }
+
+       Menu* menu = new Menu;
+       MenuList& items = menu->items();
+       RadioMenuItem::Group group;
+
+       for (VCAManager::VCAS::iterator v = vcas.begin(); v != vcas.end(); ++v) {
+               items.push_back (RadioMenuElem (group, (*v)->name(), sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_menu_toggle), (*v)->number())));
+       }
+
+       menu->popup (1, ev->time);
+
+       return true;
+}