diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-06-09 13:12:04 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-06-09 13:12:09 -0400 |
commit | 3670f1adac3e50c9840d2215cd0441d97255e357 (patch) | |
tree | 1b9717b3f5370ed84448c652aedd306b64967c4b | |
parent | 0678d0ada1bfb1eaebb1e4d761ea0336b3537cbf (diff) |
use ControlSlaveUI in VCAMasterStrip
-rw-r--r-- | gtk2_ardour/control_slave_ui.cc | 28 | ||||
-rw-r--r-- | gtk2_ardour/vca_master_strip.cc | 121 | ||||
-rw-r--r-- | gtk2_ardour/vca_master_strip.h | 8 |
3 files changed, 34 insertions, 123 deletions
diff --git a/gtk2_ardour/control_slave_ui.cc b/gtk2_ardour/control_slave_ui.cc index 7be2d5daba..12a3495293 100644 --- a/gtk2_ardour/control_slave_ui.cc +++ b/gtk2_ardour/control_slave_ui.cc @@ -172,19 +172,41 @@ ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n) Menu* menu = new Menu; MenuList& items = menu->items(); + bool slaved = false; for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { + + boost::shared_ptr<GainControl> gcs = stripable->gain_control(); + boost::shared_ptr<GainControl> gcm = (*v)->gain_control(); + + if (gcs == gcm) { + /* asked to slave to self. not ok */ + continue; + } + + if (gcm->slaved_to (gcs)) { + /* master is already slaved to slave */ + continue; + } + items.push_back (CheckMenuElem ((*v)->name())); Gtk::CheckMenuItem* item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back()); - if (stripable->gain_control()->slaved_to ((*v)->gain_control())) { + + if (gcs->slaved_to (gcm)) { item->set_active (true); + slaved = true; } + item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_menu_toggle), item, (*v)->number())); } - items.push_back (MenuElem (_("Unassign All"), sigc::mem_fun (*this, &ControlSlaveUI::unassign_all))); + if (slaved) { + items.push_back (MenuElem (_("Unassign All"), sigc::mem_fun (*this, &ControlSlaveUI::unassign_all))); + } - menu->popup (1, ev->time); + if (!items.empty()) { + menu->popup (1, ev->time); + } return true; } diff --git a/gtk2_ardour/vca_master_strip.cc b/gtk2_ardour/vca_master_strip.cc index 6ad656c576..4c56832b23 100644 --- a/gtk2_ardour/vca_master_strip.cc +++ b/gtk2_ardour/vca_master_strip.cc @@ -53,7 +53,10 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) , gain_meter (s, 254) , context_menu (0) , delete_dialog (0) + , control_slave_ui (s) { + control_slave_ui.set_stripable (boost::dynamic_pointer_cast<Stripable> (v)); + gain_meter.set_controls (boost::shared_ptr<Route>(), boost::shared_ptr<PeakMeter>(), boost::shared_ptr<Amp>(), @@ -71,10 +74,6 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) hide_button.set_icon (ArdourIcon::CloseCross); set_tooltip (&hide_button, _("Hide this VCA strip")); - assign_button.set_name (X_("vca assign")); - set_tooltip (assign_button, _("Click to assign a VCA Master to this VCA")); - assign_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vca_button_release), false); - hide_button.signal_clicked.connect (sigc::mem_fun(*this, &VCAMasterStrip::hide_clicked)); solo_mute_box.set_spacing (2); @@ -111,7 +110,7 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) global_vpacker.pack_start (vertical_button, true, true); global_vpacker.pack_start (solo_mute_box, false, false); global_vpacker.pack_start (gain_meter, false, false, 2); - global_vpacker.pack_start (assign_button, false, false); + global_vpacker.pack_start (control_slave_ui, false, false); global_vpacker.pack_start (drop_button, false, false); global_vpacker.pack_start (bottom_padding, false, false); @@ -130,7 +129,7 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) number_label.show (); gain_meter.show (); solo_mute_box.show_all (); - assign_button.show (); + control_slave_ui.show (); drop_button.show (); /* force setting of visible selected status */ @@ -138,7 +137,6 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) _selected = true; set_selected (false); set_solo_text (); - update_vca_display (); update_vca_name (); solo_changed (); mute_changed (); @@ -147,19 +145,11 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v) Mixer_UI::instance()->show_vca_change.connect (sigc::mem_fun (*this, &VCAMasterStrip::spill_change)); _vca->PropertyChanged.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::vca_property_changed, this, _1), gui_context()); + _vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::self_delete, this), gui_context()); _vca->solo_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::solo_changed, this), gui_context()); _vca->mute_control()->Changed.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::mute_changed, this), gui_context()); - /* only need to connect to one of these to update VCA status */ - - _vca->gain_control()->MasterStatusChange.connect (vca_connections, - invalidator (*this), - boost::bind (&VCAMasterStrip::update_vca_display, this), - gui_context()); - - - _vca->DropReferences.connect (vca_connections, invalidator (*this), boost::bind (&VCAMasterStrip::self_delete, this), gui_context()); s->config.ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context()); Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&VCAMasterStrip::parameter_changed, this, _1), gui_context()); @@ -219,31 +209,6 @@ VCAMasterStrip::set_button_names () } } -void -VCAMasterStrip::update_vca_display () -{ - VCAList vcas (_session->vca_manager().vcas()); - string label; - - for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { - if (_vca->slaved_to (*v)) { - if (!label.empty()) { - label += ' '; - } - label += to_string ((*v)->number(), std::dec); - } - } - - if (label.empty()) { - label = _("-vca-"); - assign_button.set_active_state (Gtkmm2ext::Off); - } else { - assign_button.set_active_state (Gtkmm2ext::ExplicitActive); - } - - assign_button.set_text (label); -} - string VCAMasterStrip::name() const { @@ -363,79 +328,6 @@ VCAMasterStrip::solo_changed () } } -void -VCAMasterStrip::vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n) -{ - boost::shared_ptr<VCA> vca = _session->vca_manager().vca_by_number (n); - - if (!menuitem->get_active()) { - if (!vca) { - /* null VCA means drop all VCA assignments */ - _vca->unassign (boost::shared_ptr<VCA>()); - - } else { - _vca->unassign (vca); - } - } else { - if (vca) { - _vca->assign (vca); - } - } -} - -void -VCAMasterStrip::unassign () -{ - _vca->unassign (boost::shared_ptr<VCA>()); -} - -bool -VCAMasterStrip::vca_button_release (GdkEventButton* ev) -{ - using namespace Gtk::Menu_Helpers; - - if (!_session) { - return false; - } - - /* primary click only */ - - if (ev->button != 1) { - return false; - } - - VCAList 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(); - - items.push_back (MenuElem (_("Unassign"), sigc::mem_fun (*this, &VCAMasterStrip::unassign))); - - for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { - - if (*v == _vca) { - /* no self-mastering */ - continue; - } - - items.push_back (CheckMenuElem ((*v)->name())); - Gtk::CheckMenuItem* item = dynamic_cast<Gtk::CheckMenuItem*> (&items.back()); - if (_vca->gain_control()->slaved_to ((*v)->gain_control())) { - item->set_active (true); - } - item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &VCAMasterStrip::vca_menu_toggle), item, (*v)->number())); - } - - menu->popup (1, ev->time); - - return true; -} - bool VCAMasterStrip::vertical_button_press (GdkEventButton* ev) { @@ -561,4 +453,3 @@ VCAMasterStrip::state_id () const { return string_compose (X_("vms-%1"), _vca->number()); } - diff --git a/gtk2_ardour/vca_master_strip.h b/gtk2_ardour/vca_master_strip.h index 05e9f6366d..63b5e7a896 100644 --- a/gtk2_ardour/vca_master_strip.h +++ b/gtk2_ardour/vca_master_strip.h @@ -26,6 +26,7 @@ #include "ardour_button.h" #include "axis_view.h" +#include "control_slave_ui.h" #include "gain_meter.h" namespace ARDOUR { @@ -64,12 +65,12 @@ class VCAMasterStrip : public AxisView, public Gtk::EventBox ArdourButton number_label; ArdourButton solo_button; ArdourButton mute_button; - ArdourButton assign_button; ArdourButton drop_button; Gtk::Menu* context_menu; - PBD::ScopedConnectionList vca_connections; Gtk::MessageDialog* delete_dialog; ArdourButton vertical_button; + ControlSlaveUI control_slave_ui; + PBD::ScopedConnectionList vca_connections; void spill (); void spill_change (boost::shared_ptr<ARDOUR::VCA>); @@ -82,10 +83,7 @@ class VCAMasterStrip : public AxisView, public Gtk::EventBox void set_solo_text (); void solo_changed (); void mute_changed (); - void vca_menu_toggle (Gtk::CheckMenuItem* menuitem, uint32_t n); void unassign (); - bool vca_button_release (GdkEventButton*); - void update_vca_display (); void start_name_edit (); void finish_name_edit (std::string, int); bool vertical_button_press (GdkEventButton*); |