Fix region content drag direction
[ardour.git] / gtk2_ardour / editor_drag.cc
index a912716d7dfc0ca9622b8e03178f4db0f9100667..a3c07b86726fac58e0dcc15f38c480228fbc3fcb 100644 (file)
@@ -127,7 +127,7 @@ DragManager::start_grab (GdkEvent* e, Gdk::Cursor* c)
        _old_follow_playhead = _editor->follow_playhead ();
        _editor->set_follow_playhead (false);
 
-       _current_pointer_frame = _editor->canvas_event_frame (e, &_current_pointer_x, &_current_pointer_y);
+       _current_pointer_frame = _editor->canvas_event_sample (e, &_current_pointer_x, &_current_pointer_y);
 
        for (list<Drag*>::const_iterator i = _drags.begin(); i != _drags.end(); ++i) {
                (*i)->start_grab (e, c);
@@ -173,7 +173,7 @@ DragManager::motion_handler (GdkEvent* e, bool from_autoscroll)
 {
        bool r = false;
 
-       _current_pointer_frame = _editor->canvas_event_frame (e, &_current_pointer_x, &_current_pointer_y);
+       _current_pointer_frame = _editor->canvas_event_sample (e, &_current_pointer_x, &_current_pointer_y);
 
        for (list<Drag*>::iterator i = _drags.begin(); i != _drags.end(); ++i) {
                bool const t = (*i)->motion_handler (e, from_autoscroll);
@@ -191,7 +191,7 @@ DragManager::window_motion_handler (GdkEvent* e, bool from_autoscroll)
 {
        bool r = false;
 
-       _current_pointer_frame = _editor->canvas_event_frame (e, &_current_pointer_x, &_current_pointer_y);
+       _current_pointer_frame = _editor->canvas_event_sample (e, &_current_pointer_x, &_current_pointer_y);
 
        for (list<Drag*>::iterator i = _drags.begin(); i != _drags.end(); ++i) {
                bool const t = (*i)->motion_handler (e, from_autoscroll);
@@ -259,7 +259,7 @@ Drag::start_grab (GdkEvent* event, Gdk::Cursor *cursor)
                _y_constrained = false;
        }
 
-       _raw_grab_frame = _editor->canvas_event_frame (event, &_grab_x, &_grab_y);
+       _raw_grab_frame = _editor->canvas_event_sample (event, &_grab_x, &_grab_y);
        setup_pointer_frame_offset ();
        _grab_frame = adjusted_frame (_raw_grab_frame, event);
        _last_pointer_frame = _grab_frame;
@@ -361,16 +361,16 @@ Drag::motion_handler (GdkEvent* event, bool from_autoscroll)
 
                if (event->motion.state & Gdk::BUTTON1_MASK || event->motion.state & Gdk::BUTTON2_MASK) {
                        if (!from_autoscroll) {
-                               bool const moving_left = _drags->current_pointer_x() < _last_pointer_x;
-                               bool const moving_up = _drags->current_pointer_y() < _last_pointer_y;
-                               _editor->maybe_autoscroll (true, allow_vertical_autoscroll (), moving_left, moving_up);
+                               _editor->maybe_autoscroll (true, allow_vertical_autoscroll (), false);
                        }
 
-                       motion (event, _move_threshold_passed != old_move_threshold_passed);
-
-                       _last_pointer_x = _drags->current_pointer_x ();
-                       _last_pointer_y = _drags->current_pointer_y ();
-                       _last_pointer_frame = adjusted_current_frame (event);
+                       if (!_editor->autoscroll_active() || from_autoscroll) {
+                               motion (event, _move_threshold_passed != old_move_threshold_passed);
+                               
+                               _last_pointer_x = _drags->current_pointer_x ();
+                               _last_pointer_y = _drags->current_pointer_y ();
+                               _last_pointer_frame = adjusted_current_frame (event);
+                       }
 
                        return true;
                }
@@ -1077,6 +1077,17 @@ RegionMoveDrag::finished_no_copy (
 
                } else {
 
+                       boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();
+
+                       /* this movement may result in a crossfade being modified, or a layering change,
+                          so we need to get undo data from the playlist as well as the region.
+                       */
+
+                       pair<PlaylistSet::iterator, bool> r = modified_playlists.insert (playlist);
+                       if (r.second) {
+                               playlist->clear_changes ();
+                       }
+
                        rv->region()->clear_changes ();
 
                        /*
@@ -1090,30 +1101,18 @@ RegionMoveDrag::finished_no_copy (
                        rv->drag_end ();
 
                        /* just change the model */
-
-                       boost::shared_ptr<Playlist> playlist = dest_rtv->playlist();
-
                        if (dest_rtv->view()->layer_display() == Stacked || dest_rtv->view()->layer_display() == Expanded) {
                                playlist->set_layer (rv->region(), dest_layer);
                        }
 
                        /* freeze playlist to avoid lots of relayering in the case of a multi-region drag */
 
-                       pair<PlaylistSet::iterator, bool> r = frozen_playlists.insert (playlist);
+                       r = frozen_playlists.insert (playlist);
 
                        if (r.second) {
                                playlist->freeze ();
                        }
 
-                       /* this movement may result in a crossfade being modified, so we need to get undo
-                          data from the playlist as well as the region.
-                       */
-
-                       r = modified_playlists.insert (playlist);
-                       if (r.second) {
-                               playlist->clear_changes ();
-                       }
-
                        rv->region()->set_position (where);
 
                        _editor->session()->add_command (new StatefulDiffCommand (rv->region()));
@@ -1789,9 +1788,10 @@ VideoTimeLineDrag::aborted (bool)
 
 TrimDrag::TrimDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool preserve_fade_anchor)
        : RegionDrag (e, i, p, v)
+       , _preserve_fade_anchor (preserve_fade_anchor)
+       , _jump_position_when_done (false)
 {
        DEBUG_TRACE (DEBUG::Drags, "New TrimDrag\n");
-       _preserve_fade_anchor = preserve_fade_anchor;
 }
 
 void
@@ -1828,6 +1828,10 @@ TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
                }
        }
 
+       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
+               _jump_position_when_done = true;
+       }
+
        switch (_operation) {
        case StartTrim:
                show_verbose_cursor_time (region_start);
@@ -1954,8 +1958,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
        case ContentsTrim:
                {
-                       frame_delta = (adjusted_current_frame(event) - last_pointer_frame());
-                       // frame_delta = (last_pointer_frame() - adjusted_current_frame(event));
+                       frame_delta = (last_pointer_frame() - adjusted_current_frame(event));
 
                        for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
                                i->view->move_contents (frame_delta);
@@ -2007,6 +2010,9 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
                                                ar->set_fade_in_length(new_length);
                                        }
                                }
+                               if (_jump_position_when_done) {
+                                       i->view->region()->set_position (i->initial_position);
+                               }
                        }
                } else if (_operation == EndTrim) {
                        for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
@@ -2024,6 +2030,9 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
                                                ar->set_fade_out_length(new_length);
                                        }
                                }
+                               if (_jump_position_when_done) {
+                                       i->view->region()->set_position (i->initial_end - i->view->region()->length());
+                               }
                        }
                }
 
@@ -2428,7 +2437,7 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
 
        _grab_zoom = _editor->samples_per_pixel;
 
-       framepos_t where = _editor->canvas_event_frame (event);
+       framepos_t where = _editor->canvas_event_sample (event);
 
        _editor->snap_to_with_modifier (where, event);
 
@@ -3331,7 +3340,7 @@ LineDrag::finished (GdkEvent* event, bool movement_occured)
                _line->end_drag (false, 0);
 
                if ((atv = dynamic_cast<AutomationTimeAxisView*>(_editor->clicked_axisview)) != 0) {
-                       framepos_t where = _editor->window_event_frame (event, 0, 0);
+                       framepos_t where = _editor->window_event_sample (event, 0, 0);
                        atv->add_automation_event (event, where, event->button.y, false);
                }
        }
@@ -3790,7 +3799,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
 
        framepos_t const pending_position = adjusted_current_frame (event);
 
-       if (pending_position == last_pointer_frame()) {
+       if (_operation != CreateSelection && pending_position == last_pointer_frame()) {
                return;
        }
 
@@ -3912,9 +3921,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move)
                break;
        }
 
-       if (event->button.x >= _editor->horizontal_position() + _editor->_visible_canvas_width) {
-               _editor->start_canvas_autoscroll (1, 0);
-       }
+       _editor->maybe_autoscroll (true, false, false);
 
        if (start != end) {
                switch (_operation) {
@@ -4103,9 +4110,7 @@ RangeMarkerBarDrag::motion (GdkEvent* event, bool first_move)
                }
        }
 
-       if (event->button.x >= _editor->horizontal_position() + _editor->_visible_canvas_width) {
-               _editor->start_canvas_autoscroll (1, 0);
-       }
+       _editor->maybe_autoscroll (true, false, false);
 
        if (start != end) {
                _editor->temp_location->set (start, end);
@@ -4898,7 +4903,7 @@ NoteCreateDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
        double const y = sv->note_to_y (sv->y_to_note (y_to_region (event->button.y)));
 
        _drag_rect->set (ArdourCanvas::Rect (x, y, x, y + floor (_region_view->midi_stream_view()->note_height ())));
-       _drag_rect->set_outline_what (0xff);
+       _drag_rect->set_outline_all ();
        _drag_rect->set_outline_color (0xffffff99);
        _drag_rect->set_fill_color (0xffffff66);
 }