Add remove all and disconnect all to port matrix menu. Hide bundles whose channels are already represented by other, larger bundles.

git-svn-id: svn://localhost/ardour2/branches/3.0@6381 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-12-22 01:10:25 +00:00
parent 06f094d4b6
commit 8e59a26ccf
4 changed files with 94 additions and 0 deletions

View File

@ -207,6 +207,55 @@ PortGroup::io_from_bundle (boost::shared_ptr<ARDOUR::Bundle> b) const
return (*i)->io;
}
/** Remove bundles whose channels are already represented by other, larger bundles */
void
PortGroup::remove_duplicates ()
{
BundleList::iterator i = _bundles.begin();
while (i != _bundles.end()) {
BundleList::iterator tmp = i;
++tmp;
bool remove = false;
for (BundleList::iterator j = _bundles.begin(); j != _bundles.end(); ++j) {
if (j->bundle->nchannels() > i->bundle->nchannels()) {
/* this bundle is larger */
uint32_t k = 0;
while (k < i->bundle->nchannels()) {
/* see if this channel on *i has an equivalent on *j */
uint32_t l = 0;
while (l < j->bundle->nchannels() && i->bundle->channel_ports (k) != j->bundle->channel_ports (l)) {
++l;
}
if (l == j->bundle->nchannels()) {
/* it does not */
break;
}
++k;
}
if (k == i->bundle->nchannels ()) {
/* all channels on *i are represented by the larger bundle *j, so remove *i */
remove = true;
break;
}
}
}
if (remove) {
_bundles.erase (i);
}
i = tmp;
}
}
/** PortGroupList constructor.
*/
@ -398,6 +447,10 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
other->add_bundle (make_bundle_from_ports (extra_other, inputs));
}
if (!allow_dups) {
system->remove_duplicates ();
}
add_group_if_not_empty (system);
add_group_if_not_empty (bus);
add_group_if_not_empty (track);

View File

@ -60,6 +60,7 @@ public:
void clear ();
uint32_t total_channels () const;
boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
void remove_duplicates ();
std::string name; ///< name for the group

View File

@ -411,6 +411,12 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
if (bc[dim].channel != -1) {
add_remove_option (sub, w, bc[dim].channel);
} else {
snprintf (buf, sizeof (buf), _("Remove all"));
sub.push_back (
MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::remove_all_channels), w))
);
for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) {
add_remove_option (sub, w, i);
}
@ -424,9 +430,15 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
);
} else {
if (bc[dim].channel != -1) {
add_disassociate_option (sub, w, dim, bc[dim].channel);
} else {
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))
);
for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) {
add_disassociate_option (sub, w, dim, i);
}
@ -476,6 +488,19 @@ PortMatrix::rename_channel_proxy (boost::weak_ptr<Bundle> b, uint32_t c)
rename_channel (BundleChannel (sb, c));
}
void
PortMatrix::disassociate_all_on_bundle (boost::weak_ptr<Bundle> bundle, int dim)
{
boost::shared_ptr<Bundle> sb = bundle.lock ();
if (!sb) {
return;
}
for (uint32_t i = 0; i < sb->nchannels(); ++i) {
disassociate_all_on_channel (bundle, i, dim);
}
}
void
PortMatrix::disassociate_all_on_channel (boost::weak_ptr<Bundle> bundle, uint32_t channel, int dim)
{
@ -620,6 +645,19 @@ PortMatrix::remove_channel (ARDOUR::BundleChannel b)
}
}
void
PortMatrix::remove_all_channels (boost::weak_ptr<Bundle> w)
{
boost::shared_ptr<Bundle> b = w.lock ();
if (!b) {
return;
}
for (uint32_t i = 0; i < b->nchannels(); ++i) {
remove_channel (ARDOUR::BundleChannel (b, i));
}
}
void
PortMatrix::add_channel_proxy (boost::weak_ptr<Bundle> w)
{

View File

@ -140,6 +140,7 @@ public:
virtual void add_channel (boost::shared_ptr<ARDOUR::Bundle>);
virtual bool can_remove_channels (boost::shared_ptr<ARDOUR::Bundle>) const;
virtual void remove_channel (ARDOUR::BundleChannel);
virtual void remove_all_channels (boost::weak_ptr<ARDOUR::Bundle>);
virtual bool can_rename_channels (boost::shared_ptr<ARDOUR::Bundle>) const {
return false;
}
@ -175,6 +176,7 @@ private:
void remove_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
void rename_channel_proxy (boost::weak_ptr<ARDOUR::Bundle>, uint32_t);
void disassociate_all_on_channel (boost::weak_ptr<ARDOUR::Bundle>, uint32_t, int);
void disassociate_all_on_bundle (boost::weak_ptr<ARDOUR::Bundle>, int);
void setup_global_ports ();
void toggle_show_only_bundles ();
bool on_scroll_event (GdkEventScroll *);