start shaping up VCA assign process
[ardour.git] / gtk2_ardour / mixer_strip.cc
index 673bce61d1f3548eb79297ff2e6403d72e9fbda4..d080e79c3805e91184e56330ec54123a4245909a 100644 (file)
@@ -2492,7 +2492,7 @@ MixerStrip::set_meter_type (MeterType t)
 }
 
 void
-MixerStrip::vca_menu_toggle (uint32_t n)
+MixerStrip::vca_menu_toggle (MenuItem* m, uint32_t n)
 {
        if (!_route) {
                return;
@@ -2504,9 +2504,44 @@ MixerStrip::vca_menu_toggle (uint32_t n)
                return;
        }
 
+       RadioMenuItem* ri = dynamic_cast<RadioMenuItem*> (m);
+
+       if (!ri) {
+               return;
+       }
+
+       if (!ri->get_active()) {
+               _mixer.do_vca_unassign (vca);
+               return;
+       }
+
+       /* Now invoke a global method to apply this all relevant strips/routes */
+
+       _mixer.do_vca_assign (vca);
+}
+
+void
+MixerStrip::vca_assign (boost::shared_ptr<VCA> vca)
+{
+       if (!vca || !_route) {
+               return;
+       }
+
        vca->add (_route);
 }
 
+void
+MixerStrip::vca_unassign (boost::shared_ptr<VCA> vca)
+{
+       if (!_route) {
+               return;
+       }
+
+       if (!vca) {
+               /* null VCA means drop all VCA assignments */
+       }
+}
+
 bool
 MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
 {
@@ -2516,6 +2551,11 @@ MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
                return false;
        }
 
+       if (!_route) {
+               /* no route - nothing to do */
+               return false;
+       }
+
        VCAList vcas (_session->vca_manager().vcas());
 
        if (vcas.empty()) {
@@ -2527,8 +2567,15 @@ MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
        MenuList& items = menu->items();
        RadioMenuItem::Group group;
 
+       items.push_back (MenuElem (_("Unassign"), sigc::bind (sigc::mem_fun (_mixer, &Mixer_UI::do_vca_unassign), boost::shared_ptr<VCA>())));
+
        for (VCAList::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())));
+               items.push_back (RadioMenuElem (group, (*v)->name()));
+               RadioMenuItem* item = dynamic_cast<RadioMenuItem*> (&items.back());
+               if (_route->slaved_to (*v)) {
+                       item->set_active (true);
+               }
+               item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_menu_toggle), item, (*v)->number()));
        }
 
        menu->popup (1, ev->time);