change sort ordering model in mixer and editor
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 2 Mar 2016 17:13:45 +0000 (12:13 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 May 2016 19:30:39 +0000 (15:30 -0400)
This allows correct reordering of the mixer "track_model" even
when non-route elements are present.

This isn't really utilized in the Editor at present because we do
not show VCAs there at all, but it will become important in the
future when we represent VCA automation there

gtk2_ardour/editor_routes.cc
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_ui.cc
gtk2_ardour/mixer_ui.h
gtk2_ardour/route_sorter.h

index b4fc8681e6d904934228319db63a11c33d5184e6..0d2695a30e42ea45cdf93ae3389b5329a47c868b 100644 (file)
@@ -1058,21 +1058,21 @@ EditorRoutes::sync_treeview_from_order_keys ()
                return;
        }
 
-       OrderKeySortedRoutes sorted_routes;
+       OrderingKeys sorted;
 
        for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
                boost::shared_ptr<Route> route = (*ri)[_columns.route];
-               sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
+               sorted.push_back (OrderKeys (old_order, route->order_key ()));
        }
 
        SortByNewDisplayOrder cmp;
 
-       sort (sorted_routes.begin(), sorted_routes.end(), cmp);
-       neworder.assign (sorted_routes.size(), 0);
+       sort (sorted.begin(), sorted.end(), cmp);
+       neworder.assign (sorted.size(), 0);
 
        uint32_t n = 0;
 
-       for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+       for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
 
                neworder[n] = sr->old_display_order;
 
@@ -1080,8 +1080,8 @@ EditorRoutes::sync_treeview_from_order_keys ()
                        changed = true;
                }
 
-               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n",
-                                                              sr->route->name(), sr->old_display_order, n));
+               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order from %1 to %2\n",
+                                                              sr->old_display_order, n));
        }
 
        if (changed) {
index 3598f19e9b5d4398c4bf18c5b33ad9fe4f250a8f..c8faaa41f9545643d348a7f30e0ca33baf94af4e 100644 (file)
@@ -2494,6 +2494,14 @@ MixerStrip::vca_menu_toggle (CheckMenuItem* menuitem, uint32_t n)
                return;
        }
 
+       if (!_selected) {
+               /* if this strip is not selected, add it before carrying out
+                  changes to assignment. the user probably didn't notice
+                  that they were clicking on an unselected track.
+               */
+               _mixer.select_strip (*this);
+       }
+
        if (!menuitem->get_active()) {
                cerr << "Unassign from " << n << endl;
                _mixer.do_vca_unassign (vca);
@@ -2509,8 +2517,8 @@ MixerStrip::vca_assign (boost::shared_ptr<VCA> vca)
        if (!vca || !_route) {
                return;
        }
-
-       vca->add (_route);
+       cerr << "Adding " << _route->name() << " to " << vca->number() << endl;
+       _route->gain_control()->add_master (vca);
 }
 
 void
@@ -2522,9 +2530,11 @@ MixerStrip::vca_unassign (boost::shared_ptr<VCA> vca)
 
        if (!vca) {
                /* null VCA means drop all VCA assignments */
+               cerr << "clear vcas for " << _route->name() << endl;
                _route->gain_control()->clear_masters ();
        } else {
-               vca->remove (_route);
+               cerr << "Removing " << _route->name() << " from " << vca->number() << endl;
+               _route->gain_control()->remove_master (vca);
        }
 }
 
index a321085e23cd5218a67b35ca61ca7271b701e164..ab80f2a151674f8fa5c985da29ed38c51d628e5d 100644 (file)
@@ -368,8 +368,6 @@ Mixer_UI::show_window ()
 void
 Mixer_UI::add_masters (VCAList& vcas)
 {
-       cerr << vcas.size() << " VCAs added\n";
-
        for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
 
                VCAMasterStrip* vms = new VCAMasterStrip (_session, *v);
@@ -498,6 +496,16 @@ Mixer_UI::deselect_all_strip_processors ()
        }
 }
 
+void
+Mixer_UI::select_strip (MixerStrip& ms, bool add)
+{
+       if (add) {
+               _selection.add (&ms);
+       } else {
+               _selection.set (&ms);
+       }
+}
+
 void
 Mixer_UI::select_none ()
 {
@@ -688,24 +696,43 @@ Mixer_UI::sync_treeview_from_order_keys ()
                return;
        }
 
-       OrderKeySortedRoutes sorted_routes;
+       OrderingKeys sorted;
+       uint32_t vca_cnt = 0;
+       uint32_t max_route_order_key = 0;
+
+       /* count number of Routes in track_model (there may be some odd reason
+          why this is not the same as the number in the session, but here we
+          care about the track model.
+       */
+
+       for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri) {
+               boost::shared_ptr<Route> route = (*ri)[track_columns.route];
+               if (route) {
+                       max_route_order_key = max (route->order_key(), max_route_order_key);
+               }
+       }
 
        for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) {
                boost::shared_ptr<Route> route = (*ri)[track_columns.route];
                if (!route) {
-                       continue;
+                       /* VCAs need to sort after all routes. We don't display
+                        * them in the same place (March 2016), but we don't
+                        * want them intermixed in the track_model
+                        */
+                       sorted.push_back (OrderKeys (old_order, max_route_order_key + ++vca_cnt));
+               } else {
+                       sorted.push_back (OrderKeys (old_order, route->order_key ()));
                }
-               sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key ()));
        }
 
        SortByNewDisplayOrder cmp;
 
-       sort (sorted_routes.begin(), sorted_routes.end(), cmp);
-       neworder.assign (sorted_routes.size(), 0);
+       sort (sorted.begin(), sorted.end(), cmp);
+       neworder.assign (sorted.size(), 0);
 
        uint32_t n = 0;
 
-       for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
+       for (OrderingKeys::iterator sr = sorted.begin(); sr != sorted.end(); ++sr, ++n) {
 
                neworder[n] = sr->old_display_order;
 
@@ -713,8 +740,8 @@ Mixer_UI::sync_treeview_from_order_keys ()
                        changed = true;
                }
 
-               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("MIXER change order for %1 from %2 to %3\n",
-                                                              sr->route->name(), sr->old_display_order, n));
+               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("MIXER change order from %1 to %2\n",
+                                                              sr->old_display_order, n));
        }
 
        if (changed) {
@@ -1192,7 +1219,6 @@ Mixer_UI::redisplay_track_list ()
                if (vms) {
                        vca_packer.pack_start (*vms, false, false);
                        vms->show ();
-                       cerr << "Packed vca " << vms->vca()->number() << " into vca_packer\n";
                        continue;
                }
 
index d818ee214a4b0a938ff124e01c36a980b7509a9a..d48db2edaa9e05643beb5bc981236857cc177c9b 100644 (file)
@@ -92,9 +92,6 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p
        void  set_strip_width (Width, bool save = false);
        Width get_strip_width () const { return _strip_width; }
 
-       void unselect_strip_in_display (MixerStrip*);
-       void select_strip_in_display (MixerStrip*);
-
        XMLNode& get_state ();
        int set_state (const XMLNode&, int /* version */);
 
@@ -111,7 +108,7 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p
 
        void deselect_all_strip_processors();
        void delete_processors();
-
+       void select_strip (MixerStrip&, bool add=false);
        void select_none ();
 
        bool window_not_visible () const;
index c203afa188b301217154549ea8b0dc746b4a3304..1450a2c09b4be7be551682eef19a554a540aa86f 100644 (file)
 #include <stdint.h>
 #include <vector>
 
-namespace ARDOUR {
-       class Route;
-}
-
-struct RoutePlusOrderKey {
-    boost::shared_ptr<ARDOUR::Route> route; /* we don't really need this, but its handy to keep around */
+struct OrderKeys {
     uint32_t old_display_order;
     uint32_t new_display_order;
 
-    RoutePlusOrderKey (boost::shared_ptr<ARDOUR::Route> r, uint32_t ok, uint32_t nk)
-           : route (r)
-           , old_display_order (ok)
-           , new_display_order (nk) {}
+       OrderKeys (uint32_t ok, uint32_t nk)
+               : old_display_order (ok)
+               , new_display_order (nk) {}
 };
 
-typedef std::vector<RoutePlusOrderKey> OrderKeySortedRoutes;
+typedef std::vector<OrderKeys> OrderingKeys;
 
 struct SortByNewDisplayOrder {
-    bool operator() (const RoutePlusOrderKey& a, const RoutePlusOrderKey& b) {
+    bool operator() (const OrderKeys& a, const OrderKeys& b) {
            return a.new_display_order < b.new_display_order;
     }
 };