summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/port_matrix.cc64
-rw-r--r--gtk2_ardour/port_matrix.h8
-rw-r--r--gtk2_ardour/port_matrix_column_labels.cc12
-rw-r--r--gtk2_ardour/port_matrix_component.cc4
-rw-r--r--gtk2_ardour/port_matrix_row_labels.cc10
-rw-r--r--libs/ardour/ardour/bundle.h6
6 files changed, 80 insertions, 24 deletions
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<Bundle> w, int c)
+{
+ using namespace Menu_Helpers;
+
+ boost::shared_ptr<Bundle> 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<Bundle> w, int d, int c)
+{
+ using namespace Menu_Helpers;
+
+ boost::shared_ptr<Bundle> 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<ARDOUR::Bundle>, int);
+ void add_disassociate_option (Gtk::Menu_Helpers::MenuList &, boost::weak_ptr<ARDOUR::Bundle>, 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_ptr<co
if (_matrix->show_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<co
}
- return ARDOUR::BundleChannel (boost::shared_ptr<ARDOUR::Bundle> (), 0);
+ return ARDOUR::BundleChannel (boost::shared_ptr<ARDOUR::Bundle> (), -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) {
diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h
index 1af7a3bad0..196b1f2a09 100644
--- a/libs/ardour/ardour/bundle.h
+++ b/libs/ardour/ardour/bundle.h
@@ -144,9 +144,9 @@ class Bundle : public sigc::trackable
struct BundleChannel
{
- BundleChannel () : channel (0) {}
+ BundleChannel () : channel (-1) {}
- BundleChannel (boost::shared_ptr<Bundle> b, uint32_t c)
+ BundleChannel (boost::shared_ptr<Bundle> b, int c)
: bundle (b), channel (c) {}
bool operator== (BundleChannel const& other) const {
@@ -158,7 +158,7 @@ struct BundleChannel
}
boost::shared_ptr<Bundle> bundle;
- uint32_t channel;
+ int channel; ///< channel index, or -1 for "all"
};
}