more panner tweaking
[ardour.git] / gtk2_ardour / editor_route_list.cc
index 4ea2f54fabab2696e3d9419d9f9506d387ce9467..bad0854885fee17f82f2319af53c4c3d0bfb3f96 100644 (file)
 
 using namespace sigc;
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtk;
 
 void
-Editor::handle_new_route_p (Route* route)
-{
-       ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::handle_new_route_p), route));
-       handle_new_route (*route);
-}
-
-void
-Editor::handle_new_route (Route& route)
+Editor::handle_new_route (Session::RouteList& routes)
 {
+       ENSURE_GUI_THREAD(bind (mem_fun(*this, &Editor::handle_new_route), routes));
+       
        TimeAxisView *tv;
        AudioTimeAxisView *atv;
        TreeModel::Row parent;
        TreeModel::Row row;
 
-       if (route.hidden()) {
-               return;
-       }
-       
-       tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
+       for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+               boost::shared_ptr<Route> route = (*x);
 
+               if (route->hidden()) {
+                       return;
+               }
+               
+               tv = new AudioTimeAxisView (*this, *session, route, track_canvas);
+               
 #if 0
-       if (route_display_model->children().size() == 0) {
+               if (route_display_model->children().size() == 0) {
+                       
+                       /* set up basic entries */
+                       
+                       TreeModel::Row row;
+                       
+                       row = *(route_display_model->append());  // path = "0"
+                       row[route_display_columns.text] = _("Busses");
+                       row[route_display_columns.tv] = 0;
+                       row = *(route_display_model->append());  // path = "1"
+                       row[route_display_columns.text] = _("Tracks");
+                       row[route_display_columns.tv] = 0;
+                       
+               }
                
-                /* set up basic entries */
-
-               TreeModel::Row row;
+               if (dynamic_cast<AudioTrack*>(route.get()) != 0) {
+                       TreeModel::iterator iter = route_display_model->get_iter ("1");  // audio tracks 
+                       parent = *iter;
+               } else {
+                       TreeModel::iterator iter = route_display_model->get_iter ("0");  // busses
+                       parent = *iter;
+               }
                
-               row = *(route_display_model->append());  // path = "0"
-               row[route_display_columns.text] = _("Busses");
-               row[route_display_columns.tv] = 0;
-               row = *(route_display_model->append());  // path = "1"
-               row[route_display_columns.text] = _("Tracks");
-               row[route_display_columns.tv] = 0;
-
-       }
-
-       if (dynamic_cast<AudioTrack*>(&route) != 0) {
-               TreeModel::iterator iter = route_display_model->get_iter ("1");  // audio tracks 
-               parent = *iter;
-       } else {
-               TreeModel::iterator iter = route_display_model->get_iter ("0");  // busses
-               parent = *iter;
-       }
-       
-
-       row = *(route_display_model->append (parent.children()));
+               
+               row = *(route_display_model->append (parent.children()));
 #else 
-       row = *(route_display_model->append ());
+               row = *(route_display_model->append ());
 #endif
-
-       row[route_display_columns.text] = route.name();
-       row[route_display_columns.visible] = tv->marked_for_display();
-       row[route_display_columns.tv] = tv;
                
-       track_views.push_back (tv);
-
-       ignore_route_list_reorder = true;
-       
-       if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
-               /* added a new fresh one at the end */
-               if (atv->route().order_key(N_("editor")) == -1) {
-                       atv->route().set_order_key (N_("editor"), route_display_model->children().size()-1);
+               row[route_display_columns.text] = route->name();
+               row[route_display_columns.visible] = tv->marked_for_display();
+               row[route_display_columns.tv] = tv;
+               
+               track_views.push_back (tv);
+               
+               ignore_route_list_reorder = true;
+               
+               if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
+                       /* added a new fresh one at the end */
+                       if (atv->route()->order_key(N_("editor")) == -1) {
+                               atv->route()->set_order_key (N_("editor"), route_display_model->children().size()-1);
+                       }
                }
+               
+               ignore_route_list_reorder = false;
+               
+               route->gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
+               
+               tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
        }
 
-       ignore_route_list_reorder = false;
-       
-       route.gui_changed.connect (mem_fun(*this, &Editor::handle_gui_changes));
+       if (show_editor_mixer_when_tracks_arrive) {
+               show_editor_mixer (true);
+       }
 
-       tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
-       
        editor_mixer_button.set_sensitive(true);
 }
 
@@ -177,7 +181,6 @@ Editor::hide_track_in_display (TimeAxisView& tv)
 {
        TreeModel::Children rows = route_display_model->children();
        TreeModel::Children::iterator i;
-       Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                if ((*i)[route_display_columns.tv] == &tv) { 
@@ -188,7 +191,7 @@ Editor::hide_track_in_display (TimeAxisView& tv)
 
        AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*> (&tv);
 
-       if (atv && current_mixer_strip && &(atv->route()) == &(current_mixer_strip->route())) {
+       if (atv && current_mixer_strip && (atv->route() == current_mixer_strip->route())) {
                // this will hide the mixer strip
                set_selected_mixer_strip (tv);
        }
@@ -199,7 +202,6 @@ Editor::show_track_in_display (TimeAxisView& tv)
 {
        TreeModel::Children rows = route_display_model->children();
        TreeModel::Children::iterator i;
-       Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
        
        for (i = rows.begin(); i != rows.end(); ++i) {
                if ((*i)[route_display_columns.tv] == &tv) { 
@@ -224,7 +226,7 @@ Editor::redisplay_route_list ()
        uint32_t position;
        uint32_t order;
        int n;
-
+       
        if (no_route_list_redisplay) {
                return;
        }
@@ -245,7 +247,7 @@ Editor::redisplay_route_list ()
                        */
                        
                        if ((at = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
-                               at->route().set_order_key (N_("editor"), order);
+                               at->route()->set_order_key (N_("editor"), order);
                                ++order;
                        }
                }
@@ -253,7 +255,7 @@ Editor::redisplay_route_list ()
                bool visible = (*i)[route_display_columns.visible];
 
                if (visible) {
-                       tv->set_marked_for_display (false);
+                       tv->set_marked_for_display (true);
                        position += tv->show_at (position, n, &edit_controls_vbox);
                        position += track_spacing;
                } else {
@@ -264,6 +266,10 @@ Editor::redisplay_route_list ()
                
        }
 
+       /* make sure the cursors stay on top of every newly added track */
+
+       cursor_group->raise_to_top ();
+
        reset_scrolling_region ();
 }
 
@@ -464,7 +470,7 @@ Editor::show_route_list_menu()
                build_route_list_menu ();
        }
 
-       route_list_menu->popup (1, 0);
+       route_list_menu->popup (1, gtk_get_current_event_time());
 }
 
 bool
@@ -474,27 +480,26 @@ Editor::route_list_selection_filter (const Glib::RefPtr<TreeModel>& model, const
 }
 
 struct EditorOrderRouteSorter {
-    bool operator() (Route* a, Route* b) {
+    bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
            /* use of ">" forces the correct sort order */
-           return a->order_key ("editor") > b->order_key ("editor");
+           return a->order_key ("editor") < b->order_key ("editor");
     }
 };
 
 void
 Editor::initial_route_list_display ()
 {
-       Session::RouteList routes = session->get_routes();
+       boost::shared_ptr<Session::RouteList> routes = session->get_routes();
+       Session::RouteList r (*routes);
        EditorOrderRouteSorter sorter;
 
-       routes.sort (sorter);
+       r.sort (sorter);
        
        no_route_list_redisplay = true;
 
        route_display_model->clear ();
 
-       for (Session::RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
-               handle_new_route (**i);
-       }
+       handle_new_route (r);
 
        no_route_list_redisplay = false;