From e5707ca6eb12764e3208361b416c78fac09b78be Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Thu, 22 Dec 2011 21:30:22 +0000 Subject: [PATCH] Don't use the ms time value of the Duration time edit control when in frame mode, as with vfr this may not actually represent a consisten number of frames Originally committed to SVN as r6132. --- aegisub/src/subs_edit_box.cpp | 28 ++++++++++++++++++++-------- aegisub/src/timeedit_ctrl.cpp | 8 ++++++++ aegisub/src/timeedit_ctrl.h | 5 +++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/aegisub/src/subs_edit_box.cpp b/aegisub/src/subs_edit_box.cpp index 48492227c..9c125c476 100644 --- a/aegisub/src/subs_edit_box.cpp +++ b/aegisub/src/subs_edit_box.cpp @@ -363,7 +363,7 @@ void SubsEditBox::Update(int type) { if (type & AssFile::COMMIT_DIAG_TIME) { StartTime->SetTime(line->Start); EndTime->SetTime(line->End); - Duration->SetTime(line->End-line->Start); + Duration->SetTime(line->End - line->Start); } if (type & AssFile::COMMIT_DIAG_TEXT) { @@ -519,21 +519,30 @@ void SubsEditBox::CommitText(wxString desc) { } void SubsEditBox::CommitTimes(TimeField field) { - Duration->SetTime(EndTime->GetTime() - StartTime->GetTime()); + if (ByFrame->GetValue()) + Duration->SetFrame(EndTime->GetFrame() - StartTime->GetFrame() + 1); + else + Duration->SetTime(EndTime->GetTime() - StartTime->GetTime()); // Update lines for (Selection::iterator cur = sel.begin(); cur != sel.end(); ++cur) { + AssDialogue *d = *cur; switch (field) { case TIME_START: - (*cur)->Start = StartTime->GetTime(); - if ((*cur)->Start > (*cur)->End) (*cur)->End = (*cur)->Start; + d->Start = StartTime->GetTime(); + if (d->Start > d->End) + d->End = d->Start; break; case TIME_END: - (*cur)->End = EndTime->GetTime(); - if ((*cur)->Start > (*cur)->End) (*cur)->Start = (*cur)->End; + d->End = EndTime->GetTime(); + if (d->Start > d->End) + d->Start = d->End; break; case TIME_DURATION: - (*cur)->End = (*cur)->Start + Duration->GetTime(); + if (ByFrame->GetValue()) + d->End = c->videoController->TimeAtFrame(c->videoController->FrameAtTime(d->Start, agi::vfr::START) + Duration->GetFrame(), agi::vfr::END); + else + d->End = d->Start + Duration->GetTime(); break; } } @@ -643,7 +652,10 @@ void SubsEditBox::OnEndTimeChange(wxCommandEvent &) { } void SubsEditBox::OnDurationChange(wxCommandEvent &) { - EndTime->SetTime(StartTime->GetTime() + Duration->GetTime()); + if (ByFrame->GetValue()) + EndTime->SetFrame(StartTime->GetFrame() + Duration->GetFrame() - 1); + else + EndTime->SetTime(StartTime->GetTime() + Duration->GetTime()); CommitTimes(TIME_DURATION); } void SubsEditBox::OnMarginLChange(wxCommandEvent &) { diff --git a/aegisub/src/timeedit_ctrl.cpp b/aegisub/src/timeedit_ctrl.cpp index a99a9e44d..896e222f4 100644 --- a/aegisub/src/timeedit_ctrl.cpp +++ b/aegisub/src/timeedit_ctrl.cpp @@ -104,6 +104,14 @@ void TimeEdit::SetTime(AssTime new_time) { } } +int TimeEdit::GetFrame() const { + return c->videoController->FrameAtTime(time, isEnd ? agi::vfr::END : agi::vfr::START); +} + +void TimeEdit::SetFrame(int fn) { + SetTime(c->videoController->TimeAtFrame(fn, isEnd ? agi::vfr::END : agi::vfr::START)); +} + void TimeEdit::SetByFrame(bool enableByFrame) { if (enableByFrame == byFrame) return; diff --git a/aegisub/src/timeedit_ctrl.h b/aegisub/src/timeedit_ctrl.h index 1e4dd4cf2..af82eb74b 100644 --- a/aegisub/src/timeedit_ctrl.h +++ b/aegisub/src/timeedit_ctrl.h @@ -78,6 +78,11 @@ public: /// Set the time void SetTime(AssTime time); + /// Get the current time as a frame number, or 0 if timecodes are unavailable + int GetFrame() const; + /// Set the time to a frame number. Does nothing if timecodes are unavailable + void SetFrame(int fn); + /// Set whether the time is displayed as a time or the corresponding frame number /// @param enableByFrame If true, frame numbers are displayed void SetByFrame(bool enableByFrame);