From af35e50810162bd6397046bc4da6d42bf87e7b70 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Fri, 30 Nov 2012 15:07:35 -0800 Subject: [PATCH] Also move karaoke markers after the dragged marker if Ctrl is held down. Closes #1557. --- aegisub/src/audio_timing_karaoke.cpp | 48 +++++++++++++++++++--------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/aegisub/src/audio_timing_karaoke.cpp b/aegisub/src/audio_timing_karaoke.cpp index 2c6ba4fab..846a6ded5 100644 --- a/aegisub/src/audio_timing_karaoke.cpp +++ b/aegisub/src/audio_timing_karaoke.cpp @@ -38,6 +38,9 @@ #include #endif +#include +#include + /// @class KaraokeMarker /// @brief AudioMarker implementation for AudioTimingControllerKaraoke class KaraokeMarker : public AudioMarker { @@ -344,22 +347,28 @@ void AudioTimingControllerKaraoke::ModifyStart(int delta) { bool AudioTimingControllerKaraoke::IsNearbyMarker(int ms, int sensitivity) const { TimeRange range(ms - sensitivity, ms + sensitivity); - - for (auto const& marker : markers) - if (range.contains(marker)) - return true; - - return false; + return any_of(markers.begin(), markers.end(), [&](KaraokeMarker const& km) { + return range.contains(km); + }); } -std::vector AudioTimingControllerKaraoke::OnLeftClick(int ms, bool, int sensitivity, int) { +template +static std::vector copy_ptrs(In &vec, size_t start, size_t end) { + std::vector ret; + ret.reserve(end - start); + for (; start < end; ++start) + ret.push_back(&vec[start]); + return ret; +} + +std::vector AudioTimingControllerKaraoke::OnLeftClick(int ms, bool ctrl_down, int sensitivity, int) { TimeRange range(ms - sensitivity, ms + sensitivity); size_t syl = distance(markers.begin(), lower_bound(markers.begin(), markers.end(), ms)); if (syl < markers.size() && range.contains(markers[syl])) - return std::vector(1, &markers[syl]); + return copy_ptrs(markers, syl, ctrl_down ? markers.size() : syl + 1); if (syl > 0 && range.contains(markers[syl - 1])) - return std::vector(1, &markers[syl - 1]); + return copy_ptrs(markers, syl - 1, ctrl_down ? markers.size() : syl); cur_syl = syl; @@ -419,13 +428,22 @@ void AudioTimingControllerKaraoke::AnnounceChanges(int syl) { } void AudioTimingControllerKaraoke::OnMarkerDrag(std::vector const& m, int new_position, int) { - assert(m.size() == 1); - AnnounceChanges(MoveMarker(static_cast(m[0]), new_position)); + int old_position = m[0]->GetPosition(); + int syl = MoveMarker(static_cast(m[0]), new_position); + if (syl < 0) return; + + if (m.size() > 1) { + int delta = m[0]->GetPosition() - old_position; + for (AudioMarker *marker : m | boost::adaptors::sliced(1, m.size())) + MoveMarker(static_cast(marker), marker->GetPosition() + delta); + syl = cur_syl; + } + + AnnounceChanges(syl); } void AudioTimingControllerKaraoke::GetLabels(TimeRange const& range, std::vector &out) const { - for (auto const& label : labels) { - if (range.overlaps(label.range)) - out.push_back(label); - } + push_back(out, labels | boost::adaptors::filtered([&](AudioLabel const& l) { + return range.overlaps(l.range); + })); }