don't bother doing port stuff if session is being deleted
[ardour.git] / gtk2_ardour / route_ui.cc
index e06b9b18c4327c462193defff0fbc1e67eac0939..fe2adff44985e572ba6b77783679dd7214d94c97 100644 (file)
@@ -398,19 +398,10 @@ RouteUI::solo_press(GdkEventButton* ev)
 
                                        } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
 
-                                               // shift-click: set this route to solo safe
-
-                                               if (Profile->get_sae() && ev->button == 1) {
-                                                       // button 1 and shift-click: disables solo_latched for this click
-                                                       if (!Config->get_solo_latched ()) {
-                                                               Config->set_solo_latched (true);
-                                                               reversibly_apply_route_boolean ("solo change", &Route::set_solo, !_route->soloed(), this);
-                                                               Config->set_solo_latched (false);
-                                                       }
-                                               } else {
-                                                       _route->set_solo_isolated (!_route->solo_isolated(), this);
-                                                       wait_for_release = false;
-                                               }
+                                               // shift-click: toggle solo isolated status
+
+                                               _route->set_solo_isolated (!_route->solo_isolated(), this);
+                                               wait_for_release = false;
 
                                        } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
 
@@ -667,11 +658,36 @@ RouteUI::listen_changed(void* /*src*/)
        Gtkmm2ext::UI::instance()->call_slot (mem_fun (*this, &RouteUI::update_solo_display));
 }
 
+int
+RouteUI::solo_visual_state (boost::shared_ptr<Route> r)
+{
+       if (Config->get_solo_control_is_listen_control()) {
+
+               if (r->listening()) {
+                       return 1;
+               } else {
+                       return 0;
+               }
+
+       } else {
+
+               if (r->solo_isolated()) {
+                       return 2;
+               } else if (r->soloed()) {
+                       return 1;
+               } else {
+                       return 0;
+               }
+       }
+
+       return 0;
+}
+
 void
 RouteUI::update_solo_display ()
 {
        bool x;
-
+       
        if (Config->get_solo_control_is_listen_control()) {
 
                if (solo_button->get_active() != (x = _route->listening())) {
@@ -680,29 +696,17 @@ RouteUI::update_solo_display ()
                        ignore_toggle = false;
                }
 
-               if (x) {
-                       solo_button->set_visual_state (1);
-               } else {
-                       solo_button->set_visual_state (0);
-               }
-
-
        } else {
 
-               if (solo_button->get_active() != (x = _route->soloed())){
+               if (solo_button->get_active() != (x = _route->soloed())) {
                        ignore_toggle = true;
                        solo_button->set_active (x);
                        ignore_toggle = false;
                }
 
-               if (_route->solo_isolated()) {
-                       solo_button->set_visual_state (2);
-               } else if (x) {
-                       solo_button->set_visual_state (1);
-               } else {
-                       solo_button->set_visual_state (0);
-               }
        }
+
+       solo_button->set_visual_state (solo_visual_state (_route));
 }
 
 void
@@ -717,6 +721,36 @@ RouteUI::mute_changed(void* /*src*/)
        Gtkmm2ext::UI::instance()->call_slot (mem_fun (*this, &RouteUI::update_mute_display));
 }
 
+int
+RouteUI::mute_visual_state (Session& s, boost::shared_ptr<Route> r)
+{
+       if (Config->get_show_solo_mutes()) {
+               
+               if (r->muted ()) {
+                       /* full mute */
+                       return 2;
+               } else if (s.soloing() && !r->soloed() && !r->solo_isolated()) {
+                       /* mute-because-not-soloed */
+                       return 1;
+               } else {
+                       /* no mute at all */
+                       return 0;
+               }
+
+       } else {
+
+               if (r->muted()) {
+                       /* full mute */
+                       return 2;
+               } else {
+                       /* no mute at all */
+                       return 0;
+               }
+       }
+
+       return 0;
+}
+
 void
 RouteUI::update_mute_display ()
 {
@@ -733,24 +767,7 @@ RouteUI::update_mute_display ()
                ignore_toggle = false;
        }
 
-       /* now attend to visual state */
-
-       if (Config->get_show_solo_mutes()) {
-               if (_route->muted()) {
-                       mute_button->set_visual_state (2);
-               } else if (!_route->soloed() && _session.soloing()) {
-                       mute_button->set_visual_state (1);
-               } else {
-                       mute_button->set_visual_state (0);
-               }
-       } else {
-               if (_route->muted()) {
-                       mute_button->set_visual_state (2);
-               } else {
-                       mute_button->set_visual_state (0);
-               }
-       }
-
+       mute_button->set_visual_state (mute_visual_state (_session, _route));
 }
 
 void
@@ -780,9 +797,6 @@ RouteUI::update_rec_display ()
                rec_enable_button->set_active (model);
                ignore_toggle = false;
        }
-       else {
-               return;
-       }
 
        /* now make sure its color state is correct */
 
@@ -822,6 +836,13 @@ RouteUI::build_solo_menu (void)
        items.push_back (CheckMenuElem(*check));
        check->show_all();
 
+       check = new CheckMenuItem(_("Solo Safe"));
+       check->set_active (_route->solo_safe());
+       check->signal_toggled().connect (bind (mem_fun (*this, &RouteUI::toggle_solo_safe), check));
+       _route->solo_safe_changed.connect(bind (mem_fun (*this, &RouteUI::solo_safe_toggle), check));
+       items.push_back (CheckMenuElem(*check));
+       check->show_all();
+
        //items.push_back (SeparatorElem());
        // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn)));
 
@@ -922,6 +943,12 @@ RouteUI::toggle_solo_isolated (Gtk::CheckMenuItem* check)
        _route->set_solo_isolated (check->get_active(), this);
 }
 
+void
+RouteUI::toggle_solo_safe (Gtk::CheckMenuItem* check)
+{
+       _route->set_solo_safe (check->get_active(), this);
+}
+
 void
 RouteUI::set_route_group_solo(boost::shared_ptr<Route> route, bool yn)
 {
@@ -1226,6 +1253,17 @@ RouteUI::solo_isolated_toggle(void* /*src*/, Gtk::CheckMenuItem* check)
        }
 }
 
+
+void
+RouteUI::solo_safe_toggle(void* /*src*/, Gtk::CheckMenuItem* check)
+{
+       bool yn = _route->solo_safe ();
+
+       if (check->get_active() != yn) {
+               check->set_active (yn);
+       }
+}
+
 void
 RouteUI::disconnect_input ()
 {