X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fstripable.cc;h=24167438c377b88ae2d04b26884ed8ed00c2ba74;hb=5fa05b403ca21a6573d07b921dc14f0769dc9fc7;hp=721d92789f179e5ad9ab36e5a90c846ffbb44df9;hpb=591d75f1d24f3b8acc76995434c9a377e0245337;p=ardour.git diff --git a/libs/ardour/stripable.cc b/libs/ardour/stripable.cc index 721d92789f..24167438c3 100644 --- a/libs/ardour/stripable.cc +++ b/libs/ardour/stripable.cc @@ -44,7 +44,9 @@ Stripable::Stripable (Session& s, string const & name, PresentationInfo const & Stripable::~Stripable () { - _session.selection().remove_stripable_by_id (id()); + if (!_session.deletion_in_progress ()) { + _session.selection().remove_stripable_by_id (id()); + } } void @@ -123,3 +125,62 @@ Stripable::is_selected() const } return _session.selection().selected (shared_from_this()); } + +bool +Stripable::Sorter::operator() (boost::shared_ptr a, boost::shared_ptr b) +{ + if (a->presentation_info().flags () == b->presentation_info().flags ()) { + return a->presentation_info().order() < b->presentation_info().order(); + } + + int cmp_a = 0; + int cmp_b = 0; + + if (a->is_auditioner ()) { cmp_a = -2; } + if (b->is_auditioner ()) { cmp_b = -2; } + if (a->is_monitor ()) { cmp_a = -1; } + if (b->is_monitor ()) { cmp_b = -1; } + + /* ARDOUR-Editor: [Track|Bus|Master] (0) < VCA (3) + * ARDOUR-Mixer : [Track|Bus] (0) < VCA (3) < Master (4) + * + * Mixbus-Editor: [Track|Bus] (0) < Mixbus (1) < VCA (3) < Master (4) + * Mixbus-Mixer : [Track|Bus] (0) < Mixbus (1) < Master (2) < VCA (3) + */ + + if (a->presentation_info().flags () & ARDOUR::PresentationInfo::VCA) { + cmp_a = 3; + } +#ifdef MIXBUS + else if (a->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut) { + cmp_a = _mixer_order ? 2 : 4; + } + else if ((a->presentation_info().flags () & ARDOUR::PresentationInfo::Mixbus) || a->mixbus()) { + cmp_a = 1; + } +#endif + else if (_mixer_order && (a->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut)) { + cmp_a = 4; + } + + + if (b->presentation_info().flags () & ARDOUR::PresentationInfo::VCA) { + cmp_b = 3; + } +#ifdef MIXBUS + else if (b->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut) { + cmp_b = _mixer_order ? 2 : 4; + } + else if ((b->presentation_info().flags () & ARDOUR::PresentationInfo::Mixbus) || b->mixbus()) { + cmp_b = 1; + } +#endif + else if (_mixer_order && (b->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut)) { + cmp_b = 4; + } + + if (cmp_a == cmp_b) { + return a->presentation_info().order() < b->presentation_info().order(); + } + return cmp_a < cmp_b; +}