From da762129f19c28aff64f833b6ec09fba946faef6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 14 Dec 2009 16:44:20 +0000 Subject: Offer all of a bundle's ports for disconnection / removal when opening a menu over a bundle's name in the port matrix. git-svn-id: svn://localhost/ardour2/branches/3.0@6365 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/port_matrix.cc | 64 ++++++++++++++++++++++++-------- gtk2_ardour/port_matrix.h | 8 ++++ gtk2_ardour/port_matrix_column_labels.cc | 12 +++++- gtk2_ardour/port_matrix_component.cc | 4 +- gtk2_ardour/port_matrix_row_labels.cc | 10 ++++- 5 files changed, 77 insertions(+), 21 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc index 1b07e80bf3..b9285de7c7 100644 --- a/gtk2_ardour/port_matrix.cc +++ b/gtk2_ardour/port_matrix.cc @@ -414,29 +414,31 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t) } if (can_remove_channels (bc[dim].bundle)) { - snprintf (buf, sizeof (buf), _("Remove '%s'"), bc[dim].bundle->channel_name (bc[dim].channel).c_str()); - sub.push_back ( - MenuElem ( - buf, - sigc::bind (sigc::mem_fun (*this, &PortMatrix::remove_channel_proxy), w, bc[dim].channel) - ) - ); + if (bc[dim].channel != -1) { + add_remove_option (sub, w, bc[dim].channel); + } else { + for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) { + add_remove_option (sub, w, i); + } + } } if (_show_only_bundles || bc[dim].bundle->nchannels() <= 1) { snprintf (buf, sizeof (buf), _("%s all"), disassociation_verb().c_str()); - } else { - snprintf ( - buf, sizeof (buf), _("%s all from '%s'"), - disassociation_verb().c_str(), - bc[dim].bundle->channel_name (bc[dim].channel).c_str() + sub.push_back ( + MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_channel), w, bc[dim].channel, dim)) ); + + } else { + if (bc[dim].channel != -1) { + add_disassociate_option (sub, w, dim, bc[dim].channel); + } else { + for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) { + add_disassociate_option (sub, w, dim, i); + } + } } - sub.push_back ( - MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_channel), w, bc[dim].channel, dim)) - ); - items.push_back (MenuElem (bc[dim].bundle->name().c_str(), *m)); need_separator = true; } @@ -761,3 +763,33 @@ PortMatrix::visible_ports (int d) const return *j; } + +void +PortMatrix::add_remove_option (Menu_Helpers::MenuList& m, boost::weak_ptr w, int c) +{ + using namespace Menu_Helpers; + + boost::shared_ptr b = w.lock (); + if (!b) { + return; + } + + char buf [64]; + snprintf (buf, sizeof (buf), _("Remove '%s'"), b->channel_name (c).c_str()); + m.push_back (MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::remove_channel_proxy), w, c))); +} + +void +PortMatrix::add_disassociate_option (Menu_Helpers::MenuList& m, boost::weak_ptr w, int d, int c) +{ + using namespace Menu_Helpers; + + boost::shared_ptr b = w.lock (); + if (!b) { + return; + } + + char buf [64]; + snprintf (buf, sizeof (buf), _("%s all from '%s'"), disassociation_verb().c_str(), b->channel_name (c).c_str()); + m.push_back (MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_channel), w, c, d))); +} diff --git a/gtk2_ardour/port_matrix.h b/gtk2_ardour/port_matrix.h index 477b0947dc..cfa4cdbadc 100644 --- a/gtk2_ardour/port_matrix.h +++ b/gtk2_ardour/port_matrix.h @@ -47,6 +47,12 @@ namespace ARDOUR { class Bundle; } +namespace Gtk { + namespace Menu_Helpers { + class MenuList; + } +} + class PortMatrixBody; class PortMatrix : public Gtk::Table @@ -177,6 +183,8 @@ private: void route_processors_changed (ARDOUR::RouteProcessorChange); void body_dimensions_changed (); void session_going_away (); + void add_remove_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr, int); + void add_disassociate_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr, int, int); Gtk::Window* _parent; diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc index c10bb01a2b..be26474e75 100644 --- a/gtk2_ardour/port_matrix_column_labels.cc +++ b/gtk2_ardour/port_matrix_column_labels.cc @@ -436,11 +436,19 @@ PortMatrixColumnLabels::position_to_channel (double p, double o, boost::shared_p void PortMatrixColumnLabels::button_press (double x, double y, int b, uint32_t t, guint) { - ARDOUR::BundleChannel const gc = position_to_channel (x, y, _matrix->visible_columns()); + ARDOUR::BundleChannel w = position_to_channel (x, y, _matrix->visible_columns()); + + if ( + (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && y > (_height - _longest_bundle_name * sin (angle ()))) || + (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT && y < (_longest_bundle_name * sin (angle ()))) + ) { + + w.channel = -1; + } if (b == 3) { _matrix->popup_menu ( - gc, + w, ARDOUR::BundleChannel (), t ); diff --git a/gtk2_ardour/port_matrix_component.cc b/gtk2_ardour/port_matrix_component.cc index 0bb8d496e7..d98c557c3a 100644 --- a/gtk2_ardour/port_matrix_component.cc +++ b/gtk2_ardour/port_matrix_component.cc @@ -187,7 +187,7 @@ PortMatrixComponent::position_to_channel (double p, double, boost::shared_ptrshow_only_bundles()) { if (p < 1) { - return ARDOUR::BundleChannel (j->bundle, 0); + return ARDOUR::BundleChannel (j->bundle, -1); } else { p -= 1; } @@ -205,5 +205,5 @@ PortMatrixComponent::position_to_channel (double p, double, boost::shared_ptr (), 0); + return ARDOUR::BundleChannel (boost::shared_ptr (), -1); } diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc index 9878dc23dd..80a0bb0c4f 100644 --- a/gtk2_ardour/port_matrix_row_labels.cc +++ b/gtk2_ardour/port_matrix_row_labels.cc @@ -127,7 +127,15 @@ PortMatrixRowLabels::render (cairo_t* cr) void PortMatrixRowLabels::button_press (double x, double y, int b, uint32_t t, guint) { - ARDOUR::BundleChannel const w = position_to_channel (y, x, _matrix->visible_rows()); + ARDOUR::BundleChannel w = position_to_channel (y, x, _matrix->visible_rows()); + + if ( + (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT && x > (_longest_port_name + name_pad() * 2)) || + (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM && x < (_longest_bundle_name + name_pad() * 2)) + + ) { + w.channel = -1; + } if (b == 3) { -- cgit v1.2.3