Add option to collect a route group, so that its member routes are reordered to be together in the editor. A few cleanups along the way.

git-svn-id: svn://localhost/ardour2/branches/3.0@5319 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-07-04 13:44:01 +00:00
parent 36564e4f91
commit 40b0b216de
7 changed files with 78 additions and 17 deletions

View File

@ -1175,8 +1175,6 @@ Editor::connect_to_session (Session *t)
//tempo_map_changed (Change (0));
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
_routes->initial_display ();
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(static_cast<TimeAxisView*>(*i))->set_samples_per_unit (frames_per_unit);
}
@ -1203,6 +1201,7 @@ Editor::connect_to_session (Session *t)
_route_groups->connect_to_session (session);
_regions->connect_to_session (session);
_snapshots->connect_to_session (session);
_routes->connect_to_session (session);
start_updating ();
}

View File

@ -187,6 +187,7 @@ EditorRouteGroups::menu (RouteGroup* g)
items.push_back (MenuElem (_("Edit..."), bind (mem_fun (*this, &EditorRouteGroups::edit), g)));
items.push_back (MenuElem (_("Fit to Window"), bind (mem_fun (*_editor, &Editor::fit_route_group), g)));
items.push_back (MenuElem (_("Subgroup"), bind (mem_fun (*this, &EditorRouteGroups::subgroup), g)));
items.push_back (MenuElem (_("Collect"), bind (mem_fun (*this, &EditorRouteGroups::collect), g)));
}
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &EditorRouteGroups::activate_all)));
@ -665,4 +666,51 @@ EditorRouteGroups::connect_to_session (Session* s)
groups_changed ();
}
/** Collect all members of a RouteGroup so that they are together in the Editor.
* @param g Group to collect.
*/
void
EditorRouteGroups::collect (RouteGroup* g)
{
list<Route*> routes = g->route_list ();
int const N = routes.size ();
list<Route*>::iterator i = routes.begin ();
Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin();
int diff = 0;
int coll = -1;
while (i != routes.end() && j != _editor->get_track_views().end()) {
RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
if (rtv) {
boost::shared_ptr<Route> r = rtv->route ();
int const k = r->order_key (N_ ("editor"));
if (*i == r.get()) {
if (coll == -1) {
coll = k;
diff = N - 1;
} else {
--diff;
}
r->set_order_key (N_ ("editor"), coll);
++coll;
++i;
} else {
r->set_order_key (N_ ("editor"), k + diff);
}
}
++j;
}
_editor->_routes->sync_order_keys (N_ ("editor"));
}

View File

@ -65,8 +65,9 @@ private:
void activate_all ();
void disable_all ();
void subgroup (ARDOUR::RouteGroup*);
void unsubgroup (ARDOUR::RouteGroup*);
void subgroup (ARDOUR::RouteGroup *);
void unsubgroup (ARDOUR::RouteGroup *);
void collect (ARDOUR::RouteGroup *);
void row_change (const Gtk::TreeModel::Path&,const Gtk::TreeModel::iterator&);
void name_edit (const Glib::ustring&, const Glib::ustring&);

View File

@ -108,6 +108,14 @@ EditorRoutes::EditorRoutes (Editor* e)
Route::SyncOrderKeys.connect (mem_fun (*this, &EditorRoutes::sync_order_keys));
}
void
EditorRoutes::connect_to_session (Session* s)
{
EditorComponent::connect_to_session (s);
initial_display ();
}
void
EditorRoutes::on_tv_rec_enable_toggled (Glib::ustring const & path_string)
{
@ -216,7 +224,7 @@ EditorRoutes::redisplay ()
}
if (!_redisplay_does_not_reset_order_keys && !_redisplay_does_not_sync_order_keys) {
_editor->current_session()->sync_order_keys (N_ ("editor"));
_session->sync_order_keys (N_ ("editor"));
}
}
@ -224,7 +232,7 @@ void
EditorRoutes::route_deleted (Gtk::TreeModel::Path const & path)
{
/* this could require an order reset & sync */
_editor->current_session()->set_remote_control_ids();
_session->set_remote_control_ids();
_ignore_reorder = true;
redisplay ();
_ignore_reorder = false;
@ -236,7 +244,7 @@ EditorRoutes::changed (Gtk::TreeModel::Path const & path, Gtk::TreeModel::iterat
{
/* never reset order keys because of a property change */
_redisplay_does_not_reset_order_keys = true;
_editor->current_session()->set_remote_control_ids();
_session->set_remote_control_ids();
redisplay ();
_redisplay_does_not_reset_order_keys = false;
}
@ -398,7 +406,9 @@ EditorRoutes::reordered (TreeModel::Path const & path, TreeModel::iterator const
redisplay ();
}
/** If src == "editor", take editor order keys from each route and use them to rearrange the
* route list so that the visual arrangement of routes matches the order keys from the routes.
*/
void
EditorRoutes::sync_order_keys (string const & src)
{
@ -406,9 +416,7 @@ EditorRoutes::sync_order_keys (string const & src)
TreeModel::Children rows = _model->children();
TreeModel::Children::iterator ri;
ARDOUR::Session* s = _editor->current_session ();
if (src != N_ ("editor") || !s || (s->state_of_the_state() & Session::Loading) || rows.empty()) {
if (src != N_ ("editor") || !_session || (_session->state_of_the_state() & Session::Loading) || rows.empty()) {
return;
}
@ -627,7 +635,7 @@ struct EditorOrderRouteSorter {
void
EditorRoutes::initial_display ()
{
boost::shared_ptr<RouteList> routes = _editor->current_session()->get_routes();
boost::shared_ptr<RouteList> routes = _session->get_routes();
RouteList r (*routes);
EditorOrderRouteSorter sorter;
@ -669,7 +677,7 @@ void
EditorRoutes::track_list_reorder (Gtk::TreeModel::Path const & path, Gtk::TreeModel::iterator const & iter, int* new_order)
{
_redisplay_does_not_sync_order_keys = true;
_editor->current_session()->set_remote_control_ids();
_session->set_remote_control_ids();
redisplay ();
_redisplay_does_not_sync_order_keys = false;
}
@ -797,7 +805,7 @@ EditorRoutes::move_selected_tracks (bool up)
_model->reorder (neworder);
_editor->current_session()->sync_order_keys (N_ ("editor"));
_session->sync_order_keys (N_ ("editor"));
}
void

View File

@ -22,12 +22,13 @@ class EditorRoutes : public EditorComponent
public:
EditorRoutes (Editor *);
void connect_to_session (ARDOUR::Session *);
Gtk::Widget& widget () {
return _scroller;
}
void move_selected_tracks (bool);
void initial_display ();
void show_track_in_display (TimeAxisView &);
void suspend_redisplay () {
_no_redisplay = true;
@ -43,9 +44,11 @@ public:
std::list<TimeAxisView*> views () const;
void hide_all_tracks (bool);
void clear ();
void sync_order_keys (std::string const &);
private:
void initial_display ();
void on_tv_rec_enable_toggled (Glib::ustring const &);
void build_menu ();
void show_menu ();
@ -54,7 +57,6 @@ private:
void reordered (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const &, int *);
bool button_press (GdkEventButton *);
void route_name_changed (boost::weak_ptr<ARDOUR::Route>);
void sync_order_keys (std::string const &);
void route_removed (TimeAxisView *);
void handle_gui_changes (std::string const &, void *);
void update_rec_display ();

View File

@ -66,7 +66,6 @@ public:
gain_t get_min_factor(gain_t factor);
int size() { return routes.size();}
ARDOUR::Route * first () const { return *routes.begin();}
void set_active (bool yn, void *src);
void set_relative (bool yn, void *src);

View File

@ -204,6 +204,10 @@ Route::set_order_key (std::string const & name, long n)
_session.set_dirty ();
}
/** Set all order keys to be the same as that for `base', if such a key
* exists in this route.
* @param base Base key.
*/
void
Route::sync_order_keys (std::string const & base)
{