Patch from acolomb to add a popup menu for solo iso/lock if
[ardour.git] / gtk2_ardour / route_ui.cc
index 9bedb9b521a75c36746722d2ff3b86d2372bc1cb..3eca92702a948c9c2f940783cc38202dd0284e61 100644 (file)
@@ -64,6 +64,8 @@ using namespace ARDOUR;
 using namespace PBD;
 
 uint32_t RouteUI::_max_invert_buttons = 3;
+sigc::signal<void, boost::shared_ptr<Route> > RouteUI::BusSendDisplayChanged;
+boost::weak_ptr<Route> RouteUI::_showing_sends_to;
 
 RouteUI::RouteUI (ARDOUR::Session* sess)
        : AxisView(sess)
@@ -165,6 +167,8 @@ RouteUI::init ()
 
        monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press));
        monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release));
+
+       BusSendDisplayChanged.connect (sigc::mem_fun (*this, &RouteUI::bus_send_display_changed));
 }
 
 void
@@ -258,6 +262,9 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 
        setup_invert_buttons ();
        set_invert_button_state ();
+
+       boost::shared_ptr<Route> s = _showing_sends_to.lock ();
+       bus_send_display_changed (s);
 }
 
 void
@@ -378,7 +385,8 @@ RouteUI::solo_press(GdkEventButton* ev)
 
                if (Keyboard::is_context_menu_event (ev)) {
 
-                        if (!solo_isolated_led) {
+                        if (! (solo_isolated_led && solo_isolated_led->is_visible()) ||
+                           ! (solo_safe_led && solo_safe_led->is_visible())) {
 
                                 if (solo_menu == 0) {
                                         build_solo_menu ();
@@ -539,10 +547,6 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
                 }
         }
 
-       cerr << name() << " re button press, i am " << _i_am_the_modifier << " active state = " 
-            << rec_enable_button->active_state()
-            << endl;
-
        if (!_i_am_the_modifier && is_track() && rec_enable_button) {
 
                if (Keyboard::is_button2_event (ev)) {
@@ -888,22 +892,13 @@ RouteUI::show_sends_press(GdkEventButton* ev)
 
                } else {
 
-                       /* change button state */
-
-                       show_sends_button->set_active_state (Active);
-
-                       /* start blinking */
+                       boost::shared_ptr<Route> s = _showing_sends_to.lock ();
 
-                       if (show_sends_button->active_state()) {
-                               /* show sends to this bus */
-                               MixerStrip::SwitchIO (_route);
-                               send_blink_connection = ARDOUR_UI::instance()->Blink.connect (sigc::mem_fun(*this, &RouteUI::send_blink));
+                       if (s == _route) {
+                               set_showing_sends_to (boost::shared_ptr<Route> ());
                        } else {
-                               /* everybody back to normal */
-                               send_blink_connection.disconnect ();
-                               MixerStrip::SwitchIO (boost::shared_ptr<Route>());
+                               set_showing_sends_to (_route);
                        }
-
                }
        }
 
@@ -924,9 +919,9 @@ RouteUI::send_blink (bool onoff)
        }
 
        if (onoff) {
-               show_sends_button->set_state (STATE_ACTIVE);
+               show_sends_button->set_active_state (Gtkmm2ext::Active);
        } else {
-               show_sends_button->set_state (STATE_NORMAL);
+               show_sends_button->unset_active_state ();
        }
 }
 
@@ -993,7 +988,7 @@ RouteUI::update_solo_display ()
 
        if (Config->get_solo_control_is_listen_control()) {
 
-               if ((solo_button->active_state() == Active)!= (x = _route->listening_via_monitor())) {
+               if ((bool) solo_button->active_state() != (x = _route->listening_via_monitor())) {
                        ++_i_am_the_modifier;
                        solo_button->set_active_state (Active);
                        --_i_am_the_modifier;
@@ -1001,7 +996,7 @@ RouteUI::update_solo_display ()
 
        } else {
 
-               if ((solo_button->active_state() == Active) != (x = _route->soloed())) {
+               if ((bool) solo_button->active_state() != (x = _route->soloed())) {
                        ++_i_am_the_modifier;
                        if (x) {
                                solo_button->set_active_state (Active);
@@ -1066,7 +1061,7 @@ RouteUI::mute_changed(void* /*src*/)
 ActiveState
 RouteUI::mute_active_state (Session* s, boost::shared_ptr<Route> r)
 {
-       if (r->is_master() || r->is_monitor()) {
+       if (r->is_monitor()) {
                return ActiveState(0);
        }
 
@@ -1923,3 +1918,28 @@ RouteUI::color () const
 
        return _color;
 }
+
+void
+RouteUI::set_showing_sends_to (boost::shared_ptr<Route> send_to)
+{
+       _showing_sends_to = send_to;
+       BusSendDisplayChanged (send_to); /* EMIT SIGNAL */
+}
+
+void
+RouteUI::bus_send_display_changed (boost::shared_ptr<Route> send_to)
+{
+       if (_route == send_to) {
+               show_sends_button->set_active_state (Gtkmm2ext::Active);
+               send_blink_connection = ARDOUR_UI::instance()->Blink.connect (sigc::mem_fun (*this, &RouteUI::send_blink));
+       } else {
+               show_sends_button->unset_active_state ();
+               send_blink_connection.disconnect ();
+       }
+}
+
+RouteGroup*
+RouteUI::route_group() const
+{
+       return _route->route_group();
+}