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;
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) {
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);
if (!vca || !_route) {
return;
}
-
- vca->add (_route);
+ cerr << "Adding " << _route->name() << " to " << vca->number() << endl;
+ _route->gain_control()->add_master (vca);
}
void
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);
}
}
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);
}
}
+void
+Mixer_UI::select_strip (MixerStrip& ms, bool add)
+{
+ if (add) {
+ _selection.add (&ms);
+ } else {
+ _selection.set (&ms);
+ }
+}
+
void
Mixer_UI::select_none ()
{
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;
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) {
if (vms) {
vca_packer.pack_start (*vms, false, false);
vms->show ();
- cerr << "Packed vca " << vms->vca()->number() << " into vca_packer\n";
continue;
}
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 */);
void deselect_all_strip_processors();
void delete_processors();
-
+ void select_strip (MixerStrip&, bool add=false);
void select_none ();
bool window_not_visible () const;
#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;
}
};