From f750aa32070b128f5e61e5abc39855f8654fb0de Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 27 Oct 2012 00:15:45 +0000 Subject: fix serious logic error in re-ordering treeviews after route order keys/RIDs change - fixes major memory corruption bug that overwrote random memory as soon as a track gets deleted and/or user-defined remote IDs are in use git-svn-id: svn://localhost/ardour2/branches/3.0@13355 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_routes.cc | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'gtk2_ardour/editor_routes.cc') diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index f453caf831..acbbb697f2 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -45,6 +45,7 @@ #include "gui_thread.h" #include "actions.h" #include "utils.h" +#include "route_sorter.h" #include "editor_group_tabs.h" #include "editor_routes.h" @@ -961,21 +962,30 @@ EditorRoutes::sync_treeview_from_order_keys (RouteSortOrderKey src) return; } - neworder.assign (rows.size(), 0); + OrderKeySortedRoutes sorted_routes; for (TreeModel::Children::iterator ri = rows.begin(); ri != rows.end(); ++ri, ++old_order) { boost::shared_ptr route = (*ri)[_columns.route]; - uint32_t new_order = route->order_key (EditorSort); - - DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("EDITOR change order for %1 from %2 to %3\n", - route->name(), old_order, new_order)); - - neworder[new_order] = old_order; + sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key (EditorSort))); + } + + SortByNewDisplayOrder cmp; - if (old_order != new_order) { + sort (sorted_routes.begin(), sorted_routes.end(), cmp); + neworder.assign (sorted_routes.size(), 0); + + uint32_t n = 0; + + for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) { + + neworder[n] = sr->old_display_order; + + if (sr->old_display_order != n) { 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)); } if (changed) { -- cgit v1.2.3