Move a forward declaration (for class ArdourVSpacer) so that MSVC can also use it
[ardour.git] / gtk2_ardour / editor_drag.cc
index 00a3541c09348965ae1f370edeaca9f3102ad8ac..966cd293f5d78e37f300e308d9a381b8ab45534c 100644 (file)
@@ -1382,8 +1382,7 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
 
                if (was_double_click() && !_views.empty()) {
                        DraggingView dv = _views.front();
-                       dv.view->show_region_editor ();
-
+                       _editor->edit_region (dv.view);
                }
 
                return;
@@ -1422,8 +1421,6 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
                        );
 
        }
-
-       _editor->maybe_locate_with_edit_preroll (_editor->get_selection().regions.start());
 }
 
 RouteTimeAxisView*
@@ -1468,6 +1465,10 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
        PlaylistSet modified_playlists;
        RouteTimeAxisView* new_time_axis_view = 0;
 
+       int32_t divisor = current_music_divisor (_primary->region()->position() - drag_delta, ev_state);
+       TempoMap& tmap (_editor->session()->tempo_map());
+       double qn_delta = _primary->region()->quarter_note() - tmap.exact_qn_at_frame (_primary->region()->position() - drag_delta, divisor);
+
        if (_brushing) {
                /* all changes were made during motion event handlers */
 
@@ -1528,8 +1529,14 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const /*changed
                                new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
                                                                        modified_playlists, current_music_divisor (where, ev_state));
                        } else {
-                               new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
-                                                                       modified_playlists, 0);
+                               if (i->view->region()->position_lock_style() == AudioTime) {
+                                       new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+                                                                               modified_playlists, 0);
+                               } else {
+                                       where = tmap.frame_at_quarter_note (i->view->region()->quarter_note() - qn_delta);
+                                       new_view = insert_region_into_playlist (i->view->region(), dest_rtv, i->layer, where,
+                                                                               modified_playlists, 0);
+                               }
                        }
 
                        if (new_view != 0) {
@@ -1578,6 +1585,10 @@ RegionMoveDrag::finished_no_copy (
        typedef map<boost::shared_ptr<Playlist>, RouteTimeAxisView*> PlaylistMapping;
        PlaylistMapping playlist_mapping;
 
+       int32_t divisor = current_music_divisor (_primary->region()->position() - drag_delta, ev_state);
+       TempoMap& tmap (_editor->session()->tempo_map());
+       double qn_delta = _primary->region()->quarter_note() - tmap.exact_qn_at_frame (_primary->region()->position() - drag_delta, divisor);
+
        std::set<boost::shared_ptr<const Region> > uniq;
        for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ) {
 
@@ -1644,10 +1655,19 @@ RegionMoveDrag::finished_no_copy (
                                        modified_playlists, current_music_divisor (where, ev_state)
                                        );
                        } else {
-                               new_view = insert_region_into_playlist (
-                                       RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
-                                       modified_playlists, 0
-                                       );
+                               if (rv->region()->position_lock_style() == AudioTime) {
+
+                                       new_view = insert_region_into_playlist (
+                                               RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+                                               modified_playlists, 0
+                                               );
+                               } else {
+                                       where = tmap.frame_at_quarter_note (rv->region()->quarter_note() - qn_delta);
+                                       new_view = insert_region_into_playlist (
+                                               RegionFactory::create (rv->region (), true), dest_rtv, dest_layer, where,
+                                               modified_playlists, 0
+                                               );
+                               }
                        }
 
                        if (new_view == 0) {
@@ -1709,7 +1729,12 @@ RegionMoveDrag::finished_no_copy (
                        if (rv == _primary) {
                                rv->region()->set_position (where, current_music_divisor (where, ev_state));
                        } else {
-                               rv->region()->set_position (where, 0);
+                               if (rv->region()->position_lock_style() == AudioTime) {
+                                       rv->region()->set_position (where, 0);
+                               } else {
+                                       rv->region()->set_position (tmap.frame_at_quarter_note (rv->region()->quarter_note() - qn_delta), 0);
+
+                               }
                        }
                        _editor->session()->add_command (new StatefulDiffCommand (rv->region()));
                }
@@ -2312,8 +2337,7 @@ RegionRippleDrag::finished (GdkEvent* event, bool movement_occurred)
 
                if (was_double_click() && !_views.empty()) {
                        DraggingView dv = _views.front();
-                       dv.view->show_region_editor ();
-
+                       _editor->edit_region (dv.view);
                }
 
                return;
@@ -3095,18 +3119,6 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
                        }
                }
 
-               if (!_views.empty()) {
-                       if (_operation == StartTrim) {
-                               _editor->maybe_locate_with_edit_preroll(
-                                       _views.begin()->view->region()->position());
-                       }
-                       if (_operation == EndTrim) {
-                               _editor->maybe_locate_with_edit_preroll(
-                                       _views.begin()->view->region()->position() +
-                                       _views.begin()->view->region()->length());
-                       }
-               }
-
                if (!_editor->selection->selected (_primary)) {
                        _primary->thaw_after_trim ();
                } else {
@@ -3261,8 +3273,9 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
                                --bbt.bars;
                        }
                        const double beat = map.beat_at_bbt (bbt);
+                       const framepos_t frame = map.frame_at_beat (beat);
                        _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor())
-                                                      , beat, bbt, _real_section->position_lock_style());
+                                                      , beat, bbt, frame, _real_section->position_lock_style());
                        if (!_real_section) {
                                aborted (true);
                                return;
@@ -3283,7 +3296,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
                pf = adjusted_current_frame (event, false);
        }
 
-       _editor->session()->tempo_map().gui_move_meter (_real_section, pf);
+       _editor->session()->tempo_map().gui_set_meter_position (_real_section, pf);
 
        /* fake marker meeds to stay under the mouse, unlike the real one. */
        _marker->set_position (adjusted_current_frame (event, false));
@@ -3446,7 +3459,7 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
                /* snap to beat is 1, snap to bar is -1 (sorry) */
                const int sub_num = _editor->get_grid_music_divisions (event->button.state);
 
-               map.gui_move_tempo (_real_section, pf, sub_num);
+               map.gui_set_tempo_position (_real_section, pf, sub_num);
 
                show_verbose_cursor_time (_real_section->frame());
        }
@@ -3545,7 +3558,7 @@ BBTRulerDrag::motion (GdkEvent* event, bool first_move)
        if (first_move) {
                /* get current state */
                before_state = &map.get_state();
-               _editor->begin_reversible_command (_("dilate tempo"));
+               _editor->begin_reversible_command (_("stretch tempo"));
        }
 
        framepos_t pf;
@@ -3558,7 +3571,7 @@ BBTRulerDrag::motion (GdkEvent* event, bool first_move)
 
        if (ArdourKeyboard::indicates_constraint (event->button.state)) {
                /* adjust previous tempo to match pointer frame */
-               _editor->session()->tempo_map().gui_dilate_tempo (_tempo, map.frame_at_quarter_note (_grab_qn), pf);
+               _editor->session()->tempo_map().gui_stretch_tempo (_tempo, map.frame_at_quarter_note (_grab_qn), pf);
        }
        ostringstream sstr;
        sstr << "^" << fixed << setprecision(3) << map.tempo_at_frame (pf).note_types_per_minute() << "\n";
@@ -5296,10 +5309,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
                                s->request_play_range (&_editor->selection->time, true);
                        } else if (!s->config.get_external_sync()) {
                                if (UIConfiguration::instance().get_follow_edits() && !s->transport_rolling()) {
-                                       if (_operation == SelectionEndTrim)
-                                               _editor->maybe_locate_with_edit_preroll( _editor->get_selection().time.end_frame());
-                                       else
-                                               s->request_locate (_editor->get_selection().time.start());
+                                       s->request_locate (_editor->get_selection().time.start());
                                }
                        }
 
@@ -5314,6 +5324,13 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred)
                /* just a click, no pointer movement.
                 */
 
+               if (was_double_click()) {
+                       if (UIConfiguration::instance().get_use_double_click_to_zoom_to_selection()) {
+                               _editor->temporal_zoom_selection (Both);
+                               return;
+                       }
+               }
+
                if (_operation == SelectionExtend) {
                        if (_time_selection_at_start) {
                                framepos_t pos = adjusted_current_frame (event, false);