diff --git a/src/ui/Features/Main/SubtitleLineViewModel.cs b/src/ui/Features/Main/SubtitleLineViewModel.cs index 3c1ebd2d6fd..c337b1da735 100644 --- a/src/ui/Features/Main/SubtitleLineViewModel.cs +++ b/src/ui/Features/Main/SubtitleLineViewModel.cs @@ -595,6 +595,24 @@ internal void SetStartTimeOnly(TimeSpan timeSpan) UpdateDuration(); } + /// + /// Sets start and end time together without ever publishing an invalid + /// intermediate state (e.g. start > end / negative duration). Updating + /// the two times separately can briefly expose such a state to the live + /// editor controls bound to the selected line; the duration up/down clamps + /// the negative value and writes it back, corrupting the end time. Suppress + /// notifications while both values are assigned, then recompute duration once. + /// + internal void SetTimes(TimeSpan startTime, TimeSpan endTime) + { + _skipUpdate = true; + StartTime = startTime; + EndTime = endTime; + _skipUpdate = false; + + UpdateDuration(); + } + internal void Adjust(double factor, double adjustmentInSeconds) { if (StartTime.IsMaxTime()) diff --git a/src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs b/src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs index 99f08d7c99b..3a7051ab156 100644 --- a/src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs +++ b/src/ui/Features/Sync/ChangeFrameRate/ChangeFrameRateViewModel.cs @@ -157,8 +157,9 @@ internal static void ChangeFrameRate(ObservableCollection double ratio = fromFrameRate / toFrameRate; foreach (var line in subtitles) { - line.SetStartTimeOnly(TimeSpan.FromMilliseconds(line.StartTime.TotalMilliseconds * ratio)); - line.EndTime = TimeSpan.FromMilliseconds(line.EndTime.TotalMilliseconds * ratio); + line.SetTimes( + TimeSpan.FromMilliseconds(line.StartTime.TotalMilliseconds * ratio), + TimeSpan.FromMilliseconds(line.EndTime.TotalMilliseconds * ratio)); } } } \ No newline at end of file diff --git a/src/ui/Features/Sync/ChangeSpeed/ChangeSpeedViewModel.cs b/src/ui/Features/Sync/ChangeSpeed/ChangeSpeedViewModel.cs index e85664fc642..a09df7c792e 100644 --- a/src/ui/Features/Sync/ChangeSpeed/ChangeSpeedViewModel.cs +++ b/src/ui/Features/Sync/ChangeSpeed/ChangeSpeedViewModel.cs @@ -86,8 +86,10 @@ internal static void ChangeSpeed(ObservableCollection sub { foreach (var subtitle in subtitles) { - subtitle.SetStartTimeOnly(TimeSpan.FromMilliseconds(subtitle.StartTime.TotalMilliseconds * (100.0 / speedPercent))); - subtitle.EndTime = TimeSpan.FromMilliseconds(subtitle.EndTime.TotalMilliseconds * (100.0 / speedPercent)); + var factor = 100.0 / speedPercent; + subtitle.SetTimes( + TimeSpan.FromMilliseconds(subtitle.StartTime.TotalMilliseconds * factor), + TimeSpan.FromMilliseconds(subtitle.EndTime.TotalMilliseconds * factor)); } } } \ No newline at end of file