Display VCAs at the end of the Track/Bus list
authorRobin Gareus <robin@gareus.org>
Thu, 22 Dec 2016 00:38:55 +0000 (01:38 +0100)
committerRobin Gareus <robin@gareus.org>
Thu, 22 Dec 2016 00:38:55 +0000 (01:38 +0100)
gtk2_ardour/editor_routes.cc
gtk2_ardour/mixer_ui.cc
gtk2_ardour/route_sorter.h

index fd5e68f3ef6e365c8133de3c96ebd31e80c97d7e..d0ff0dfbfed3e0ab8d45b1056b5ab0f5a63398eb 100644 (file)
@@ -1094,11 +1094,12 @@ EditorRoutes::sync_treeview_from_presentation_info ()
        }
 
        OrderingKeys sorted;
+       const size_t cmp_max = rows.size ();
 
        for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
                boost::shared_ptr<Stripable> stripable = (*ri)[_columns.stripable];
                /* use global order */
-               sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
+               sorted.push_back (OrderKeys (old_order, stripable, cmp_max));
        }
 
        SortByNewDisplayOrder cmp;
index 857af7fc142c93a7106a6af1d86d355100a7f087..02daf63f1d80b4e51e976f42d1f544bb624dd55d 100644 (file)
@@ -784,10 +784,11 @@ Mixer_UI::sync_treeview_from_presentation_info ()
        }
 
        OrderingKeys sorted;
+       const size_t cmp_max = rows.size ();
 
        for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
                boost::shared_ptr<Stripable> stripable = (*ri)[stripable_columns.stripable];
-               sorted.push_back (OrderKeys (old_order, stripable->presentation_info().order()));
+               sorted.push_back (OrderKeys (old_order, stripable, cmp_max));
        }
 
        SortByNewDisplayOrder cmp;
index e84788243cfd474ce0c0317aaa960d3a036d146f..bba7424dc1689560f616a2b34179499ad83d22aa 100644 (file)
 struct OrderKeys {
     uint32_t old_display_order;
     uint32_t new_display_order;
+    uint32_t compare_order;
 
-       OrderKeys (uint32_t ok, uint32_t nk)
+       OrderKeys (uint32_t ok, boost::shared_ptr<ARDOUR::Stripable> s, uint32_t cmp_max)
                : old_display_order (ok)
-               , new_display_order (nk) {}
+       {
+               new_display_order = s->presentation_info().order();
+               compare_order = new_display_order;
+
+               if (s->presentation_info().flags () & ARDOUR::PresentationInfo::VCA) {
+                       compare_order += 2 * cmp_max;
+               }
+#ifdef MIXBUS
+               if (s->presentation_info().flags () & ARDOUR::PresentationInfo::Mixbus || s->mixbus()) {
+                       compare_order += cmp_max;
+               }
+               if (s->presentation_info().flags () & ARDOUR::PresentationInfo::MasterOut) {
+                       compare_order += 3 * cmp_max;
+               }
+#endif
+       }
 };
 
 typedef std::vector<OrderKeys> OrderingKeys;
 
 struct SortByNewDisplayOrder {
     bool operator() (const OrderKeys& a, const OrderKeys& b) {
-           return a.new_display_order < b.new_display_order;
+           return a.compare_order < b.compare_order;
     }
 };