-// if (session->get_punch_in()) {
-// double x = frame_to_pixel (transport_punch_location->start());
-// gnome_canvas_item_set (transport_punchin_line, "x1", x, "x2", x, NULL);
-
-// if (visibility) {
-// gnome_canvas_item_show (transport_punchin_line);
-// }
-// }
-// else if (visibility) {
-// gnome_canvas_item_hide (transport_punchin_line);
-// }
+void
+Editor::marker_selection_changed ()
+{
+ if (session && session->deletion_in_progress()) {
+ return;
+ }
+
+ for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) {
+ LocationMarkers* lam = i->second;
+
+ if (lam->start) {
+ lam->start->hide_line();
+ }
+
+ if (lam->end) {
+ lam->end->hide_line();
+ }
+ }
+
+ edit_point_clock_connection_a.disconnect();
+ edit_point_clock_connection_b.disconnect();
+
+ if (selection->markers.empty()) {
+ edit_point_clock.set (0);
+ return;
+ }
+
+ for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
+ (*x)->add_line (cursor_group, 0, canvas_height);
+ (*x)->show_line ();
+ }
+
+ edit_point_clock.set (selection->markers.front()->position());
+
+ bool ignored;
+ Location* loc = find_location_from_marker (selection->markers.front(), ignored);
+
+ if (loc) {
+ edit_point_clock_connection_a = loc->changed.connect (mem_fun (*this, &Editor::selected_marker_moved));
+ edit_point_clock_connection_b = loc->start_changed.connect (mem_fun (*this, &Editor::selected_marker_moved));
+ }
+}
+
+void
+Editor::selected_marker_moved (Location* loc)
+{
+ edit_point_clock.set (loc->start());
+}
+
+struct SortLocationsByPosition {
+ bool operator() (Location* a, Location* b) {
+ return a->start() < b->start();
+ }
+};
+
+void
+Editor::goto_nth_marker (int n)
+{
+ if (!session) {
+ return;
+ }
+ const Locations::LocationList& l (session->locations()->list());
+ Locations::LocationList ordered;
+ ordered = l;
+
+ SortLocationsByPosition cmp;
+ ordered.sort (cmp);