#include "ardour/session.h"
#include "ardour/route.h"
#include "ardour/audioengine.h"
+#include "gtkmm2ext/utils.h"
#include "port_matrix.h"
#include "port_matrix_body.h"
#include "port_matrix_component.h"
#include "ardour_dialog.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "gui_thread.h"
#include "utils.h"
using namespace std;
using namespace Gtk;
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
/** PortMatrix constructor.
* @param session Our session.
_session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::routes_changed, this), gui_context());
/* and also bundles */
- _session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
- _session->BundleRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
+ _session->BundleAddedOrRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
/* and also ports */
_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());
+ PresentationInfo::Change.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports_proxy, this), gui_context());
/* Part 3: other stuff */
{
Adjustment* a = _hscroll.get_adjustment ();
a->set_lower (0);
- a->set_upper (_body->full_scroll_width());
a->set_page_size (_body->alloc_scroll_width());
a->set_step_increment (32);
a->set_page_increment (128);
+ /* Set the adjustment to zero if the size has changed.*/
+ if (a->get_upper() != _body->full_scroll_width()) {
+ a->set_upper (_body->full_scroll_width());
+ a->set_value (0);
+ }
+
a = _vscroll.get_adjustment ();
a->set_lower (0);
- a->set_upper (_body->full_scroll_height());
a->set_page_size (_body->alloc_scroll_height());
a->set_step_increment (32);
a->set_page_increment (128);
+
+ if (a->get_upper() != _body->full_scroll_height()) {
+ a->set_upper (_body->full_scroll_height());
+ a->set_value (0);
+ }
}
/** Disassociate all of our ports from each other */
sub.push_back (MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::add_channel_proxy), w, *i)));
}
}
-
+
/* Now add other ones */
for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
if (!should_show (*i)) {
/* we're looking just at bundles, or our bundle has only one channel, so just offer
to disassociate all on the bundle.
*/
-
+
snprintf (buf, sizeof (buf), _("%s all"), disassociation_verb().c_str());
sub.push_back (
MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_bundle), w, dim))
);
-
+
} else if (c != 0) {
if (bc[dim].channel != -1) {
items.push_back (MenuElem (_("Flip"), sigc::mem_fun (*this, &PortMatrix::flip)));
items.back().set_sensitive (can_flip ());
-
+
_menu->popup (1, t);
}
void
PortMatrix::setup_global_ports ()
{
+ if (!_session || _session->deletion_in_progress()) return;
ENSURE_GUI_THREAD (*this, &PortMatrix::setup_global_ports)
for (int i = 0; i < 2; ++i) {
/* Avoid a deadlock by calling this in an idle handler: see IOSelector::io_changed_proxy
for a discussion.
*/
-
+
Glib::signal_idle().connect_once (sigc::mem_fun (*this, &PortMatrix::setup_global_ports));
}
bool
PortMatrix::can_add_channels (boost::shared_ptr<Bundle> b) const
{
- return io_from_bundle (b);
+ return io_from_bundle (b) != 0;
}
void
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 ();
}
bool
PortMatrix::can_remove_channels (boost::shared_ptr<Bundle> b) const
{
- return io_from_bundle (b);
+ return io_from_bundle (b) != 0;
}
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
the TOP_TO_RIGHT arrangement we reverse the order of the vertical
tabs in setup_notebooks ().
*/
-
+
int n = 0;
if (d == _row_index) {
if (_arrangement == LEFT_TO_BOTTOM) {
if (!_session) {
return;
}
-
+
for (int i = 0; i < 2; ++i) {
Gtk::Notebook* notebook = row_index() == i ? &_vnotebook : &_hnotebook;
-
+
PortGroupList const * gl = ports (i);
int p = 0;
for (PortGroupList::List::const_iterator j = gl->begin(); j != gl->end(); ++j) {
label->set_text ((*j)->name);
} else if (c.length() && c[0] != '<' && has_connection) {
/* this label is not marked up with <b> but should be */
- label->set_markup (string_compose ("<b>%1</b>", Glib::Markup::escape_text ((*j)->name)));
+ label->set_markup (string_compose ("<b>%1</b>", Gtkmm2ext::markup_escape_text ((*j)->name)));
}
++p;
}
- /* NOTREACHED */
+ abort(); /* NOTREACHED */
return PortMatrixNode::NOT_ASSOCIATED;
}
PortMatrix::check_flip () const
{
/* Look for the row's port group name in the columns */
-
+
int new_column = 0;
boost::shared_ptr<const PortGroup> r = visible_ports (_row_index);
PortGroupList::List::const_iterator i = _ports[_column_index].begin();
}
/* Look for the column's port group name in the rows */
-
+
int new_row = 0;
boost::shared_ptr<const PortGroup> c = visible_ports (_column_index);
i = _ports[_row_index].begin();