@@ -110,6 +110,7 @@ class AudioTimingControllerKaraoke final : public AudioTimingController {
110110
111111 void DoCommit ();
112112 void ApplyLead (bool announce_primary);
113+ void UpdateLineTimes ();
113114 int MoveMarker (KaraokeMarker *marker, int new_position);
114115 void AnnounceChanges (int syl);
115116
@@ -236,8 +237,10 @@ void AudioTimingControllerKaraoke::GetMarkers(TimeRange const& range, AudioMarke
236237
237238void AudioTimingControllerKaraoke::DoCommit () {
238239 active_line->Text = kara->GetText ();
240+ active_line->Start = (int )start_marker;
241+ active_line->End = (int )end_marker;
239242 file_changed_slot.Block ();
240- commit_id = c->ass ->Commit (_ (" karaoke timing" ), AssFile::COMMIT_DIAG_TEXT, commit_id, active_line);
243+ commit_id = c->ass ->Commit (_ (" karaoke timing" ), AssFile::COMMIT_DIAG_TEXT | AssFile::COMMIT_DIAG_TIME , commit_id, active_line);
241244 file_changed_slot.Unblock ();
242245 pending_changes = false ;
243246}
@@ -287,16 +290,24 @@ void AudioTimingControllerKaraoke::AddLeadOut() {
287290}
288291
289292void AudioTimingControllerKaraoke::ApplyLead (bool announce_primary) {
290- active_line->Start = (int )start_marker;
291- active_line->End = (int )end_marker;
292293 kara->SetLineTimes (start_marker, end_marker);
293294 if (!announce_primary)
294295 AnnounceUpdatedStyleRanges ();
295296 AnnounceChanges (announce_primary ? cur_syl : cur_syl + 2 );
296297}
297298
299+ void AudioTimingControllerKaraoke::UpdateLineTimes () {
300+ kara->SetLineTimes (start_marker, end_marker);
301+ AnnounceChanges (cur_syl);
302+ }
303+
298304void AudioTimingControllerKaraoke::ModifyLength (int delta, bool shift_following) {
299- if (cur_syl == markers.size ()) return ;
305+ if (cur_syl == markers.size ()) {
306+ end_marker.Move (end_marker + delta);
307+ labels.back ().range = TimeRange (labels.back ().range .begin (), end_marker);
308+ UpdateLineTimes ();
309+ return ;
310+ }
300311
301312 int cur, end, step;
302313 if (delta < 0 ) {
@@ -317,7 +328,13 @@ void AudioTimingControllerKaraoke::ModifyLength(int delta, bool shift_following)
317328}
318329
319330void AudioTimingControllerKaraoke::ModifyStart (int delta) {
320- if (cur_syl == 0 ) return ;
331+ if (cur_syl == 0 ) {
332+ start_marker.Move (start_marker + delta);
333+ labels.front ().range = TimeRange (start_marker, labels.front ().range .end ());
334+ UpdateLineTimes ();
335+ return ;
336+ }
337+
321338 MoveMarker (&markers[cur_syl - 1 ], markers[cur_syl - 1 ] + delta * 10 );
322339 AnnounceChanges (cur_syl);
323340}
@@ -326,7 +343,7 @@ bool AudioTimingControllerKaraoke::IsNearbyMarker(int ms, int sensitivity, bool)
326343 TimeRange range (ms - sensitivity, ms + sensitivity);
327344 return any_of (markers.begin (), markers.end (), [&](KaraokeMarker const & km) {
328345 return range.contains (km);
329- });
346+ }) || range. contains (start_marker) || range. contains (end_marker) ;
330347}
331348
332349template <typename Out, typename In>
@@ -347,6 +364,11 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnLeftClick(int ms, bool
347364 if (syl > 0 && range.contains (markers[syl - 1 ]))
348365 return copy_ptrs<AudioMarker>(markers, syl - 1 , ctrl_down ? markers.size () : syl);
349366
367+ if (syl == 0 && range.contains (start_marker))
368+ return std::vector<AudioMarker*> {&start_marker};
369+ if (syl == markers.size () && range.contains (end_marker))
370+ return std::vector<AudioMarker*> {&end_marker};
371+
350372 cur_syl = syl;
351373
352374 AnnounceUpdatedPrimaryRange ();
@@ -366,6 +388,20 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnRightClick(int ms, boo
366388}
367389
368390int AudioTimingControllerKaraoke::MoveMarker (KaraokeMarker *marker, int new_position) {
391+ if (marker == &start_marker) {
392+ start_marker.Move (new_position);
393+ labels.front ().range = TimeRange (start_marker, labels.front ().range .end ());
394+ UpdateLineTimes ();
395+ return -1 ;
396+ }
397+
398+ if (marker == &end_marker) {
399+ end_marker.Move (new_position);
400+ labels.back ().range = TimeRange (labels.back ().range .begin (), end_marker);
401+ UpdateLineTimes ();
402+ return -1 ;
403+ }
404+
369405 // No rearranging of syllables allowed
370406 new_position = mid (
371407 marker == &markers.front () ? start_marker.GetPosition () : (marker - 1 )->GetPosition (),
0 commit comments