Add option to collect a route group, so that its member routes are reordered to be...
authorCarl Hetherington <carl@carlh.net>
Sat, 4 Jul 2009 13:44:01 +0000 (13:44 +0000)
committerCarl Hetherington <carl@carlh.net>
Sat, 4 Jul 2009 13:44:01 +0000 (13:44 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5319 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor_route_groups.cc
gtk2_ardour/editor_route_groups.h
gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_routes.h
libs/ardour/ardour/route_group.h
libs/ardour/route.cc

index 16f0f0ae536eacaf1ceb116a33d4dc8c85b89b37..da1385bbe7c5e4987dd63b4feb5d994ea5a6df50 100644 (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 ();
 }
index a9abf4889d0aca1093633ebb70c7d0d3b2868414..b459168dcb2ea3790daf116d4e6fe10586454227 100644 (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"));
+}
index 02d5bac59c88262921b100648e99bbe9aeb2092f..d87c8f5c834c744876d617b0f52d0509945d49af 100644 (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&);
index 161d8c61fbfa8e5ec6d450524ac72c051a279bf0..46fd4548b39ac52677eb03d4c36a89c5612b5737 100644 (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
index f416f8f195ecf2217c05503934fbc5bebff435e6..a075902dee7dd94e5cf025d31b99daa9ee5a20a2 100644 (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 ();
index 7b7166decdd3def589008646c5d4bd6e7452f1e0..75f5af790e30b7dfcf7e8f0b2c1d4911118bf2b1 100644 (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);
index af1a7217d02f0a6c770d6175ad322a050477cc72..61f975689c7187019ea061ec6228e8fbbda80220 100644 (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)
 {