More cleanup
[ardour.git] / gtk2_ardour / editor_drag.cc
index cf1f8007b9ea5e4f12fd9abfb043b2aa7823052c..3f08a8c75054ae87f6f62ccea399c714d2588485 100644 (file)
@@ -337,13 +337,13 @@ Drag::adjusted_current_frame (GdkEvent const * event, bool snap) const
 }
 
 frameoffset_t
-Drag::snap_delta (GdkEvent const * event) const
+Drag::snap_delta (guint state) const
 {
-       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::snap_delta_modifier())) {
+       if (ArdourKeyboard::indicates_snap_delta (state)) {
                return 0;
-       } else {
-               return _snap_delta;
        }
+
+       return _snap_delta;
 }
 
 double
@@ -366,7 +366,7 @@ void
 Drag::setup_snap_delta (framepos_t pos)
 {
        framepos_t temp = pos;
-       _editor->snap_to_no_magnets (temp);
+       _editor->snap_to (temp, ARDOUR::RoundNearest, false, true);
        _snap_delta = temp - pos;
 }
 
@@ -401,21 +401,25 @@ Drag::motion_handler (GdkEvent* event, bool from_autoscroll)
                                /* just changed */
 
                                if (fabs (current_pointer_y() - _grab_y) > fabs (current_pointer_x() - _grab_x)) {
-                                       if ((event->motion.state & Gdk::BUTTON2_MASK) || Config->get_edit_mode() == Constrained) {
+                                       if ((event->motion.state & Gdk::BUTTON2_MASK) && Config->get_edit_mode() != Lock) {
                                                _x_constrained = true;
                                                _y_constrained = false;
                                        }
                                        _initially_vertical = true;
                                } else {
-                                       if ((event->motion.state & Gdk::BUTTON2_MASK) || Config->get_edit_mode() == Constrained) {
+                                       if ((event->motion.state & Gdk::BUTTON2_MASK) && Config->get_edit_mode() != Lock) {
                                                _x_constrained = false;
                                                _y_constrained = true;
                                        }
                                        _initially_vertical = false;
                                }
 
-                               if ((event->motion.state & Gdk::BUTTON2_MASK) && Config->get_edit_mode() == Constrained) {
-                                       _x_constrained = false;
+                               if (Config->get_edit_mode() == Lock) {
+                                       if (event->button.state & Gdk::BUTTON2_MASK) {
+                                               _x_constrained = false;
+                                       } else {
+                                               _x_constrained = true;
+                                       }
                                        _y_constrained = false;
                                }
                        }
@@ -608,7 +612,7 @@ RegionMotionDrag::compute_x_delta (GdkEvent const * event, framepos_t* pending_r
        /* compute the amount of pointer motion in frames, and where
           the region would be if we moved it by that much.
        */
-       *pending_region_position = adjusted_frame (_drags->current_pointer_frame () + snap_delta (event), event, true);
+       *pending_region_position = adjusted_frame (_drags->current_pointer_frame () + snap_delta (event->button.state), event, true);
 
        framepos_t sync_frame;
        framecnt_t sync_offset;
@@ -624,7 +628,7 @@ RegionMotionDrag::compute_x_delta (GdkEvent const * event, framepos_t* pending_r
 
                _editor->snap_to_with_modifier (sync_frame, event);
 
-               *pending_region_position = _primary->region()->adjust_to_sync (sync_frame) - snap_delta (event);
+               *pending_region_position = _primary->region()->adjust_to_sync (sync_frame) - snap_delta (event->button.state);
 
        } else {
                *pending_region_position = _last_frame_position;
@@ -635,7 +639,8 @@ RegionMotionDrag::compute_x_delta (GdkEvent const * event, framepos_t* pending_r
        }
 
        double dx = 0;
-       bool x_move_allowed = !_x_constrained;
+
+       bool const x_move_allowed = !_x_constrained;
 
        if ((*pending_region_position != _last_frame_position) && x_move_allowed) {
 
@@ -2342,12 +2347,12 @@ NoteResizeDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*ignored*/)
        region = &cnote->region_view();
 
        double temp;
-       temp = region->snap_to_pixel_no_magnets (cnote->x0 ());
+       temp = region->snap_to_pixel (cnote->x0 (), true);
        _snap_delta = temp - cnote->x0 ();
 
        _item->grab ();
 
-       if (event->motion.state & Keyboard::PrimaryModifier) {
+       if (event->motion.state & ArdourKeyboard::note_size_relative_modifier ()) {
                relative = false;
        } else {
                relative = true;
@@ -2389,7 +2394,7 @@ NoteResizeDrag::motion (GdkEvent* event, bool /*first_move*/)
                MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r);
                if (mrv) {
                        double sd = 0.0;
-                       if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
+                       if (!ArdourKeyboard::indicates_snap_delta (event->button.state)) {
                                sd = _snap_delta;
                        }
                        mrv->update_resizing (nb, at_front, _drags->current_pointer_x() - grab_x(), relative, sd);
@@ -2406,7 +2411,7 @@ NoteResizeDrag::finished (GdkEvent* event, bool /*movement_occurred*/)
                assert (nb);
                MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*r);
                double sd = 0.0;
-               if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
+               if (!ArdourKeyboard::indicates_snap_delta (event->button.state)) {
                        sd = _snap_delta;
                }
                if (mrv) {
@@ -2587,6 +2592,7 @@ 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");
 }
@@ -2609,7 +2615,7 @@ TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
        framepos_t const pf = adjusted_current_frame (event);
        setup_snap_delta (region_start);
 
-       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::SecondaryModifier)) {
+       if (Keyboard::modifier_state_equals (event->button.state, ArdourKeyboard::trim_contents_modifier ())) {
                /* Move the contents of the region around without changing the region bounds */
                _operation = ContentsTrim;
                Drag::start_grab (event, _editor->cursors()->trimmer);
@@ -2618,7 +2624,7 @@ TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
                if (pf < (region_start + region_length/2)) {
                        /* closer to front */
                        _operation = StartTrim;
-                       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+                       if (Keyboard::modifier_state_equals (event->button.state, ArdourKeyboard::trim_anchored_modifier ())) {
                                Drag::start_grab (event, _editor->cursors()->anchored_left_side_trim);
                        } else {
                                Drag::start_grab (event, _editor->cursors()->left_side_trim);
@@ -2626,13 +2632,18 @@ TrimDrag::start_grab (GdkEvent* event, Gdk::Cursor*)
                } else {
                        /* closer to end */
                        _operation = EndTrim;
-                       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+                       if (Keyboard::modifier_state_equals (event->button.state, ArdourKeyboard::trim_anchored_modifier ())) {
                                Drag::start_grab (event, _editor->cursors()->anchored_right_side_trim);
                        } else {
                                Drag::start_grab (event, _editor->cursors()->right_side_trim);
                        }
                }
        }
+       /* jump trim disabled for now
+       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::trim_jump_modifier ())) {
+               _jump_position_when_done = true;
+       }
+       */
 
        switch (_operation) {
        case StartTrim:
@@ -2668,8 +2679,8 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
        if (tv && tv->is_track()) {
                speed = tv->track()->speed();
        }
-       framecnt_t adj_frame = adjusted_frame (_drags->current_pointer_frame () + snap_delta (event), event, true);
-       framecnt_t dt = adj_frame - raw_grab_frame () + _pointer_frame_offset - snap_delta (event);
+       framecnt_t adj_frame = adjusted_frame (_drags->current_pointer_frame () + snap_delta (event->button.state), event, true);
+       framecnt_t dt = adj_frame - raw_grab_frame () + _pointer_frame_offset - snap_delta (event->button.state);
 
        if (first_move) {
 
@@ -2715,7 +2726,7 @@ TrimDrag::motion (GdkEvent* event, bool first_move)
 
        bool non_overlap_trim = false;
 
-       if (event && Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier))) {
+       if (event && Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::trim_overlap_modifier ())) {
                non_overlap_trim = true;
        }
 
@@ -2833,6 +2844,9 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
                                                ar->set_fade_in_active(true);
                                        }
                                }
+                               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) {
@@ -2845,6 +2859,9 @@ TrimDrag::finished (GdkEvent* event, bool movement_occurred)
                                                ar->set_fade_out_active(true);
                                        }
                                }
+                               if (_jump_position_when_done) {
+                                       i->view->region()->set_position (i->initial_end - i->view->region()->length());
+                               }
                        }
                }
 
@@ -3250,7 +3267,7 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
 
        _grab_zoom = _editor->samples_per_pixel;
 
-       framepos_t where = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t where = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
 
        _editor->snap_to_with_modifier (where, event);
 
@@ -3288,16 +3305,16 @@ CursorDrag::start_grab (GdkEvent* event, Gdk::Cursor* c)
                }
        }
 
-       fake_locate (where - snap_delta (event));
+       fake_locate (where - snap_delta (event->button.state));
 }
 
 void
 CursorDrag::motion (GdkEvent* event, bool)
 {
-       framepos_t where = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t where = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (where, event);
        if (where != last_pointer_frame()) {
-               fake_locate (where - snap_delta (event));
+               fake_locate (where - snap_delta (event->button.state));
        }
 }
 
@@ -3366,9 +3383,9 @@ FadeInDrag::motion (GdkEvent* event, bool)
 {
        framecnt_t fade_length;
 
-       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (pos, event);
-       pos -= snap_delta (event);
+       pos -= snap_delta (event->button.state);
 
        boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
@@ -3402,9 +3419,9 @@ FadeInDrag::finished (GdkEvent* event, bool movement_occurred)
        }
 
        framecnt_t fade_length;
-       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (pos, event);
-       pos -= snap_delta (event);
+       pos -= snap_delta (event->button.state);
 
        boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
@@ -3484,9 +3501,9 @@ FadeOutDrag::motion (GdkEvent* event, bool)
 {
        framecnt_t fade_length;
 
-       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (pos, event);
-       pos -= snap_delta (event);
+       pos -= snap_delta (event->button.state);
 
        boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
@@ -3521,9 +3538,9 @@ FadeOutDrag::finished (GdkEvent* event, bool movement_occurred)
 
        framecnt_t fade_length;
 
-       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t pos = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (pos, event);
-       pos -= snap_delta (event);
+       pos -= snap_delta (event->button.state);
 
        boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
@@ -3719,7 +3736,7 @@ MarkerDrag::motion (GdkEvent* event, bool)
        framepos_t const newframe = adjusted_current_frame (event);
        framepos_t next = newframe;
 
-       if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
+       if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::push_points_modifier ())) {
                move_both = true;
        }
 
@@ -3986,7 +4003,7 @@ ControlPointDrag::start_grab (GdkEvent* event, Gdk::Cursor* /*cursor*/)
 
        show_verbose_cursor_text (_point->line().get_verbose_cursor_string (fraction));
 
-       _pushing = Keyboard::modifier_state_contains (event->button.state, Keyboard::PrimaryModifier);
+       _pushing = Keyboard::modifier_state_equals (event->button.state, ArdourKeyboard::push_points_modifier ());
 
        if (!_point->can_slide ()) {
                _x_constrained = true;
@@ -3999,7 +4016,7 @@ ControlPointDrag::motion (GdkEvent* event, bool)
        double dx = _drags->current_pointer_x() - last_pointer_x();
        double dy = current_pointer_y() - last_pointer_y();
 
-       if (event->button.state & Keyboard::SecondaryModifier) {
+       if (event->button.state & ArdourKeyboard::fine_adjust_modifier ()) {
                dx *= 0.1;
                dy *= 0.1;
        }
@@ -4032,13 +4049,13 @@ ControlPointDrag::motion (GdkEvent* event, bool)
        cy = max (0.0, cy);
        cy = min ((double) _point->line().height(), cy);
 
-       framepos_t cx_frames = _editor->pixel_to_sample (cx) + snap_delta (event);
+       framepos_t cx_frames = _editor->pixel_to_sample (cx) + snap_delta (event->button.state);
 
        if (!_x_constrained) {
                _editor->snap_to_with_modifier (cx_frames, event);
        }
 
-       cx_frames -= snap_delta (event);
+       cx_frames -= snap_delta (event->button.state);
        cx_frames = min (cx_frames, _point->line().maximum_time());
 
        float const fraction = 1.0 - (cy / _point->line().height());
@@ -4054,7 +4071,7 @@ ControlPointDrag::finished (GdkEvent* event, bool movement_occurred)
        if (!movement_occurred) {
 
                /* just a click */
-               if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::PrimaryModifier | Keyboard::TertiaryModifier))) {
+               if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::TertiaryModifier))) {
                        _editor->reset_point_selection ();
                }
 
@@ -4138,7 +4155,7 @@ LineDrag::motion (GdkEvent* event, bool)
 {
        double dy = current_pointer_y() - last_pointer_y();
 
-       if (event->button.state & Keyboard::SecondaryModifier) {
+       if (event->button.state & ArdourKeyboard::fine_adjust_modifier ()) {
                dy *= 0.1;
        }
 
@@ -4464,9 +4481,9 @@ TimeFXDrag::motion (GdkEvent* event, bool)
        pair<TimeAxisView*, double> const tv = _editor->trackview_by_y_position (grab_y());
        int layer = tv.first->layer_display() == Overlaid ? 0 : tv.second;
        int layers = tv.first->layer_display() == Overlaid ? 1 : cv->layers();
-       framepos_t pf = _editor->canvas_event_sample (event) + snap_delta (event);
+       framepos_t pf = _editor->canvas_event_sample (event) + snap_delta (event->button.state);
        _editor->snap_to_with_modifier (pf, event);
-       pf -= snap_delta (event);
+       pf -= snap_delta (event->button.state);
 
        if (pf > rv->region()->position()) {
                rv->get_time_axis_view().show_timestretch (rv->region()->position(), pf, layers, layer);
@@ -4930,7 +4947,7 @@ RangeMarkerBarDrag::start_grab (GdkEvent* event, Gdk::Cursor *)
        case CreateTransportMarker:
        case CreateCDMarker:
 
-               if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
+               if (Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)) {
                        _copy = true;
                } else {
                        _copy = false;
@@ -5188,7 +5205,7 @@ NoteDrag::total_dx (GdkEvent const * event) const
        frameoffset_t const n = _region->source_beats_to_absolute_frames (_primary->note()->time ());
 
        /* new time of the primary note in session frames */
-       frameoffset_t st = n + dx + snap_delta (event);
+       frameoffset_t st = n + dx + snap_delta (event->button.state);
 
        framepos_t const rp = _region->region()->position ();
 
@@ -5196,7 +5213,7 @@ NoteDrag::total_dx (GdkEvent const * event) const
        st = max (st, rp);
 
        /* snap and return corresponding delta */
-       return _region->snap_frame_to_frame (st - rp) + rp - n - snap_delta (event);
+       return _region->snap_frame_to_frame (st - rp) + rp - n - snap_delta (event->button.state);
 }
 
 /** @return Current total drag y change in note number */