X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fcontrol_slave_ui.cc;h=0c8ad87d28da3b26eed082cc0d25bb40a5c86be3;hb=e42699600b92db69a428979dc0412c96f7494141;hp=3fd752c72f0d8be19c364b905c8845b5a7c7566d;hpb=212afd402c98e71e3ccc6ce3c8795234aef66f54;p=ardour.git diff --git a/gtk2_ardour/control_slave_ui.cc b/gtk2_ardour/control_slave_ui.cc index 3fd752c72f..0c8ad87d28 100644 --- a/gtk2_ardour/control_slave_ui.cc +++ b/gtk2_ardour/control_slave_ui.cc @@ -20,7 +20,7 @@ #include -#include "pbd/convert.h" +#include "pbd/string_convert.h" #include "ardour/session.h" #include "ardour/stripable.h" @@ -31,27 +31,28 @@ #include "gtkmm2ext/gtk_ui.h" #include "gtkmm2ext/utils.h" -#include "ardour_button.h" #include "control_slave_ui.h" #include "gui_thread.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; +using namespace ArdourWidgets; using namespace Gtk; using std::string; ControlSlaveUI::ControlSlaveUI (Session* s) : SessionHandlePtr (s) , initial_button (ArdourButton::default_elements) + , context_menu (0) { set_no_show_all (true); - Gtkmm2ext::UI::instance()->set_tip (*this, _("Control Masters")); + Gtkmm2ext::UI::instance()->set_tip (*this, _("VCA Assign")); initial_button.set_no_show_all (true); initial_button.set_name (X_("vca assign")); - initial_button.set_text (_("-vca-")); + initial_button.set_text (_("-VCAs-")); initial_button.show (); initial_button.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); initial_button.signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::vca_button_release), 0), false); @@ -59,6 +60,11 @@ ControlSlaveUI::ControlSlaveUI (Session* s) pack_start (initial_button, true, true); } +ControlSlaveUI::~ControlSlaveUI () +{ + delete context_menu; +} + void ControlSlaveUI::set_stripable (boost::shared_ptr s) { @@ -94,15 +100,18 @@ ControlSlaveUI::update_vca_display () Gtkmm2ext::container_clear (*this); master_connections.drop_connections (); - for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { - if (stripable->gain_control()->slaved_to ((*v)->gain_control())) { - add_vca_button (*v); - any = true; + if (stripable) { + for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { + if (stripable->gain_control()->slaved_to ((*v)->gain_control())) { + add_vca_button (*v); + any = true; + } } } if (!any) { pack_start (initial_button, true, true); + initial_button.show (); } show (); @@ -175,28 +184,24 @@ ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n) return true; } - Menu* menu = new Menu; - MenuList& items = menu->items(); + delete context_menu; + context_menu = new Menu; + MenuList& items = context_menu->items(); bool slaved = false; for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) { - boost::shared_ptr gcs = stripable->gain_control(); - boost::shared_ptr 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 */ + if (stripable->assigned_to (_session->vca_manager_ptr (), *v)) { + /* master(stripable) is directly or indirectly controlled by slave (v) */ continue; } items.push_back (CheckMenuElem ((*v)->name())); Gtk::CheckMenuItem* item = dynamic_cast (&items.back()); + boost::shared_ptr gcs = stripable->gain_control(); + boost::shared_ptr gcm = (*v)->gain_control(); + if (gcs->slaved_to (gcm)) { item->set_active (true); slaved = true; @@ -210,7 +215,7 @@ ControlSlaveUI::vca_button_release (GdkEventButton* ev, uint32_t n) } if (!items.empty()) { - menu->popup (1, ev->time); + context_menu->popup (1, ev->time); } return true; @@ -225,7 +230,7 @@ ControlSlaveUI::add_vca_button (boost::shared_ptr vca) vca_button->set_name (X_("vca assign")); vca_button->add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK); vca_button->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &ControlSlaveUI::specific_vca_button_release), vca->number()), false); - vca_button->set_text (PBD::to_string (vca->number(), std::dec)); + vca_button->set_text (PBD::to_string (vca->number())); vca_button->set_fixed_colors (vca->presentation_info().color(), vca->presentation_info().color ()); vca->presentation_info().PropertyChanged.connect (master_connections, invalidator (*this), boost::bind (&ControlSlaveUI::master_property_changed, this, _1), gui_context());