Rework port matrix to use Gtk notebook tabs to select visible groups.

git-svn-id: svn://localhost/ardour2/branches/3.0@6117 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-11-18 13:35:31 +00:00
parent ef92349187
commit 73a0cd56f8
16 changed files with 407 additions and 602 deletions

View file

@ -45,7 +45,7 @@ using namespace ARDOUR;
* @param n Name.
*/
PortGroup::PortGroup (std::string const & n)
: name (n), _visible (true)
: name (n)
{
}
@ -242,7 +242,9 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
boost::shared_ptr<PortGroup> bus (new PortGroup (_("Bus")));
boost::shared_ptr<PortGroup> track (new PortGroup (_("Track")));
boost::shared_ptr<PortGroup> system (new PortGroup (_("System")));
boost::shared_ptr<PortGroup> system_mono (new PortGroup (_("System (mono)")));
boost::shared_ptr<PortGroup> system_stereo (new PortGroup (_("System (stereo)")));
boost::shared_ptr<PortGroup> system_other (new PortGroup (_("System (other)")));
boost::shared_ptr<PortGroup> ardour (new PortGroup (_("Ardour")));
boost::shared_ptr<PortGroup> other (new PortGroup (_("Other")));
@ -304,13 +306,25 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
if (boost::dynamic_pointer_cast<UserBundle> (*i) && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
system->add_bundle (*i, allow_dups);
if ((*i)->nchannels() == 1) {
system_mono->add_bundle (*i, allow_dups);
} else if ((*i)->nchannels() == 2) {
system_stereo->add_bundle (*i, allow_dups);
} else {
system_other->add_bundle (*i, allow_dups);
}
}
}
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
if (boost::dynamic_pointer_cast<UserBundle> (*i) == 0 && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
system->add_bundle (*i, allow_dups);
if ((*i)->nchannels() == 1) {
system_mono->add_bundle (*i, allow_dups);
} else if ((*i)->nchannels() == 2) {
system_stereo->add_bundle (*i, allow_dups);
} else {
system_other->add_bundle (*i, allow_dups);
}
}
}
@ -340,7 +354,13 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
std::string const p = ports[n];
if (!system->has_port(p) && !bus->has_port(p) && !track->has_port(p) && !ardour->has_port(p) && !other->has_port(p)) {
if (!system_mono->has_port(p) &&
!system_stereo->has_port(p) &&
!system_other->has_port(p) &&
!bus->has_port(p) &&
!track->has_port(p) &&
!ardour->has_port(p) &&
!other->has_port(p)) {
if (port_has_prefix (p, "system:") ||
port_has_prefix (p, "alsa_pcm") ||
@ -358,18 +378,27 @@ PortGroupList::gather (ARDOUR::Session& session, bool inputs, bool allow_dups)
}
if (!extra_system.empty()) {
system->add_bundle (make_bundle_from_ports (extra_system, inputs));
boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_system, inputs);
if (b->nchannels() == 1) {
system_mono->add_bundle (b);
} else if (b->nchannels() == 2) {
system_stereo->add_bundle (b);
} else {
system_other->add_bundle (b);
}
}
if (!extra_other.empty()) {
other->add_bundle (make_bundle_from_ports (extra_other, inputs));
}
add_group (system);
add_group (bus);
add_group (track);
add_group (ardour);
add_group (other);
add_group_if_not_empty (system_mono);
add_group_if_not_empty (system_stereo);
add_group_if_not_empty (system_other);
add_group_if_not_empty (bus);
add_group_if_not_empty (track);
add_group_if_not_empty (ardour);
add_group_if_not_empty (other);
emit_changed ();
}
@ -471,19 +500,24 @@ PortGroupList::bundles () const
}
uint32_t
PortGroupList::total_visible_channels () const
PortGroupList::total_channels () const
{
uint32_t n = 0;
for (PortGroupList::List::const_iterator i = begin(); i != end(); ++i) {
if ((*i)->visible()) {
n += (*i)->total_channels ();
}
n += (*i)->total_channels ();
}
return n;
}
void
PortGroupList::add_group_if_not_empty (boost::shared_ptr<PortGroup> g)
{
if (!g->bundles().empty ()) {
add_group (g);
}
}
void
PortGroupList::add_group (boost::shared_ptr<PortGroup> g)