From 7867aa9f306aa39e1de9c7b3555d26d3be81b9ad Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Thu, 1 Sep 2011 06:16:07 +0000 Subject: [PATCH] Add function to calculate the end time for a subtitle line. Originally committed to SVN as r5581. --- aegisub/src/frame_main.cpp | 2 ++ aegisub/src/frame_main.h | 3 +++ aegisub/src/frame_main_events.cpp | 8 ++++++++ aegisub/src/subs_grid.cpp | 22 ++++++++++++++++++++++ aegisub/src/subs_grid.h | 2 ++ 5 files changed, 37 insertions(+) diff --git a/aegisub/src/frame_main.cpp b/aegisub/src/frame_main.cpp index 48e932984..a380c8ee7 100644 --- a/aegisub/src/frame_main.cpp +++ b/aegisub/src/frame_main.cpp @@ -409,6 +409,8 @@ void FrameMain::InitMenu() { AppendBitmapMenuItem(timingMenu,Menu_Subs_Snap_End_To_Video, MakeHotkeyText(_("Snap End to Video"), _T("Set End to Video")), _("Set end of selected subtitles to current video frame"), wxBITMAP(subend_to_video)); AppendBitmapMenuItem(timingMenu,Menu_Video_Snap_To_Scene, MakeHotkeyText(_("Snap to Scene"), _T("Snap to Scene")), _("Set start and end of subtitles to the keyframes around current video frame"), wxBITMAP(snap_subs_to_scene)); AppendBitmapMenuItem(timingMenu,Menu_Video_Shift_To_Frame, MakeHotkeyText(_("Shift to Current Frame"), _T("Shift by Current Time")), _("Shift selection so first selected line starts at current frame"), wxBITMAP(shift_to_frame)); + timingMenu->Append(Menu_Subs_Calculate_End_Time, _("Calculate End Time for Frame(s)"), _("Calculate end time based on reading speed of 14 chars per second")); + timingMenu->AppendSeparator(); wxMenu *ContinuousMenu = new wxMenu; wxMenuItem *ContinuousParent = new wxMenuItem(subtitlesMenu,-1,_("Make Times Continuous"),_T(""),wxITEM_NORMAL,ContinuousMenu); diff --git a/aegisub/src/frame_main.h b/aegisub/src/frame_main.h index cfa3687db..d58cee314 100644 --- a/aegisub/src/frame_main.h +++ b/aegisub/src/frame_main.h @@ -226,6 +226,8 @@ private: void OnOpenKanjiTimer (wxCommandEvent &event); void OnOpenVideoDetails (wxCommandEvent &event); void OnOpenASSDraw (wxCommandEvent &event); + + void OnCalculateEndTime (wxCommandEvent &event); void OnOpenOptions (wxCommandEvent &event); void OnOpenLog (wxCommandEvent &event); @@ -415,6 +417,7 @@ enum { Menu_Subs_Snap_End_To_Video, Menu_Subs_Snap_Video_To_Start, Menu_Subs_Snap_Video_To_End, + Menu_Subs_Calculate_End_Time, Menu_Video_Snap_To_Scene, Menu_Video_Shift_To_Frame, diff --git a/aegisub/src/frame_main_events.cpp b/aegisub/src/frame_main_events.cpp index ccdc0bbe3..3dfb94b62 100644 --- a/aegisub/src/frame_main_events.cpp +++ b/aegisub/src/frame_main_events.cpp @@ -191,6 +191,7 @@ BEGIN_EVENT_TABLE(FrameMain, wxFrame) EVT_MENU(Menu_Subs_Snap_End_To_Video, FrameMain::OnSnapSubsEndToVid) EVT_MENU(Menu_Subs_Snap_Video_To_Start, FrameMain::OnSnapVidToSubsStart) EVT_MENU(Menu_Subs_Snap_Video_To_End, FrameMain::OnSnapVidToSubsEnd) + EVT_MENU(Menu_Subs_Calculate_End_Time, FrameMain::OnCalculateEndTime) EVT_MENU(Menu_Video_Snap_To_Scene, FrameMain::OnSnapToScene) EVT_MENU(Menu_Video_Shift_To_Frame, FrameMain::OnShiftToFrame) @@ -1205,6 +1206,13 @@ void FrameMain::OnSnapVidToSubsEnd (wxCommandEvent &event) { } } +/// @brief Handler for menu event to calculate the end times of subtitles +/// @param event +/// +void FrameMain::OnCalculateEndTime (wxCommandEvent &event) { + if (SubsBox) + SubsBox->CalculateEndTimeForLines(SubsBox->GetSelection()); +} ///////////////// // Snap to scene diff --git a/aegisub/src/subs_grid.cpp b/aegisub/src/subs_grid.cpp index bd8b8d0a3..35ec5b0cc 100644 --- a/aegisub/src/subs_grid.cpp +++ b/aegisub/src/subs_grid.cpp @@ -1024,6 +1024,28 @@ void SubtitlesGrid::PasteLines(int n,bool pasteOver) { EndBatch(); } +/// @brief Calculate the end time for a given set of subtitle strings +/// @param lines +/// +void SubtitlesGrid::CalculateEndTimeForLines(wxArrayInt lines) +{ + AssDialogue *cur; + int nrows = lines.Count(); + float charsPerSecond = 14.0; + for (int i=0;iStart.GetMS(); + wxString text = cur->GetStrippedText(); + float seconds = (float)text.Length() / charsPerSecond; + int lenms = seconds * 1000; + // make sure very short subtitles stay on for at least a second + if (lenms < 1000) + lenms = 1000; + cur->End.SetMS(start + lenms); + } + CommitChanges(); +} ///////////////////////// // Delete selected lines diff --git a/aegisub/src/subs_grid.h b/aegisub/src/subs_grid.h index f93e9f321..242e2ba0a 100644 --- a/aegisub/src/subs_grid.h +++ b/aegisub/src/subs_grid.h @@ -133,6 +133,8 @@ public: void CopyLines(wxArrayInt lines); void CutLines(wxArrayInt lines); void PasteLines(int pos,bool over=false); + + void CalculateEndTimeForLines(wxArrayInt lines); std::vector GetAbsoluteSelection(); void SetSelectionFromAbsolute(std::vector &selection);