Fix #2926 and #2927; presence and behaviour of solo/mute icons in the editor list.
authorCarl Hetherington <carl@carlh.net>
Thu, 26 Nov 2009 03:02:16 +0000 (03:02 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 26 Nov 2009 03:02:16 +0000 (03:02 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6185 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_routes.h
gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h

index ed3f1790a860a58e513b9d62ab8bcb53cc8a6233..32dfa77f484b10b5a968858d10c1b49b22765942 100644 (file)
@@ -92,7 +92,6 @@ EditorRoutes::EditorRoutes (Editor* e)
        Gtk::TreeViewColumn* mute_state_column = manage (new TreeViewColumn("M", *mute_col_renderer));
 
        mute_state_column->add_attribute(mute_col_renderer->property_state(), _columns.mute_state);
-       mute_state_column->add_attribute(mute_col_renderer->property_visible(), _columns.is_track);
 
        // Solo enable toggle
        CellRendererPixbufMulti* solo_col_renderer = manage (new CellRendererPixbufMulti());
@@ -104,8 +103,6 @@ EditorRoutes::EditorRoutes (Editor* e)
        Gtk::TreeViewColumn* solo_state_column = manage (new TreeViewColumn("S", *solo_col_renderer));
 
        solo_state_column->add_attribute(solo_col_renderer->property_state(), _columns.solo_state);
-       solo_state_column->add_attribute(solo_col_renderer->property_visible(), _columns.is_track);
-
        
        _display.append_column (*rec_state_column);
        _display.append_column (*mute_state_column);
@@ -157,6 +154,8 @@ EditorRoutes::connect_to_session (Session* s)
        EditorComponent::connect_to_session (s);
 
        initial_display ();
+
+       _session->SoloChanged.connect (mem_fun (*this, &EditorRoutes::solo_changed_so_update_mute));
 }
 
 void
@@ -184,8 +183,8 @@ EditorRoutes::on_tv_mute_enable_toggled (Glib::ustring const & path_string)
        TimeAxisView *tv = row[_columns.tv];
        AudioTimeAxisView *atv = dynamic_cast<AudioTimeAxisView*> (tv);
 
-       if (atv != 0 && atv->is_audio_track()){
-               atv->reversibly_apply_track_boolean ("mute-enable change", &Track::set_mute, !atv->track()->muted(), this);
+       if (atv != 0{
+               atv->reversibly_apply_route_boolean ("mute-enable change", &Route::set_mute, !atv->route()->muted(), this);
        }
 }
 
@@ -198,8 +197,8 @@ EditorRoutes::on_tv_solo_enable_toggled (Glib::ustring const & path_string)
        TimeAxisView *tv = row[_columns.tv];
        AudioTimeAxisView *atv = dynamic_cast<AudioTimeAxisView*> (tv);
 
-       if (atv != 0 && atv->is_audio_track()){
-               atv->reversibly_apply_track_boolean ("solo-enable change", &Track::set_solo, !atv->track()->soloed(), this);
+       if (atv != 0{
+               atv->reversibly_apply_route_boolean ("solo-enable change", &Route::set_solo, !atv->route()->soloed(), this);
        }
 }
 
@@ -354,9 +353,10 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
                if ((*x)->is_track()) {
                        boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route());
                        t->diskstream()->RecordEnableChanged.connect (mem_fun (*this, &EditorRoutes::update_rec_display));
-                       t->mute_changed.connect (mem_fun (*this, &EditorRoutes::update_mute_display));
-                       t->solo_changed.connect (mem_fun (*this, &EditorRoutes::update_solo_display));
                }
+
+               (*x)->route()->mute_changed.connect (mem_fun (*this, &EditorRoutes::update_mute_display));
+               (*x)->route()->solo_changed.connect (mem_fun (*this, &EditorRoutes::update_solo_display));
        }
 
        update_rec_display ();
@@ -911,15 +911,7 @@ EditorRoutes::update_mute_display (void* /*src*/)
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                boost::shared_ptr<Route> route = (*i)[_columns.route];
-
-               if (boost::dynamic_pointer_cast<Track>(route)) {
-
-                       if (route->muted()){
-                               (*i)[_columns.mute_state] = 1;
-                       } else {
-                               (*i)[_columns.mute_state] = 0;
-                       }
-               }
+               (*i)[_columns.mute_state] = RouteUI::mute_visual_state (*_session, route) > 0 ? 1 : 0;
        }
 }
 
@@ -931,15 +923,7 @@ EditorRoutes::update_solo_display (void* /*src*/)
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                boost::shared_ptr<Route> route = (*i)[_columns.route];
-
-               if (boost::dynamic_pointer_cast<Track>(route)) {
-
-                       if (route->soloed()){
-                               (*i)[_columns.solo_state] = 1;
-                       } else {
-                               (*i)[_columns.solo_state] = 0;
-                       }
-               }
+               (*i)[_columns.solo_state] = RouteUI::solo_visual_state (route) > 0 ? 1 : 0;
        }
 }
 
@@ -976,3 +960,11 @@ EditorRoutes::name_edit (Glib::ustring const & path, Glib::ustring const & new_t
                route->set_name (new_text);
        }
 }
+
+void
+EditorRoutes::solo_changed_so_update_mute ()
+{
+       ENSURE_GUI_THREAD (mem_fun (*this, &EditorRoutes::solo_changed_so_update_mute));
+
+       update_mute_display (this);
+}
index 880845ce38339b1b43298715383616a31d89829a..454f850c52c90714aa75ce0a07937a5e6f42d2d8 100644 (file)
@@ -83,6 +83,7 @@ private:
        void track_list_reorder (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const & iter, int* new_order);
        bool selection_filter (Glib::RefPtr<Gtk::TreeModel> const &, Gtk::TreeModel::Path const &, bool);
        void name_edit (Glib::ustring const &, Glib::ustring const &);
+       void solo_changed_so_update_mute ();
 
        struct ModelColumns : public Gtk::TreeModel::ColumnRecord {
                ModelColumns() {
index 2de7c6964efce374c8e0b3245d5e1bb7caf7d9e7..9e682573ca3ec5a8058f083ea2b0cc96f8d3ff99 100644 (file)
@@ -658,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())) {
@@ -671,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
@@ -708,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 ()
 {
@@ -724,29 +767,7 @@ RouteUI::update_mute_display ()
                ignore_toggle = false;
        }
 
-       /* now attend to visual state */
-
-       if (Config->get_show_solo_mutes()) {
-               if (_route->muted()) {
-                       /* full mute */
-                       mute_button->set_visual_state (2);
-               } else if (_session.soloing() && !_route->soloed() && !_route->solo_isolated()) {
-                       /* mute-because-not-soloed */
-                       mute_button->set_visual_state (1);
-               } else {
-                       /* no mute at all */
-                       mute_button->set_visual_state (0);
-               }
-       } else {
-               if (_route->muted()) {
-                       /* full mute */
-                       mute_button->set_visual_state (2);
-               } else {
-                       /* no mute at all */
-                       mute_button->set_visual_state (0);
-               }
-       }
-
+       mute_button->set_visual_state (mute_visual_state (_session, _route));
 }
 
 void
index 53dd810541bedaddad4acb5588d080a07a87b2c7..ebc686b4385952b96c8730b7f0a5abfbc5e11dcf 100644 (file)
@@ -195,6 +195,9 @@ class RouteUI : public virtual AxisView
        void save_as_template ();
        void open_remote_control_id_dialog ();
 
+       static int solo_visual_state (boost::shared_ptr<ARDOUR::Route>);
+       static int mute_visual_state (ARDOUR::Session &, boost::shared_ptr<ARDOUR::Route>);
+
    protected:
        std::vector<sigc::connection> connections;
        bool self_destruct;