menu item says Fader and Pan, so the automation track should say the same for consistency
[ardour.git] / gtk2_ardour / io_selector.cc
index 3a744ea7271b07a3d9cd16079c21264b51d63483..0f877206f7025eb62725ba3c8cb747b9aec9cb83 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <map>
@@ -184,40 +183,7 @@ IOSelector::IOSelector (Session& sess, boost::shared_ptr<IO> ior, bool input)
        port_button_box.set_border_width (5);
 
        port_button_box.pack_start (add_port_button, false, false);
-
-       if (for_input) {
-               if (io->input_maximum() < 0 || io->input_maximum() > (int) io->n_inputs()) {
-                       add_port_button.set_sensitive (true);
-               } else {
-                       add_port_button.set_sensitive (false);
-               }
-
-       } else {
-               if (io->output_maximum() < 0 || io->output_maximum() > (int) io->n_outputs()) {
-                       add_port_button.set_sensitive (true);
-               } else {
-                       add_port_button.set_sensitive (false);
-               }
-                       
-       }
-
        port_button_box.pack_start (remove_port_button, false, false);
-
-       if (for_input) {
-               if (io->input_minimum() < 0 || io->input_minimum() < (int) io->n_inputs()) {
-                       remove_port_button.set_sensitive (true);
-               } else {
-                       remove_port_button.set_sensitive (false);
-               }
-                       
-       } else {
-               if (io->output_minimum() < 0 || io->output_minimum() < (int) io->n_outputs()) {
-                       remove_port_button.set_sensitive (true);
-               } else {
-                       remove_port_button.set_sensitive (false);
-               }
-       }
-
        port_button_box.pack_start (clear_connections_button, false, false);
 
        port_and_button_box.set_border_width (5);
@@ -248,6 +214,8 @@ IOSelector::IOSelector (Session& sess, boost::shared_ptr<IO> ior, bool input)
                io->output_changed.connect (mem_fun(*this, &IOSelector::ports_changed));
        }
 
+       set_button_sensitivity ();
+
        io->name_changed.connect (mem_fun(*this, &IOSelector::name_changed));
 }
 
@@ -255,6 +223,44 @@ IOSelector::~IOSelector ()
 {
 }
 
+void 
+IOSelector::set_button_sensitivity ()
+{
+       if (for_input) {
+
+               if (io->input_maximum() < 0 || io->input_maximum() > (int) io->n_inputs()) {
+                       add_port_button.set_sensitive (true);
+               } else {
+                       add_port_button.set_sensitive (false);
+               }
+
+       } else {
+
+               if (io->output_maximum() < 0 || io->output_maximum() > (int) io->n_outputs()) {
+                       add_port_button.set_sensitive (true);
+               } else {
+                       add_port_button.set_sensitive (false);
+               }
+                       
+       }
+
+       if (for_input) {
+               if (io->n_inputs() && (io->input_minimum() < 0 || io->input_minimum() < (int) io->n_inputs())) {
+                       remove_port_button.set_sensitive (true);
+               } else {
+                       remove_port_button.set_sensitive (false);
+               }
+                       
+       } else {
+               if (io->n_outputs() && (io->output_minimum() < 0 || io->output_minimum() < (int) io->n_outputs())) {
+                       remove_port_button.set_sensitive (true);
+               } else {
+                       remove_port_button.set_sensitive (false);
+               }
+       }
+}
+
+
 void
 IOSelector::name_changed (void* src)
 {
@@ -289,8 +295,6 @@ IOSelector::rescan ()
 
        current_page = notebook.get_current_page ();
 
-       cerr << "clear notebook\n";
-
        pages.clear ();
 
        /* get relevant current JACK ports */
@@ -298,7 +302,6 @@ IOSelector::rescan ()
        ports = session.engine().get_ports ("", JACK_DEFAULT_AUDIO_TYPE, for_input ? JackPortIsOutput : JackPortIsInput);
 
        if (ports == 0) {
-               cerr << "no ports\n";
                return;
        }
 
@@ -364,8 +367,6 @@ IOSelector::rescan ()
                pages.push_back (TabElem (*client_box, *tab_label));
        }
 
-       cerr << "notebook should have " << portmap.size() << " pages\n";
-
        notebook.set_current_page (current_page);
        page_selection_connection = notebook.signal_show().connect (bind (mem_fun (notebook, &Notebook::set_current_page), current_page));
        selector_box.show_all ();
@@ -417,7 +418,7 @@ IOSelector::display_ports ()
                        
                        really_short_name = port->short_name();
                        really_short_name = really_short_name.substr (really_short_name.find ('/') + 1);
-                       
+
                        tview = manage (new TreeView());
                        RefPtr<ListStore> port_model = ListStore::create (port_display_columns);
                        
@@ -428,16 +429,15 @@ IOSelector::display_ports ()
                        tview->set_model (port_model);
                        tview->append_column (really_short_name, port_display_columns.displayed_name);
                        tview->get_selection()->set_mode (SELECTION_SINGLE);
-                       tview->set_data ("port", port);
+                       tview->set_data (X_("port"), port);
                        tview->set_headers_visible (true);
-                       tview->set_name ("IOSelectorPortList");
+                       tview->set_name (X_("IOSelectorPortList"));
                        
                        port_box.pack_start (*tview);
                        port_displays.insert (port_displays.end(), tview);
                        
                        /* now fill the clist with the current connections */
                        
-                       
                        const char **connections = port->get_connections ();
                        
                        if (connections) {
@@ -446,7 +446,7 @@ IOSelector::display_ports ()
                                        row[port_display_columns.displayed_name] = connections[c];
                                        row[port_display_columns.full_name] = connections[c];
                                }
-                       }
+                       } 
                        
                        if (for_input) {
                                
@@ -547,18 +547,10 @@ IOSelector::add_port ()
                }
 
                catch (AudioEngine::PortRegistrationFailure& err) {
-                       MessageDialog msg (0,  _("There are no more JACK ports available."));
+                       MessageDialog msg (_("There are no more JACK ports available."));
                        msg.run ();
                }
 
-               if (io->input_maximum() >= 0 && io->input_maximum() <= (int) io->n_inputs()) {
-                       add_port_button.set_sensitive (false);
-               }
-               
-               if (io->input_minimum() < (int) io->n_inputs()) {
-                       remove_port_button.set_sensitive (true);
-               }
-
        } else {
 
                try {
@@ -566,14 +558,12 @@ IOSelector::add_port ()
                }
 
                catch (AudioEngine::PortRegistrationFailure& err) {
-                       MessageDialog msg (0, _("There are no more JACK ports available."));
+                       MessageDialog msg (_("There are no more JACK ports available."));
                        msg.run ();
                }
-
-               if (io->output_maximum() >= 0 && io->output_maximum() <= (int) io->n_outputs()) {
-                       add_port_button.set_sensitive (false);
-               }
        }
+               
+       set_button_sensitivity ();
 }
 
 void
@@ -587,26 +577,14 @@ IOSelector::remove_port ()
                if ((nports = io->n_inputs()) > 0) {
                        io->remove_input_port (io->input(nports-1), this);
                }
-               if (io->input_minimum() == (int) io->n_inputs()) {
-                       remove_port_button.set_sensitive (false);
-               }
+
        } else {
                if ((nports = io->n_outputs()) > 0) {
                        io->remove_output_port (io->output(nports-1), this);
                }
        }
-}
-
-gint
-IOSelector::remove_port_when_idle (Port *port)
-{
-       if (for_input) {
-               io->remove_input_port (port, this);
-       } else {
-               io->remove_output_port (port, this);
-       }
-
-       return FALSE;
+       
+       set_button_sensitivity ();
 }
 
 gint
@@ -636,7 +614,7 @@ IOSelector::connection_button_release (GdkEventButton *ev, TreeView *treeview)
 
                /* path is valid */
                ustring connected_port_name = (*iter)[port_display_columns.full_name];
-               Port *port = reinterpret_cast<Port *> (treeview->get_data (_("port")));
+               Port *port = reinterpret_cast<Port *> (treeview->get_data (X_("port")));
                
                if (for_input) {
                        Port *p = session.engine().get_port_by_name (connected_port_name);
@@ -685,7 +663,7 @@ IOSelector::select_treeview (TreeView* tview)
        */
 
        Glib::Mutex::Lock lm  (port_display_lock);
-       Port* port = reinterpret_cast<Port *> (tview->get_data (_("port")));
+       Port* port = reinterpret_cast<Port *> (tview->get_data (X_("port")));
 
        selected_port = port;
 
@@ -802,14 +780,15 @@ PortInsertWindow::PortInsertWindow (Session& sess, boost::shared_ptr<PortInsert>
        rescan_button.signal_clicked().connect (mem_fun(*this, &PortInsertWindow::rescan));
 
        signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), reinterpret_cast<Window *> (this))); 
-       pi->GoingAway.connect (mem_fun(*this, &PortInsertWindow::plugin_going_away));
+
+       going_away_connection = pi->GoingAway.connect (mem_fun(*this, &PortInsertWindow::plugin_going_away));
 }
 
 void
 PortInsertWindow::plugin_going_away ()
 {
        ENSURE_GUI_THREAD(mem_fun(*this, &PortInsertWindow::plugin_going_away));
-       
+       going_away_connection.disconnect ();
        delete_when_idle (this);
 }