Make menu option for speaker config the same as the window title.
[ardour.git] / gtk2_ardour / port_matrix.cc
index 052a26c25cf1c2f2cd3e33075f7021b0a05dc254..696c625da0eeb352224bc024a99435a59ec27be7 100644 (file)
@@ -409,6 +409,7 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
 
                        bool can_add_or_rename = false;
 
+                       /* Start off with options for the `natural' port type */
                        for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
                                if (should_show (*i)) {
                                        snprintf (buf, sizeof (buf), _("Add %s %s"), (*i).to_i18n_string(), channel_noun().c_str());
@@ -417,6 +418,15 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
                                }
                        }
 
+                       /* Now add other ones */
+                       for (DataType::iterator i = DataType::begin(); i != DataType::end(); ++i) {
+                               if (!should_show (*i)) {
+                                       snprintf (buf, sizeof (buf), _("Add %s %s"), (*i).to_i18n_string(), channel_noun().c_str());
+                                       sub.push_back (MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::add_channel_proxy), w, *i)));
+                                       can_add_or_rename = true;
+                               }
+                       }
+                       
                        if (can_rename_channels (bc[dim].bundle)) {
                                snprintf (
                                        buf, sizeof (buf), _("Rename '%s'..."),
@@ -445,11 +455,13 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
                                                MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::remove_all_channels), w))
                                                );
                                        
-                                       for (uint32_t i = 0; i < bc[dim].bundle->nchannels().n_total(); ++i) {
-                                               if (should_show (bc[dim].bundle->channel_type(i))) {
-                                                       add_remove_option (sub, w, i);
-                                               }
-                                       }
+                                       if (bc[dim].bundle->nchannels().n_total() > 1) {
+                                                for (uint32_t i = 0; i < bc[dim].bundle->nchannels().n_total(); ++i) {
+                                                        if (should_show (bc[dim].bundle->channel_type(i))) {
+                                                                add_remove_option (sub, w, i);
+                                                        }
+                                                }
+                                        }
                                }
                        }
 
@@ -929,3 +941,69 @@ PortMatrix::count_of_our_type (ChanCount c) const
 
        return c.get (_type);
 }
+
+PortMatrixNode::State
+PortMatrix::get_association (PortMatrixNode node) const
+{
+       if (show_only_bundles ()) {
+
+               bool have_off_diagonal_association = false;
+               bool have_diagonal_association = false;
+               bool have_diagonal_not_association = false;
+
+               for (uint32_t i = 0; i < node.row.bundle->nchannels().n_total(); ++i) {
+
+                       for (uint32_t j = 0; j < node.column.bundle->nchannels().n_total(); ++j) {
+
+                               if (!should_show (node.row.bundle->channel_type(i)) || !should_show (node.column.bundle->channel_type(j))) {
+                                       continue;
+                               }
+
+                               ARDOUR::BundleChannel c[2];
+                               c[row_index()] = ARDOUR::BundleChannel (node.row.bundle, i);
+                               c[column_index()] = ARDOUR::BundleChannel (node.column.bundle, j);
+
+                               PortMatrixNode::State const s = get_state (c);
+
+                               switch (s) {
+                               case PortMatrixNode::ASSOCIATED:
+                                       if (i == j) {
+                                               have_diagonal_association = true;
+                                       } else {
+                                               have_off_diagonal_association = true;
+                                       }
+                                       break;
+
+                               case PortMatrixNode::NOT_ASSOCIATED:
+                                       if (i == j) {
+                                               have_diagonal_not_association = true;
+                                       }
+                                       break;
+
+                               default:
+                                       break;
+                               }
+                       }
+               }
+
+               if (have_diagonal_association && !have_off_diagonal_association && !have_diagonal_not_association) {
+                       return PortMatrixNode::ASSOCIATED;
+               } else if (!have_diagonal_association && !have_off_diagonal_association) {
+                       return PortMatrixNode::NOT_ASSOCIATED;
+               }
+
+               return PortMatrixNode::PARTIAL;
+
+       } else {
+
+               ARDOUR::BundleChannel c[2];
+               c[column_index()] = node.column;
+               c[row_index()] = node.row;
+               return get_state (c);
+
+       }
+
+       /* NOTREACHED */
+       return PortMatrixNode::NOT_ASSOCIATED;
+}
+