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
This commit is contained in:
parent
49f59709d8
commit
f750aa3207
@ -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> 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)));
|
||||
}
|
||||
|
||||
if (old_order != new_order) {
|
||||
SortByNewDisplayOrder cmp;
|
||||
|
||||
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) {
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "ardour_ui.h"
|
||||
#include "prompter.h"
|
||||
#include "utils.h"
|
||||
#include "route_sorter.h"
|
||||
#include "actions.h"
|
||||
#include "gui_thread.h"
|
||||
#include "mixer_group_tabs.h"
|
||||
@ -543,20 +544,30 @@ Mixer_UI::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> route = (*ri)[track_columns.route];
|
||||
uint32_t new_order = route->order_key (MixerSort);
|
||||
sorted_routes.push_back (RoutePlusOrderKey (route, old_order, route->order_key (MixerSort)));
|
||||
}
|
||||
|
||||
neworder[new_order] = old_order;
|
||||
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 ("MIXER change order for %1 from %2 to %3\n",
|
||||
route->name(), old_order, new_order));
|
||||
sr->route->name(), sr->old_display_order, n));
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
|
@ -249,6 +249,8 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
|
||||
void sync_order_keys_from_treeview ();
|
||||
void sync_treeview_from_order_keys (ARDOUR::RouteSortOrderKey);
|
||||
void reset_remote_control_ids ();
|
||||
void reset_order_keys (ARDOUR::RouteSortOrderKey);
|
||||
|
||||
bool ignore_reorder;
|
||||
|
||||
void parameter_changed (std::string const &);
|
||||
|
50
gtk2_ardour/route_sorter.h
Normal file
50
gtk2_ardour/route_sorter.h
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
Copyright (C) 2012 Paul Davis
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __gtk2_ardour_route_sorter_h__
|
||||
#define __gtk2_ardour_route_sorter_h__
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#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 */
|
||||
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) {}
|
||||
};
|
||||
|
||||
typedef std::vector<RoutePlusOrderKey> OrderKeySortedRoutes;
|
||||
|
||||
struct SortByNewDisplayOrder {
|
||||
bool operator() (const RoutePlusOrderKey& a, const RoutePlusOrderKey& b) {
|
||||
return a.new_display_order < b.new_display_order;
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* __gtk2_ardour_route_sorter_h__ */
|
Loading…
Reference in New Issue
Block a user