allow the use of static_cast for MGR ghost events (speeds things up a bit).
[ardour.git] / gtk2_ardour / editor_ops.cc
index 00a36dab63d7868136954423ec852a44e49862cc..6a21dd84322f5454ca5987d2b737d9ca7fee8e2e 100644 (file)
@@ -420,6 +420,7 @@ Editor::nudge_forward (bool next, bool force_playhead)
 
                bool is_start;
                bool in_command = false;
+               const int32_t divisions = get_grid_music_divisions (0);
 
                for (MarkerSelection::iterator i = selection->markers.begin(); i != selection->markers.end(); ++i) {
 
@@ -435,9 +436,9 @@ Editor::nudge_forward (bool next, bool force_playhead)
                                                distance = next_distance;
                                        }
                                        if (max_framepos - distance > loc->start() + loc->length()) {
-                                               loc->set_start (loc->start() + distance);
+                                               loc->set_start (loc->start() + distance, false, true, divisions);
                                        } else {
-                                               loc->set_start (max_framepos - loc->length());
+                                               loc->set_start (max_framepos - loc->length(), false, true, divisions);
                                        }
                                } else {
                                        distance = get_nudge_distance (loc->end(), next_distance);
@@ -445,9 +446,9 @@ Editor::nudge_forward (bool next, bool force_playhead)
                                                distance = next_distance;
                                        }
                                        if (max_framepos - distance > loc->end()) {
-                                               loc->set_end (loc->end() + distance);
+                                               loc->set_end (loc->end() + distance, false, true, divisions);
                                        } else {
-                                               loc->set_end (max_framepos);
+                                               loc->set_end (max_framepos, false, true, divisions);
                                        }
                                        if (loc->is_session_range()) {
                                                _session->set_end_is_free (false);
@@ -527,9 +528,9 @@ Editor::nudge_backward (bool next, bool force_playhead)
                                                distance = next_distance;
                                        }
                                        if (distance < loc->start()) {
-                                               loc->set_start (loc->start() - distance);
+                                               loc->set_start (loc->start() - distance, false, true, get_grid_music_divisions(0));
                                        } else {
-                                               loc->set_start (0);
+                                               loc->set_start (0, false, true, get_grid_music_divisions(0));
                                        }
                                } else {
                                        distance = get_nudge_distance (loc->end(), next_distance);
@@ -539,9 +540,9 @@ Editor::nudge_backward (bool next, bool force_playhead)
                                        }
 
                                        if (distance < loc->end() - loc->length()) {
-                                               loc->set_end (loc->end() - distance);
+                                               loc->set_end (loc->end() - distance, false, true, get_grid_music_divisions(0));
                                        } else {
-                                               loc->set_end (loc->length());
+                                               loc->set_end (loc->length(), false, true, get_grid_music_divisions(0));
                                        }
                                        if (loc->is_session_range()) {
                                                _session->set_end_is_free (false);
@@ -1155,7 +1156,7 @@ Editor::selected_marker_to_region_boundary (bool with_selection, int32_t dir)
                return;
        }
 
-       loc->move_to (target);
+       loc->move_to (target, 0);
 }
 
 void
@@ -1232,7 +1233,7 @@ Editor::selected_marker_to_region_point (RegionPoint point, int32_t dir)
 
        pos = track_frame_to_session_frame(pos, speed);
 
-       loc->move_to (pos);
+       loc->move_to (pos, 0);
 }
 
 void
@@ -1279,7 +1280,7 @@ Editor::selected_marker_to_selection_start ()
                return;
        }
 
-       loc->move_to (pos);
+       loc->move_to (pos, 0);
 }
 
 void
@@ -1314,7 +1315,7 @@ Editor::selected_marker_to_selection_end ()
                return;
        }
 
-       loc->move_to (pos);
+       loc->move_to (pos, 0);
 }
 
 void
@@ -1366,6 +1367,7 @@ Editor::cursor_align (bool playhead_to_edit)
                _session->request_locate (selection->markers.front()->position(), _session->transport_rolling());
 
        } else {
+               const int32_t divisions = get_grid_music_divisions (0);
                /* move selected markers to playhead */
 
                for (MarkerSelection::iterator i = selection->markers.begin(); i != selection->markers.end(); ++i) {
@@ -1374,10 +1376,10 @@ Editor::cursor_align (bool playhead_to_edit)
                        Location* loc = find_location_from_marker (*i, ignored);
 
                        if (loc->is_mark()) {
-                               loc->set_start (playhead_cursor->current_frame ());
+                               loc->set_start (playhead_cursor->current_frame (), false, true, divisions);
                        } else {
                                loc->set (playhead_cursor->current_frame (),
-                                         playhead_cursor->current_frame () + loc->length());
+                                         playhead_cursor->current_frame () + loc->length(), true, divisions);
                        }
                }
        }
@@ -2145,7 +2147,7 @@ Editor::add_location_from_selection ()
        framepos_t end = selection->time[clicked_selection].end;
 
        _session->locations()->next_available_name(rangename,"selection");
-       Location *location = new Location (*_session, start, end, rangename, Location::IsRangeMarker);
+       Location *location = new Location (*_session, start, end, rangename, Location::IsRangeMarker, get_grid_music_divisions(0));
 
        begin_reversible_command (_("add marker"));
 
@@ -2168,7 +2170,7 @@ Editor::add_location_mark (framepos_t where)
        if (!choose_new_marker_name(markername)) {
                return;
        }
-       Location *location = new Location (*_session, where, where, markername, Location::IsMark);
+       Location *location = new Location (*_session, where, where, markername, Location::IsMark, get_grid_music_divisions (0));
        begin_reversible_command (_("add marker"));
 
        XMLNode &before = _session->locations()->get_state();
@@ -2297,7 +2299,7 @@ Editor::add_locations_from_region ()
 
                boost::shared_ptr<Region> region = (*i)->region ();
 
-               Location *location = new Location (*_session, region->position(), region->last_frame(), region->name(), Location::IsRangeMarker);
+               Location *location = new Location (*_session, region->position(), region->last_frame(), region->name(), Location::IsRangeMarker, 0);
 
                _session->locations()->add (location, true);
                commit = true;
@@ -2338,7 +2340,7 @@ Editor::add_location_from_region ()
        }
 
        // single range spanning all selected
-       Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker);
+       Location *location = new Location (*_session, selection->regions.start(), selection->regions.end_frame(), markername, Location::IsRangeMarker, 0);
        _session->locations()->add (location, true);
 
        begin_reversible_command (_("add marker"));
@@ -2393,7 +2395,7 @@ Editor::set_mark ()
                return;
        }
 
-       _session->locations()->add (new Location (*_session, pos, 0, markername, Location::IsMark), true);
+       _session->locations()->add (new Location (*_session, pos, 0, markername, Location::IsMark, 0), true);
 }
 
 void
@@ -2626,13 +2628,12 @@ Editor::maybe_locate_with_edit_preroll ( framepos_t location )
 void
 Editor::play_with_preroll ()
 {
-       {
-               framepos_t preroll = get_preroll();
-
-               framepos_t start, end;
-               if (!get_selection_extents ( start, end))
-                       return;
+       framepos_t preroll = get_preroll();
+       framepos_t start, end;
+       if ( UIConfiguration::instance().get_follow_edits() && get_selection_extents ( start, end) ) {
 
+               framepos_t ret = start;
+               
                if (start > preroll)
                        start = start - preroll;
 
@@ -2643,6 +2644,16 @@ Editor::play_with_preroll ()
                lar.push_back (ar);
 
                _session->request_play_range (&lar, true);
+               _session->set_requested_return_frame( ret );  //force auto-return to return to range start, without the preroll
+       } else {
+               framepos_t ph = playhead_cursor->current_frame ();
+               framepos_t start;
+               if (ph > preroll)
+                       start = ph - preroll; 
+               else
+                       start = 0;
+               _session->request_locate ( start, true);
+               _session->set_requested_return_frame( ph );  //force auto-return to return to playhead location, without the preroll
        }
 }
 
@@ -6164,7 +6175,7 @@ Editor::set_edit_point ()
                Location* loc = find_location_from_marker (selection->markers.front(), ignored);
 
                if (loc) {
-                       loc->move_to (where);
+                       loc->move_to (where, get_grid_music_divisions(0));
                }
        }
 }
@@ -7477,6 +7488,7 @@ Editor::insert_time (
        /* markers */
        if (markers_too) {
                bool moved = false;
+               const int32_t divisions = get_grid_music_divisions (0);
                XMLNode& before (_session->locations()->get_state());
                Locations::LocationList copy (_session->locations()->list());
 
@@ -7493,9 +7505,9 @@ Editor::insert_time (
                                if ((*i)->start() >= pos) {
                                        // move end first, in case we're moving by more than the length of the range
                                        if (!(*i)->is_mark()) {
-                                               (*i)->set_end ((*i)->end() + frames);
+                                               (*i)->set_end ((*i)->end() + frames, false, true, divisions);
                                        }
-                                       (*i)->set_start ((*i)->start() + frames);
+                                       (*i)->set_start ((*i)->start() + frames, false, true, divisions);
                                        moved = true;
                                }
 
@@ -7608,6 +7620,7 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
                }
        }
 
+       const int32_t divisions = get_grid_music_divisions (0);
        std::list<Location*> loc_kill_list;
 
        /* markers */
@@ -7636,20 +7649,20 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
                                                // if we're removing more time than the length of the range
                                                if ((*i)->start() >= pos && (*i)->start() < pos+frames) {
                                                        // start is within cut
-                                                       (*i)->set_start (pos);  // bring the start marker to the beginning of the cut
+                                                       (*i)->set_start (pos, false, true,divisions);  // bring the start marker to the beginning of the cut
                                                        moved = true;
                                                } else if ((*i)->start() >= pos+frames) {
                                                        // start (and thus entire range) lies beyond end of cut
-                                                       (*i)->set_start ((*i)->start() - frames); // slip the start marker back
+                                                       (*i)->set_start ((*i)->start() - frames, false, true, divisions); // slip the start marker back
                                                        moved = true;
                                                }
                                                if ((*i)->end() >= pos && (*i)->end() < pos+frames) {
                                                        // end is inside cut
-                                                       (*i)->set_end (pos);  // bring the end to the cut
+                                                       (*i)->set_end (pos, false, true, divisions);  // bring the end to the cut
                                                        moved = true;
                                                } else if ((*i)->end() >= pos+frames) {
                                                        // end is beyond end of cut
-                                                       (*i)->set_end ((*i)->end() - frames); // slip the end marker back
+                                                       (*i)->set_end ((*i)->end() - frames, false, true, divisions); // slip the end marker back
                                                        moved = true;
                                                }
 
@@ -7658,7 +7671,7 @@ Editor::remove_time (framepos_t pos, framecnt_t frames, InsertTimeOption opt,
                                        loc_kill_list.push_back(*i);
                                        moved = true;
                                } else if ((*i)->start() >= pos) {
-                                       (*i)->set_start ((*i)->start() -frames);
+                                       (*i)->set_start ((*i)->start() -frames, false, true, divisions);
                                        moved = true;
                                }