summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-03-02 12:13:45 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:39 -0400
commit8ce39c891bece4845075cfb03c45c80e5177c17a (patch)
treeeab98c4dbcc65bc571c29cacf356fbe093d1e247 /gtk2_ardour
parent75b327964bafcccf15e83800132053524aebdf89 (diff)
change sort ordering model in mixer and editor
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
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor_routes.cc14
-rw-r--r--gtk2_ardour/mixer_strip.cc16
-rw-r--r--gtk2_ardour/mixer_ui.cc48
-rw-r--r--gtk2_ardour/mixer_ui.h5
-rw-r--r--gtk2_ardour/route_sorter.h18
5 files changed, 64 insertions, 37 deletions
diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc
index b4fc8681e6..0d2695a30e 100644
--- a/gtk2_ardour/editor_routes.cc
+++ b/gtk2_ardour/editor_routes.cc
@@ -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) {
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 3598f19e9b..c8faaa41f9 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -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);
}
}
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index a321085e23..ab80f2a151 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -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);
@@ -499,6 +497,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 ()
{
_selection.clear_routes();
@@ -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;
}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index d818ee214a..d48db2edaa 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -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;
diff --git a/gtk2_ardour/route_sorter.h b/gtk2_ardour/route_sorter.h
index c203afa188..1450a2c09b 100644
--- a/gtk2_ardour/route_sorter.h
+++ b/gtk2_ardour/route_sorter.h
@@ -24,25 +24,19 @@
#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;
}
};