From d451cf3e9c84464fca61d6f4fae68e92ecd5fb97 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Tue, 10 Jan 2012 01:16:39 +0000 Subject: [PATCH] Add option to show the previous and next inactive lines in the audio display in addition to previous, all or none. Updates #1386. Originally committed to SVN as r6260. --- aegisub/src/audio_timing_dialogue.cpp | 54 +++++++++++++++++---------- aegisub/src/preferences.cpp | 4 +- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp index 77647a920..c44e8482a 100644 --- a/aegisub/src/audio_timing_dialogue.cpp +++ b/aegisub/src/audio_timing_dialogue.cpp @@ -192,6 +192,10 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele /// Regenerate markers for inactive lines void RegenerateInactiveLines(); + /// Add the inactive line markers for a single line + /// @param line Line to add markers for. May be NULL. + void AddInactiveMarkers(AssDialogue *line); + /// @brief Set the position of a marker and announce the change to the world /// @param marker Marker to move /// @param sample New position of the marker @@ -552,39 +556,38 @@ void AudioTimingControllerDialogue::SetMarker(AudioMarkerDialogueTiming *marker, void AudioTimingControllerDialogue::RegenerateInactiveLines() { - switch (inactive_line_mode->GetInt()) + switch (int mode = inactive_line_mode->GetInt()) { - case 1: // Preview line only + case 1: // Previous line only + case 2: // Previous and next lines inactive_markers.clear(); if (AssDialogue *line = context->selectionController->GetActiveLine()) { - std::list::iterator it = find(context->ass->Line.begin(), context->ass->Line.end(), line); - while (--it != context->ass->Line.begin() && !dynamic_cast(*it)) ; - if (AssDialogue *prev = dynamic_cast(*it)) + std::list::iterator current_line = + find(context->ass->Line.begin(), context->ass->Line.end(), line); + + std::list::iterator prev = current_line; + while (--prev != context->ass->Line.begin() && !dynamic_cast(*prev)) ; + AddInactiveMarkers(dynamic_cast(*prev)); + + if (mode == 2) { - inactive_markers.push_back(InactiveLineMarker( - context->audioController->SamplesFromMilliseconds(prev->Start), true)); - inactive_markers.push_back(InactiveLineMarker( - context->audioController->SamplesFromMilliseconds(prev->End), false)); + std::list::iterator next = + find_if(++current_line, context->ass->Line.end(), cast()); + if (next != context->ass->Line.end()) + AddInactiveMarkers(dynamic_cast(*next)); } } break; - case 2: // All inactive lines + case 3: // All inactive lines { inactive_markers.clear(); AssDialogue *active_line = context->selectionController->GetActiveLine(); for (std::list::const_iterator it = context->ass->Line.begin(); it != context->ass->Line.end(); ++it) { - AssDialogue *line = dynamic_cast(*it); - if (line && line != active_line) - { - inactive_markers.push_back(InactiveLineMarker( - context->audioController->SamplesFromMilliseconds(line->Start), true)); - inactive_markers.push_back(InactiveLineMarker( - context->audioController->SamplesFromMilliseconds(line->End), false)); - } + if (*it != active_line) + AddInactiveMarkers(dynamic_cast(*it)); } - sort(inactive_markers.begin(), inactive_markers.end()); break; } default: @@ -592,6 +595,8 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines() return; inactive_markers.clear(); } + + sort(inactive_markers.begin(), inactive_markers.end()); AnnounceUpdatedStyleRanges(); } @@ -619,3 +624,14 @@ int64_t AudioTimingControllerDialogue::SnapPosition(int64_t position, int64_t sn return snap_marker->GetPosition(); return position; } + +void AudioTimingControllerDialogue::AddInactiveMarkers(AssDialogue *line) +{ + if (line) + { + inactive_markers.push_back(InactiveLineMarker( + context->audioController->SamplesFromMilliseconds(line->Start), true)); + inactive_markers.push_back(InactiveLineMarker( + context->audioController->SamplesFromMilliseconds(line->End), false)); + } +} diff --git a/aegisub/src/preferences.cpp b/aegisub/src/preferences.cpp index 82cc380a9..020c2bf31 100644 --- a/aegisub/src/preferences.cpp +++ b/aegisub/src/preferences.cpp @@ -152,8 +152,8 @@ Audio::Audio(wxTreebook *book, Preferences *parent): OptionPage(book, parent, _( OptionAdd(general, _("Default lead-in length"), "Audio/Lead/IN", 0, 36000); OptionAdd(general, _("Default lead-out length"), "Audio/Lead/OUT", 0, 36000); - const wxString dtl_arr[3] = { _("Don't show"), _("Show previous"), _("Show all") }; - wxArrayString choice_dtl(3, dtl_arr); + const wxString dtl_arr[] = { _("Don't show"), _("Show previous"), _("Show previous and next"), _("Show all") }; + wxArrayString choice_dtl(4, dtl_arr); OptionChoice(general, _("Show inactive lines"), choice_dtl, "Audio/Inactive Lines Display Mode"); OptionAdd(general, _("Start-marker drag sensitivity"), "Audio/Start Drag Sensitivity", 1, 15); OptionAdd(general, _("Line boundry thickness"), "Audio/Line Boundaries Thickness", 1, 5);