diff --git a/aegisub/src/audio_display.cpp b/aegisub/src/audio_display.cpp index bacb4672c..4c7e5fb26 100644 --- a/aegisub/src/audio_display.cpp +++ b/aegisub/src/audio_display.cpp @@ -508,32 +508,11 @@ public: { if (event.Dragging()) { - int64_t sample_pos = display->SamplesFromRelativeX(event.GetPosition().x); - - if (marker->CanSnap() && (default_snap != event.ShiftDown())) - { - SampleRange snap_sample_range( - display->SamplesFromRelativeX(event.GetPosition().x - snap_range), - display->SamplesFromRelativeX(event.GetPosition().x + snap_range)); - const AudioMarker *snap_marker = 0; - AudioMarkerVector potential_snaps; - controller->GetMarkers(snap_sample_range, potential_snaps); - for (AudioMarkerVector::iterator mi = potential_snaps.begin(); mi != potential_snaps.end(); ++mi) - { - if (*mi != marker && (*mi)->CanSnap()) - { - if (!snap_marker) - snap_marker = *mi; - else if (tabs((*mi)->GetPosition() - sample_pos) < tabs(snap_marker->GetPosition() - sample_pos)) - snap_marker = *mi; - } - } - - if (snap_marker) - sample_pos = snap_marker->GetPosition(); - } - - timing_controller->OnMarkerDrag(marker, sample_pos); + timing_controller->OnMarkerDrag( + marker, + display->SamplesFromRelativeX(event.GetPosition().x), + default_snap != event.ShiftDown(), + display->SamplesFromAbsoluteX(snap_range)); } // We lose the marker drag if the button used to initiate it goes up diff --git a/aegisub/src/audio_timing.h b/aegisub/src/audio_timing.h index 4f5a42817..094262171 100644 --- a/aegisub/src/audio_timing.h +++ b/aegisub/src/audio_timing.h @@ -141,7 +141,9 @@ public: /// @brief The user dragged a timing marker /// @param marker The marker being dragged /// @param new_position Sample position the marker was dragged to - virtual void OnMarkerDrag(AudioMarker *marker, int64_t new_position) = 0; + /// @param snap Enable snapping to other markers + /// @param snap_range Maximum snapping range in samples + virtual void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range) = 0; /// @brief Destructor virtual ~AudioTimingController() { } diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp index 679e17960..410093644 100644 --- a/aegisub/src/audio_timing_dialogue.cpp +++ b/aegisub/src/audio_timing_dialogue.cpp @@ -222,7 +222,7 @@ public: bool IsNearbyMarker(int64_t sample, int sensitivity) const; AudioMarker * OnLeftClick(int64_t sample, int sensitivity); AudioMarker * OnRightClick(int64_t sample, int sensitivity); - void OnMarkerDrag(AudioMarker *marker, int64_t new_position); + void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range); public: // Specific interface @@ -522,9 +522,30 @@ AudioMarker * AudioTimingControllerDialogue::OnRightClick(int64_t sample, int se return right; } -void AudioTimingControllerDialogue::OnMarkerDrag(AudioMarker *marker, int64_t new_position) +void AudioTimingControllerDialogue::OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool snap, int64_t snap_range) { assert(marker == &active_markers[0] || marker == &active_markers[1]); + + if (snap) + { + SampleRange snap_sample_range(new_position - snap_range, new_position + snap_range); + const AudioMarker *snap_marker = 0; + AudioMarkerVector potential_snaps; + GetMarkers(snap_sample_range, potential_snaps); + for (AudioMarkerVector::iterator mi = potential_snaps.begin(); mi != potential_snaps.end(); ++mi) + { + if (*mi != marker && (*mi)->CanSnap()) + { + if (!snap_marker) + snap_marker = *mi; + else if (tabs((*mi)->GetPosition() - new_position) < tabs(snap_marker->GetPosition() - new_position)) + snap_marker = *mi; + } + } + + if (snap_marker) + new_position = snap_marker->GetPosition(); + } SetMarker(static_cast(marker), new_position); } diff --git a/aegisub/src/audio_timing_karaoke.cpp b/aegisub/src/audio_timing_karaoke.cpp index 9fe981866..42d507136 100644 --- a/aegisub/src/audio_timing_karaoke.cpp +++ b/aegisub/src/audio_timing_karaoke.cpp @@ -132,7 +132,7 @@ public: bool IsNearbyMarker(int64_t sample, int sensitivity) const; AudioMarker * OnLeftClick(int64_t sample, int sensitivity); AudioMarker * OnRightClick(int64_t sample, int sensitivity) { return 0; } - void OnMarkerDrag(AudioMarker *marker, int64_t new_position); + void OnMarkerDrag(AudioMarker *marker, int64_t new_position, bool, int64_t); AudioTimingControllerKaraoke(agi::Context *c, AssKaraoke *kara, agi::signal::Connection& file_changed); }; @@ -301,7 +301,7 @@ AudioMarker *AudioTimingControllerKaraoke::OnLeftClick(int64_t sample, int sensi return 0; } -void AudioTimingControllerKaraoke::OnMarkerDrag(AudioMarker *m, int64_t new_position) { +void AudioTimingControllerKaraoke::OnMarkerDrag(AudioMarker *m, int64_t new_position, bool, int64_t) { KaraokeMarker *marker = static_cast(m); // No rearranging of syllables allowed new_position = mid(