[Summary] Just adding comment for better code-maintaining.
[ardour.git] / gtk2_ardour / midi_region_view.cc
index 2fa8f4a3cdbf5c2f948c190515ffe66b68bb5567..47e5510664991640a478817f41e9bd8feac063a2 100644 (file)
@@ -2624,22 +2624,25 @@ MidiRegionView::note_dropped(NoteBase *, frameoffset_t dt, int8_t dnote)
 }
 
 /** @param x Pixel relative to the region position.
+ *  @param ensure_snap defaults to false. true = snap always, ignoring snap mode and magnetic snap.
+ *  Used for inverting the snap logic with key modifiers and snap delta calculation.
  *  @return Snapped frame relative to the region position.
  */
 framepos_t
-MidiRegionView::snap_pixel_to_sample(double x, bool explicitly)
+MidiRegionView::snap_pixel_to_sample(double x, bool ensure_snap)
 {
        PublicEditor& editor (trackview.editor());
-       return snap_frame_to_frame (editor.pixel_to_sample (x), explicitly);
+       return snap_frame_to_frame (editor.pixel_to_sample (x), ensure_snap);
 }
 
 /** @param x Pixel relative to the region position.
+ *  @param ensure_snap defaults to false. true = ignore magnetic snap and snap mode (used for snap delta calculation).
  *  @return Snapped pixel relative to the region position.
  */
 double
-MidiRegionView::snap_to_pixel(double x, bool explicitly)
+MidiRegionView::snap_to_pixel(double x, bool ensure_snap)
 {
-       return (double) trackview.editor().sample_to_pixel(snap_pixel_to_sample(x, explicitly));
+       return (double) trackview.editor().sample_to_pixel(snap_pixel_to_sample(x, ensure_snap));
 }
 
 double
@@ -2745,9 +2748,10 @@ MidiRegionView::begin_resizing (bool /*at_front*/)
  * amount of the drag.  In non-relative mode, all selected notes are set to have the same start or end point
  * as the \a primary note.
  * @param snap_delta snap offset of the primary note in pixels. used in SnapRelative SnapDelta mode.
+ * @param with_snap true if snap is to be used to determine the position, false if no snap is to be used.
  */
 void
-MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta)
+MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
 {
        bool cursor_set = false;
 
@@ -2780,38 +2784,47 @@ MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_
                }
 
                if (at_front) {
-                       resize_rect->set_x0 (snap_to_pixel(current_x) - snap_delta);
+                       if (with_snap) {
+                               resize_rect->set_x0 (snap_to_pixel(current_x) - snap_delta);
+                       } else {
+                               resize_rect->set_x0 (current_x - snap_delta);
+                       }
                        resize_rect->set_x1 (canvas_note->x1());
                } else {
-                       resize_rect->set_x1 (snap_to_pixel(current_x) - snap_delta);
+                       if (with_snap) {
+                               resize_rect->set_x1 (snap_to_pixel(current_x) - snap_delta);
+                       } else {
+                               resize_rect->set_x1 (current_x - snap_delta);
+                       }
                        resize_rect->set_x0 (canvas_note->x0());
                }
 
                if (!cursor_set) {
-                       /* snap delta is in pixels (sigh) */
-                       framepos_t delta_samps = trackview.editor().pixel_to_sample (snap_delta);
-                       double delta_beats;
+                       /* Convert snap delta from pixels to beats. */
+                       framepos_t snap_delta_samps = trackview.editor().pixel_to_sample (snap_delta);
+                       double snap_delta_beats = 0.0;
                        int sign = 1;
+
                        /* negative beat offsets aren't allowed */
-                       if (delta_samps > 0) {
-                               delta_beats = region_frames_to_region_beats_double (delta_samps);
-                       } else if (delta_samps < 0) {
-                               delta_beats = region_frames_to_region_beats_double ( - delta_samps);
+                       if (snap_delta_samps > 0) {
+                               snap_delta_beats = region_frames_to_region_beats_double (snap_delta_samps);
+                       } else if (snap_delta_samps < 0) {
+                               snap_delta_beats = region_frames_to_region_beats_double ( - snap_delta_samps);
                                sign = -1;
                        }
 
-                       const double  snapped_x = snap_pixel_to_sample (current_x);
+                       const double  snapped_x = (with_snap ? snap_pixel_to_sample (current_x) : trackview.editor ().pixel_to_sample (current_x));
                        Evoral::Beats beats     = region_frames_to_region_beats (snapped_x);
                        Evoral::Beats len       = Evoral::Beats();
 
                        if (at_front) {
                                if (beats < canvas_note->note()->end_time()) {
-                                       len = canvas_note->note()->time() - beats + (sign * delta_beats);
+                                       len = canvas_note->note()->time() - beats + (sign * snap_delta_beats);
                                        len += canvas_note->note()->length();
                                }
                        } else {
                                if (beats >= canvas_note->note()->time()) {
-                                       len = beats - canvas_note->note()->time() - (sign * delta_beats);
+                                       len = beats - canvas_note->note()->time() - (sign * snap_delta_beats);
                                }
                        }
 
@@ -2832,9 +2845,10 @@ MidiRegionView::update_resizing (NoteBase* primary, bool at_front, double delta_
  *  Parameters the same as for \a update_resizing().
  */
 void
-MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta)
+MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_x, bool relative, double snap_delta, bool with_snap)
 {
        _note_diff_command = _model->new_note_diff_command (_("resize notes"));
+
        for (std::vector<NoteResizeData *>::iterator i = _resize_data.begin(); i != _resize_data.end(); ++i) {
                Note*  canvas_note = (*i)->note;
                ArdourCanvas::Rectangle*  resize_rect = (*i)->resize_rect;
@@ -2865,25 +2879,33 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_
                if (current_x > trackview.editor().sample_to_pixel(_region->length())) {
                        current_x = trackview.editor().sample_to_pixel(_region->length());
                }
-               framepos_t delta_samps = trackview.editor().pixel_to_sample (snap_delta);
-               double delta_beats;
+
+               /* Convert snap delta from pixels to beats with sign. */
+               framepos_t snap_delta_samps = trackview.editor().pixel_to_sample (snap_delta);
+               double snap_delta_beats = 0.0;
                int sign = 1;
-               if (delta_samps > 0) {
-                       delta_beats = region_frames_to_region_beats_double (delta_samps);
-               } else if (delta_samps < 0) {
-                       delta_beats = region_frames_to_region_beats_double ( - delta_samps);
+
+               if (snap_delta_samps > 0) {
+                       snap_delta_beats = region_frames_to_region_beats_double (snap_delta_samps);
+               } else if (snap_delta_samps < 0) {
+                       snap_delta_beats = region_frames_to_region_beats_double ( - snap_delta_samps);
                        sign = -1;
                }
 
-               /* Convert that to a frame within the source */
-               framepos_t current_fr = snap_pixel_to_sample (current_x) + _region->start ();
+               /* Convert the new x position to a frame within the source */
+               framepos_t current_fr;
+               if (with_snap) {
+                       current_fr = snap_pixel_to_sample (current_x) + _region->start ();
+               } else {
+                       current_fr = trackview.editor().pixel_to_sample (current_x) + _region->start ();
+               }
 
                /* and then to beats */
                const Evoral::Beats x_beats = region_frames_to_region_beats (current_fr);
-               if (at_front && x_beats < canvas_note->note()->end_time()) {
-                       note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::StartTime, x_beats - (sign * delta_beats));
 
-                       Evoral::Beats len = canvas_note->note()->time() - x_beats + (sign * delta_beats);
+               if (at_front && x_beats < canvas_note->note()->end_time()) {
+                       note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::StartTime, x_beats - (sign * snap_delta_beats));
+                       Evoral::Beats len = canvas_note->note()->time() - x_beats + (sign * snap_delta_beats);
                        len += canvas_note->note()->length();
 
                        if (!!len) {
@@ -2892,8 +2914,8 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_
                }
 
                if (!at_front) {
-                       const Evoral::Beats len = std::max(Evoral::Beats(1 / 512.0),
-                                                          x_beats - canvas_note->note()->time() - (sign * delta_beats));
+                       Evoral::Beats len = std::max(Evoral::Beats(1 / 512.0),
+                                                    x_beats - canvas_note->note()->time() - (sign * snap_delta_beats));
                        note_diff_add_change (canvas_note, MidiModel::NoteDiffCommand::Length, len);
                }