add solo isolate indicator in editor route list
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Dec 2009 20:51:35 +0000 (20:51 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 10 Dec 2009 20:51:35 +0000 (20:51 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6343 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardbg
gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_routes.h
gtk2_ardour/icons/solo-isolated.png [new file with mode: 0644]
gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h
libs/ardour/ardour/route.h
libs/ardour/route.cc
libs/midi++2/port.cc

index 11617af1f4ecff011a7997070caf91f13245b532..c3e8e1ffc6744319e67d6d49315fd3a594d552c4 100755 (executable)
@@ -2,4 +2,4 @@
 . `dirname "$0"`/../build/default/gtk2_ardour/ardev_common_waf.sh
 LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
 export ARDOUR_INSIDE_GDB=1
-exec gdb --args $TOP/$EXECUTABLE "$@"
+exec gdb $TOP/$EXECUTABLE $@
index 9cd5231d411b51f834ddb7149a1d3ad7eedb7ce5..d0720b04fbd1d5fe664c1fb49c58eb65ba6c9552 100644 (file)
@@ -105,18 +105,24 @@ EditorRoutes::EditorRoutes (Editor* e)
 
        solo_state_column->add_attribute(solo_col_renderer->property_state(), _columns.solo_state);
 
+       // Solo isolate toggle
+       CellRendererPixbufMulti* solo_iso_renderer = manage (new CellRendererPixbufMulti());
+
+       solo_iso_renderer->set_pixbuf (0, ::get_icon("act-disabled"));
+       solo_iso_renderer->set_pixbuf (1, ::get_icon("solo-isolated"));
+       solo_iso_renderer->signal_changed().connect (mem_fun (*this, &EditorRoutes::on_tv_solo_isolate_toggled));
+
+       TreeViewColumn* solo_isolate_state_column = manage (new TreeViewColumn("I", *solo_iso_renderer));
+
+       solo_isolate_state_column->add_attribute(solo_iso_renderer->property_state(), _columns.solo_isolate_state);
+
        _display.append_column (*rec_state_column);
        _display.append_column (*mute_state_column);
        _display.append_column (*solo_state_column);
+       _display.append_column (*solo_isolate_state_column);
        _display.append_column (_("Show"), _columns.visible);
        _display.append_column (_("Name"), _columns.text);
 
-       _display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
-       _display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
-       _display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
-       _display.get_column (3)->set_data (X_("colnum"), GUINT_TO_POINTER(3));
-       _display.get_column (4)->set_data (X_("colnum"), GUINT_TO_POINTER(4));
-
        _display.set_headers_visible (true);
        _display.set_name ("TrackListDisplay");
        _display.get_selection()->set_mode (SELECTION_SINGLE);
@@ -125,17 +131,17 @@ EditorRoutes::EditorRoutes (Editor* e)
        _display.set_size_request (100, -1);
        _display.add_object_drag (_columns.route.index(), "routes");
 
-       CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (4));
+       CellRendererText* name_cell = dynamic_cast<CellRendererText*> (_display.get_column_cell_renderer (5));
        assert (name_cell);
 
-       TreeViewColumn* name_column = _display.get_column (4);
+       TreeViewColumn* name_column = _display.get_column (5);
        assert (name_column);
 
        name_column->add_attribute (name_cell->property_editable(), _columns.name_editable);
        name_cell->property_editable() = true;
        name_cell->signal_edited().connect (mem_fun (*this, &EditorRoutes::name_edit));
 
-       CellRendererToggle* visible_cell = dynamic_cast<CellRendererToggle*> (_display.get_column_cell_renderer (3));
+       CellRendererToggle* visible_cell = dynamic_cast<CellRendererToggle*> (_display.get_column_cell_renderer (4));
 
        visible_cell->property_activatable() = true;
        visible_cell->property_radio() = false;
@@ -208,6 +214,20 @@ EditorRoutes::on_tv_solo_enable_toggled (Glib::ustring const & path_string)
        }
 }
 
+void
+EditorRoutes::on_tv_solo_isolate_toggled (Glib::ustring const & path_string)
+{
+       // Get the model row that has been toggled.
+       Gtk::TreeModel::Row row = *_model->get_iter (Gtk::TreeModel::Path (path_string));
+
+       TimeAxisView *tv = row[_columns.tv];
+       AudioTimeAxisView *atv = dynamic_cast<AudioTimeAxisView*> (tv);
+
+       if (atv != 0) {
+               atv->route()->set_solo_isolated (!atv->route()->solo_isolated(), this);
+       }
+}
+
 void
 EditorRoutes::build_menu ()
 {
@@ -372,6 +392,7 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
 
                (*x)->route()->mute_changed.connect (mem_fun (*this, &EditorRoutes::update_mute_display));
                (*x)->route()->solo_changed.connect (mem_fun (*this, &EditorRoutes::update_solo_display));
+               (*x)->route()->solo_isolated_changed.connect (mem_fun (*this, &EditorRoutes::update_solo_isolate_display));
        }
 
        update_rec_display ();
@@ -903,6 +924,18 @@ EditorRoutes::update_solo_display (void* /*src*/)
        }
 }
 
+void
+EditorRoutes::update_solo_isolate_display (void* /*src*/)
+{
+       TreeModel::Children rows = _model->children();
+       TreeModel::Children::iterator i;
+
+       for (i = rows.begin(); i != rows.end(); ++i) {
+               boost::shared_ptr<Route> route = (*i)[_columns.route];
+               (*i)[_columns.solo_isolate_state] = RouteUI::solo_isolate_visual_state (route) > 0 ? 1 : 0;
+       }
+}
+
 list<TimeAxisView*>
 EditorRoutes::views () const
 {
index 5b1c42785a865105dd8dd50162445f0c74d57aaa..756796dbda67e23e708174f0c46f0de702bf3abd 100644 (file)
@@ -55,6 +55,7 @@ private:
        void on_tv_rec_enable_toggled (Glib::ustring const &);
        void on_tv_mute_enable_toggled (Glib::ustring const &);
        void on_tv_solo_enable_toggled (Glib::ustring const &);
+       void on_tv_solo_isolate_toggled (Glib::ustring const &);
        void build_menu ();
        void show_menu ();
        void route_deleted (Gtk::TreeModel::Path const &);
@@ -67,6 +68,7 @@ private:
        void update_rec_display ();
        void update_mute_display (void* /*src*/);
        void update_solo_display (void* /*src*/);
+       void update_solo_isolate_display (void* /*src*/);
        void set_all_tracks_visibility (bool);
        void set_all_audio_visibility (int, bool);
        void show_all_routes ();
@@ -93,6 +95,7 @@ private:
                        add (rec_enabled);
                        add (mute_state);
                        add (solo_state);
+                       add (solo_isolate_state);
                        add (is_track);
                        add (tv);
                        add (route);
@@ -104,6 +107,7 @@ private:
                Gtk::TreeModelColumn<bool>           rec_enabled;
                Gtk::TreeModelColumn<uint32_t>       mute_state;
                Gtk::TreeModelColumn<uint32_t>       solo_state;
+               Gtk::TreeModelColumn<uint32_t>       solo_isolate_state;
                Gtk::TreeModelColumn<bool>           is_track;
                Gtk::TreeModelColumn<TimeAxisView*>  tv;
                Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Route> >  route;
diff --git a/gtk2_ardour/icons/solo-isolated.png b/gtk2_ardour/icons/solo-isolated.png
new file mode 100644 (file)
index 0000000..b8e2965
Binary files /dev/null and b/gtk2_ardour/icons/solo-isolated.png differ
index f2333141885fa63fc0e96cff5eb020fca82bd33d..79f76ee7de6db80afb25058ae5a7b1123746b4b4 100644 (file)
@@ -668,6 +668,10 @@ RouteUI::listen_changed(void* /*src*/)
 int
 RouteUI::solo_visual_state (boost::shared_ptr<Route> r)
 {
+       if (r->is_master() || r->is_control()) {
+               return 0;
+       }
+       
        if (Config->get_solo_control_is_listen_control()) {
 
                if (r->listening()) {
@@ -676,25 +680,60 @@ RouteUI::solo_visual_state (boost::shared_ptr<Route> r)
                        return 0;
                }
 
+       } 
+       
+       if (r->soloed()) {
+               return 1;
        } else {
+               return 0;
+       }
+}
 
-               if (r->solo_isolated()) {
-                       return 2;
-               } else if (r->soloed()) {
+int
+RouteUI::solo_visual_state_with_isolate (boost::shared_ptr<Route> r)
+{
+       if (r->is_master() || r->is_control()) {
+               return 0;
+       }
+       
+       if (Config->get_solo_control_is_listen_control()) {
+
+               if (r->listening()) {
                        return 1;
                } else {
                        return 0;
                }
+
+       } 
+       
+       if (r->solo_isolated()) {
+               return 2;
+       } else if (r->soloed()) {
+               return 1;
+       } else {
+               return 0;
        }
+}
 
-       return 0;
+int
+RouteUI::solo_isolate_visual_state (boost::shared_ptr<Route> r)
+{
+       if (r->is_master() || r->is_control()) {
+               return 0;
+       }
+       
+       if (r->solo_isolated()) {
+                       return 1;
+       } else {
+               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())) {
@@ -713,7 +752,7 @@ RouteUI::update_solo_display ()
 
        }
 
-       solo_button->set_visual_state (solo_visual_state (_route));
+       solo_button->set_visual_state (solo_visual_state_with_isolate (_route));
 }
 
 void
@@ -731,6 +770,10 @@ RouteUI::mute_changed(void* /*src*/)
 int
 RouteUI::mute_visual_state (Session& s, boost::shared_ptr<Route> r)
 {
+       if (r->is_master() || r->is_control()) {
+               return 0;
+       }
+       
        if (Config->get_show_solo_mutes()) {
                
                if (r->muted ()) {
index c38a4aac6d36f654d7713611a802777af2fa1fce..21d335ef795bb47aa1c760911e95a74657d12611 100644 (file)
@@ -192,6 +192,8 @@ class RouteUI : public virtual AxisView
        void open_remote_control_id_dialog ();
 
        static int solo_visual_state (boost::shared_ptr<ARDOUR::Route>);
+       static int solo_visual_state_with_isolate (boost::shared_ptr<ARDOUR::Route>);
+       static int solo_isolate_visual_state (boost::shared_ptr<ARDOUR::Route>);
        static int mute_visual_state (ARDOUR::Session &, boost::shared_ptr<ARDOUR::Route>);
 
    protected:
index 44073a07a7d36eb01b6997dcceca987add2e1060..92a3c8c6b8683ebb76583e435bef69c6242175c0 100644 (file)
@@ -130,7 +130,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
         */
 
        void set_solo (bool yn, void *src);
-       bool soloed () const {return self_soloed () || soloed_by_others (); }
+       bool soloed () const { return self_soloed () || soloed_by_others (); }
 
        bool soloed_by_others () const { return !_solo_isolated && _soloed_by_others; }
        bool self_soloed () const { return _self_solo; }
index 3bc759125194d5bca8189c81c9d93c4347bf1725..0bf43fdcc514bfe153625921fb5b8164c8a48082 100644 (file)
@@ -631,8 +631,6 @@ Route::set_solo_isolated (bool yn, void *src)
 
        bool changed = false;
 
-       cerr << _name << " Solo isolated was " << _solo_isolated << endl;
-
        if (yn) {
                if (_solo_isolated == 0) {
                        changed = true;
@@ -645,8 +643,6 @@ Route::set_solo_isolated (bool yn, void *src)
                }
        }
 
-       cerr << "\tnow " << _solo_isolated << endl;
-
        if (changed) {
                set_delivery_solo ();
                solo_isolated_changed (src);
index 5fe2016587fc6ebd9a84e24b0456fb3de2d129e2..6694249b6101bb25f11adc7d1beca59a252ace79 100644 (file)
@@ -167,6 +167,19 @@ Port::get_state () const
        node->add_property ("mode", PortFactory::mode_to_string (_mode));
        node->add_property ("type", get_typestring());
 
+#if 0
+       byte device_inquiry[6];
+
+       device_inquiry[0] = 0xf0;
+       device_inquiry[0] = 0x7e;
+       device_inquiry[0] = 0x7f;
+       device_inquiry[0] = 0x06;
+       device_inquiry[0] = 0x02;
+       device_inquiry[0] = 0xf7;
+       
+       write (device_inquiry, sizeof (device_inquiry), 0);
+#endif
+
        return *node;
 }