@@ -110,6 +110,7 @@ class AudioTimingControllerKaraoke final : public AudioTimingController {
110
110
111
111
void DoCommit ();
112
112
void ApplyLead (bool announce_primary);
113
+ void UpdateLineTimes ();
113
114
int MoveMarker (KaraokeMarker *marker, int new_position);
114
115
void AnnounceChanges (int syl);
115
116
@@ -236,8 +237,10 @@ void AudioTimingControllerKaraoke::GetMarkers(TimeRange const& range, AudioMarke
236
237
237
238
void AudioTimingControllerKaraoke::DoCommit () {
238
239
active_line->Text = kara->GetText ();
240
+ active_line->Start = (int )start_marker;
241
+ active_line->End = (int )end_marker;
239
242
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);
241
244
file_changed_slot.Unblock ();
242
245
pending_changes = false ;
243
246
}
@@ -287,16 +290,24 @@ void AudioTimingControllerKaraoke::AddLeadOut() {
287
290
}
288
291
289
292
void AudioTimingControllerKaraoke::ApplyLead (bool announce_primary) {
290
- active_line->Start = (int )start_marker;
291
- active_line->End = (int )end_marker;
292
293
kara->SetLineTimes (start_marker, end_marker);
293
294
if (!announce_primary)
294
295
AnnounceUpdatedStyleRanges ();
295
296
AnnounceChanges (announce_primary ? cur_syl : cur_syl + 2 );
296
297
}
297
298
299
+ void AudioTimingControllerKaraoke::UpdateLineTimes () {
300
+ kara->SetLineTimes (start_marker, end_marker);
301
+ AnnounceChanges (cur_syl);
302
+ }
303
+
298
304
void 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
+ }
300
311
301
312
int cur, end, step;
302
313
if (delta < 0 ) {
@@ -317,7 +328,13 @@ void AudioTimingControllerKaraoke::ModifyLength(int delta, bool shift_following)
317
328
}
318
329
319
330
void 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
+
321
338
MoveMarker (&markers[cur_syl - 1 ], markers[cur_syl - 1 ] + delta * 10 );
322
339
AnnounceChanges (cur_syl);
323
340
}
@@ -326,7 +343,7 @@ bool AudioTimingControllerKaraoke::IsNearbyMarker(int ms, int sensitivity, bool)
326
343
TimeRange range (ms - sensitivity, ms + sensitivity);
327
344
return any_of (markers.begin (), markers.end (), [&](KaraokeMarker const & km) {
328
345
return range.contains (km);
329
- });
346
+ }) || range. contains (start_marker) || range. contains (end_marker) ;
330
347
}
331
348
332
349
template <typename Out, typename In>
@@ -347,6 +364,11 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnLeftClick(int ms, bool
347
364
if (syl > 0 && range.contains (markers[syl - 1 ]))
348
365
return copy_ptrs<AudioMarker>(markers, syl - 1 , ctrl_down ? markers.size () : syl);
349
366
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
+
350
372
cur_syl = syl;
351
373
352
374
AnnounceUpdatedPrimaryRange ();
@@ -366,6 +388,20 @@ std::vector<AudioMarker*> AudioTimingControllerKaraoke::OnRightClick(int ms, boo
366
388
}
367
389
368
390
int 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
+
369
405
// No rearranging of syllables allowed
370
406
new_position = mid (
371
407
marker == &markers.front () ? start_marker.GetPosition () : (marker - 1 )->GetPosition (),
0 commit comments