first vaguely working version using PresentationInfo
[ardour.git] / gtk2_ardour / port_matrix.cc
index 34e0f68c7ed857e5bbcce15fb4a7b87bddc301de..84349d8236e29c5267c444d8d37d363245bbed5a 100644 (file)
@@ -159,7 +159,7 @@ PortMatrix::init ()
        _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
 
        /* watch for route order keys changing, which changes the order of things in our global ports list(s) */
-       Route::SyncOrderKeys.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
+       Stripable::PresentationInfoChange.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
 
        /* Part 3: other stuff */
 
@@ -729,9 +729,7 @@ PortMatrix::add_channel (boost::shared_ptr<Bundle> b, DataType t)
        if (io) {
                int const r = io->add_port ("", this, t);
                if (r == -1) {
-                       Gtk::MessageDialog msg (_("It is not possible to add a port here, as the first processor in the track or buss cannot "
-                                                 "support the new configuration."
-                                                       ));
+                       Gtk::MessageDialog msg (_("It is not possible to add a port here."));
                        msg.set_title (_("Cannot add port"));
                        msg.run ();
                }
@@ -747,23 +745,31 @@ PortMatrix::can_remove_channels (boost::shared_ptr<Bundle> b) const
 void
 PortMatrix::remove_channel (ARDOUR::BundleChannel b)
 {
+       std::string errmsg;
        boost::shared_ptr<IO> io = io_from_bundle (b.bundle);
+       boost::shared_ptr<Port> p = io->nth (b.channel);
 
-       if (io) {
-               boost::shared_ptr<Port> p = io->nth (b.channel);
-               if (p) {
-                       int const r = io->remove_port (p, this);
-                       if (r == -1) {
-                               ArdourDialog d (_("Port removal not allowed"));
-                               Label l (_("This port cannot be removed.\nEither the first plugin in the track or buss cannot accept\nthe new number of inputs or the last plugin has more outputs."));
-                               d.get_vbox()->pack_start (l);
-                               d.add_button (Stock::OK, RESPONSE_ACCEPT);
-                               d.set_modal (true);
-                               d.show_all ();
-                               d.run ();
-                       }
+       if (!io || !p) {
+               return;
+       }
+
+       if (io->n_ports ().n_total () == 1) {
+               errmsg = _("The last port cannot be removed");
+       } else {
+               if (-1 == io->remove_port (p, this)) {
+                       errmsg = _("This port cannot be removed.");
                }
        }
+
+       if (!errmsg.empty ()) {
+               ArdourDialog d (_("Port removal not allowed"));
+               Label l (errmsg);
+               d.get_vbox()->pack_start (l);
+               d.add_button (Stock::OK, RESPONSE_ACCEPT);
+               d.set_modal (true);
+               d.show_all ();
+               d.run ();
+       }
 }
 
 void