summaryrefslogtreecommitdiff
path: root/gtk2_ardour/mixer_ui.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-23 00:05:50 +0000
committerDavid Robillard <d@drobilla.net>2009-10-23 00:05:50 +0000
commitbcf885b4be6c20c65b076640df9e3c9a3e52d5b7 (patch)
treea41d97413303dcbae36aa5837f246b141383e66d /gtk2_ardour/mixer_ui.cc
parent862bbd456959deb9d67556b5fe6197a1beb327bf (diff)
Fix crash when adding automation tracks caused by route ordering.
I have no idea what caused this, or whether this is a kludge or not, but it's certainly less crap than not being able to display automation whatsoever. git-svn-id: svn://localhost/ardour2/branches/3.0@5877 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/mixer_ui.cc')
-rw-r--r--gtk2_ardour/mixer_ui.cc21
1 files changed, 13 insertions, 8 deletions
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 0c88b7b2db..9e8277a3e0 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -18,6 +18,7 @@
*/
#include <algorithm>
+#include <map>
#include <sigc++/bind.h>
#include <gtkmm/accelmap.h>
@@ -374,7 +375,6 @@ Mixer_UI::remove_strip (MixerStrip* strip)
void
Mixer_UI::sync_order_keys (string const & src)
{
- vector<int> neworder;
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator ri;
@@ -382,25 +382,30 @@ Mixer_UI::sync_order_keys (string const & src)
return;
}
- for (ri = rows.begin(); ri != rows.end(); ++ri) {
- neworder.push_back (0);
- }
+ std::map<int,int> keys;
bool changed = false;
- unsigned int order;
- for (order = 0, ri = rows.begin(); ri != rows.end(); ++ri, ++order) {
+ unsigned order = 0;
+ for (ri = rows.begin(); ri != rows.end(); ++ri, ++order) {
boost::shared_ptr<Route> route = (*ri)[track_columns.route];
unsigned int old_key = order;
unsigned int new_key = route->order_key (N_("signal"));
- assert (new_key < neworder.size());
- neworder[new_key] = old_key;
+ keys[new_key] = old_key;
if (new_key != old_key) {
changed = true;
}
}
+ assert(keys.size() == rows.size());
+
+ // Remove any gaps in keys caused by automation children tracks
+ vector<int> neworder;
+ for (std::map<int,int>::const_iterator i = keys.begin(); i != keys.end(); ++i) {
+ neworder.push_back(i->second);
+ }
+ assert(neworder.size() == rows.size());
if (changed) {
strip_redisplay_does_not_reset_order_keys = true;