diff --git a/aegisub/src/audio_display.cpp b/aegisub/src/audio_display.cpp index 77182d41f..99c659051 100644 --- a/aegisub/src/audio_display.cpp +++ b/aegisub/src/audio_display.cpp @@ -1326,7 +1326,7 @@ void AudioDisplay::Redraw(int64_t sample_start, int64_t sample_end) if (sample_end >= 0 && sample_start <= GetClientSize().GetWidth()) { - RefreshRect(wxRect(sample_start, audio_top, sample_end, audio_height), false); + RefreshRect(wxRect(sample_start, audio_top, sample_end - sample_start, audio_height), false); } } diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp index c44e8482a..0b3e05293 100644 --- a/aegisub/src/audio_timing_dialogue.cpp +++ b/aegisub/src/audio_timing_dialogue.cpp @@ -173,10 +173,12 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele /// Autocommit option const agi::OptionValue *auto_commit; const agi::OptionValue *inactive_line_mode; + const agi::OptionValue *inactive_line_comments; agi::signal::Connection commit_connection; agi::signal::Connection audio_open_connection; agi::signal::Connection inactive_line_mode_connection; + agi::signal::Connection inactive_line_comment_connection; /// Get the leftmost of the markers AudioMarkerDialogueTiming *GetLeftMarker(); @@ -298,9 +300,11 @@ AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c) , context(c) , auto_commit(OPT_GET("Audio/Auto/Commit")) , inactive_line_mode(OPT_GET("Audio/Inactive Lines Display Mode")) +, inactive_line_comments(OPT_GET("Audio/Display/Draw/Inactive Comments")) , commit_connection(c->ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this)) , audio_open_connection(c->audioController->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, this)) , inactive_line_mode_connection(OPT_SUB("Audio/Inactive Lines Display Mode", &AudioTimingControllerDialogue::RegenerateInactiveLines, this)) +, inactive_line_comment_connection(OPT_SUB("Audio/Display/Draw/Inactive Comments", &AudioTimingControllerDialogue::RegenerateInactiveLines, this)) { assert(c->audioController != 0); @@ -310,7 +314,6 @@ AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c) keyframes_provider.AddMarkerMovedListener(std::tr1::bind(std::tr1::ref(AnnounceMarkerMoved))); Revert(); - RegenerateInactiveLines(); } @@ -365,7 +368,6 @@ void AudioTimingControllerDialogue::OnActiveLineChanged(AssDialogue *new_line) if (context->audioController->IsAudioOpen()) { Revert(); - RegenerateInactiveLines(); } } @@ -378,7 +380,6 @@ void AudioTimingControllerDialogue::OnFileChanged(int type) { if (type & AssFile::COMMIT_DIAG_TIME) { Revert(); - RegenerateInactiveLines(); } else if (type & AssFile::COMMIT_DIAG_ADDREM) { @@ -480,9 +481,12 @@ void AudioTimingControllerDialogue::Revert() active_markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(line->Start)); active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(line->End)); timing_modified = false; - UpdateSelection(); + AnnounceUpdatedPrimaryRange(); + if (inactive_line_mode->GetInt() == 0) + AnnounceUpdatedStyleRanges; } } + RegenerateInactiveLines(); } bool AudioTimingControllerDialogue::IsNearbyMarker(int64_t sample, int sensitivity) const @@ -554,8 +558,22 @@ void AudioTimingControllerDialogue::SetMarker(AudioMarkerDialogueTiming *marker, UpdateSelection(); } +static bool noncomment_dialogue(AssEntry *e) +{ + if (AssDialogue *diag = dynamic_cast(e)) + return !diag->Comment; + return false; +} + +static bool dialogue(AssEntry *e) +{ + return !!dynamic_cast(e); +} + void AudioTimingControllerDialogue::RegenerateInactiveLines() { + bool (*predicate)(AssEntry*) = inactive_line_comments->GetBool() ? dialogue : noncomment_dialogue; + switch (int mode = inactive_line_mode->GetInt()) { case 1: // Previous line only @@ -567,15 +585,15 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines() 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)); + while (--prev != context->ass->Line.begin() && !predicate(*prev)) ; + AddInactiveMarkers(static_cast(*prev)); if (mode == 2) { std::list::iterator next = - find_if(++current_line, context->ass->Line.end(), cast()); + find_if(++current_line, context->ass->Line.end(), predicate); if (next != context->ass->Line.end()) - AddInactiveMarkers(dynamic_cast(*next)); + AddInactiveMarkers(static_cast(*next)); } } break; @@ -585,8 +603,8 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines() AssDialogue *active_line = context->selectionController->GetActiveLine(); for (std::list::const_iterator it = context->ass->Line.begin(); it != context->ass->Line.end(); ++it) { - if (*it != active_line) - AddInactiveMarkers(dynamic_cast(*it)); + if (*it != active_line && predicate(*it)) + AddInactiveMarkers(static_cast(*it)); } break; } @@ -627,11 +645,8 @@ int64_t AudioTimingControllerDialogue::SnapPosition(int64_t position, int64_t sn 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)); - } + 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/libresrc/default_config.json b/aegisub/src/libresrc/default_config.json index 2b4250f98..16cc52467 100644 --- a/aegisub/src/libresrc/default_config.json +++ b/aegisub/src/libresrc/default_config.json @@ -37,6 +37,7 @@ "Display" : { "Draw" : { "Cursor Time" : true, + "Inactive Comments" : true, "Keyframes in Dialogue Mode" : true, "Keyframes in Karaoke Mode" : true, "Selection Background" : true, diff --git a/aegisub/src/preferences.cpp b/aegisub/src/preferences.cpp index 020c2bf31..50f1d295f 100644 --- a/aegisub/src/preferences.cpp +++ b/aegisub/src/preferences.cpp @@ -152,13 +152,16 @@ 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[] = { _("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); OptionAdd(general, _("Maximum snap distance"), "Audio/Snap/Distance", 0, 25); + 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"); + CellSkip(general); + OptionAdd(general, _("Include comments in inactive lines"), "Audio/Display/Draw/Inactive Comments"); + wxFlexGridSizer *display = PageSizer(_("Display Visual Options")); OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background"); OptionAdd(display, _("Cursor time"), "Audio/Display/Draw/Cursor Time");