Add option to only show non-comment inactive dialogue lines in the audio display. Closes #1386.

Originally committed to SVN as r6264.
This commit is contained in:
Thomas Goyne 2012-01-10 20:03:31 +00:00
parent 5cd47a8a88
commit 237193a4bb
4 changed files with 40 additions and 21 deletions

View file

@ -1326,7 +1326,7 @@ void AudioDisplay::Redraw(int64_t sample_start, int64_t sample_end)
if (sample_end >= 0 && sample_start <= GetClientSize().GetWidth()) 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);
} }
} }

View file

@ -173,10 +173,12 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele
/// Autocommit option /// Autocommit option
const agi::OptionValue *auto_commit; const agi::OptionValue *auto_commit;
const agi::OptionValue *inactive_line_mode; const agi::OptionValue *inactive_line_mode;
const agi::OptionValue *inactive_line_comments;
agi::signal::Connection commit_connection; agi::signal::Connection commit_connection;
agi::signal::Connection audio_open_connection; agi::signal::Connection audio_open_connection;
agi::signal::Connection inactive_line_mode_connection; agi::signal::Connection inactive_line_mode_connection;
agi::signal::Connection inactive_line_comment_connection;
/// Get the leftmost of the markers /// Get the leftmost of the markers
AudioMarkerDialogueTiming *GetLeftMarker(); AudioMarkerDialogueTiming *GetLeftMarker();
@ -298,9 +300,11 @@ AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c)
, context(c) , context(c)
, auto_commit(OPT_GET("Audio/Auto/Commit")) , auto_commit(OPT_GET("Audio/Auto/Commit"))
, inactive_line_mode(OPT_GET("Audio/Inactive Lines Display Mode")) , 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)) , commit_connection(c->ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this))
, audio_open_connection(c->audioController->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, 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_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); assert(c->audioController != 0);
@ -310,7 +314,6 @@ AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c)
keyframes_provider.AddMarkerMovedListener(std::tr1::bind(std::tr1::ref(AnnounceMarkerMoved))); keyframes_provider.AddMarkerMovedListener(std::tr1::bind(std::tr1::ref(AnnounceMarkerMoved)));
Revert(); Revert();
RegenerateInactiveLines();
} }
@ -365,7 +368,6 @@ void AudioTimingControllerDialogue::OnActiveLineChanged(AssDialogue *new_line)
if (context->audioController->IsAudioOpen()) if (context->audioController->IsAudioOpen())
{ {
Revert(); Revert();
RegenerateInactiveLines();
} }
} }
@ -378,7 +380,6 @@ void AudioTimingControllerDialogue::OnFileChanged(int type) {
if (type & AssFile::COMMIT_DIAG_TIME) if (type & AssFile::COMMIT_DIAG_TIME)
{ {
Revert(); Revert();
RegenerateInactiveLines();
} }
else if (type & AssFile::COMMIT_DIAG_ADDREM) 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[0].SetPosition(context->audioController->SamplesFromMilliseconds(line->Start));
active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(line->End)); active_markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(line->End));
timing_modified = false; timing_modified = false;
UpdateSelection(); AnnounceUpdatedPrimaryRange();
if (inactive_line_mode->GetInt() == 0)
AnnounceUpdatedStyleRanges;
} }
} }
RegenerateInactiveLines();
} }
bool AudioTimingControllerDialogue::IsNearbyMarker(int64_t sample, int sensitivity) const bool AudioTimingControllerDialogue::IsNearbyMarker(int64_t sample, int sensitivity) const
@ -554,8 +558,22 @@ void AudioTimingControllerDialogue::SetMarker(AudioMarkerDialogueTiming *marker,
UpdateSelection(); UpdateSelection();
} }
static bool noncomment_dialogue(AssEntry *e)
{
if (AssDialogue *diag = dynamic_cast<AssDialogue*>(e))
return !diag->Comment;
return false;
}
static bool dialogue(AssEntry *e)
{
return !!dynamic_cast<AssDialogue*>(e);
}
void AudioTimingControllerDialogue::RegenerateInactiveLines() void AudioTimingControllerDialogue::RegenerateInactiveLines()
{ {
bool (*predicate)(AssEntry*) = inactive_line_comments->GetBool() ? dialogue : noncomment_dialogue;
switch (int mode = inactive_line_mode->GetInt()) switch (int mode = inactive_line_mode->GetInt())
{ {
case 1: // Previous line only case 1: // Previous line only
@ -567,15 +585,15 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines()
find(context->ass->Line.begin(), context->ass->Line.end(), line); find(context->ass->Line.begin(), context->ass->Line.end(), line);
std::list<AssEntry*>::iterator prev = current_line; std::list<AssEntry*>::iterator prev = current_line;
while (--prev != context->ass->Line.begin() && !dynamic_cast<AssDialogue*>(*prev)) ; while (--prev != context->ass->Line.begin() && !predicate(*prev)) ;
AddInactiveMarkers(dynamic_cast<AssDialogue*>(*prev)); AddInactiveMarkers(static_cast<AssDialogue*>(*prev));
if (mode == 2) if (mode == 2)
{ {
std::list<AssEntry*>::iterator next = std::list<AssEntry*>::iterator next =
find_if(++current_line, context->ass->Line.end(), cast<AssDialogue*>()); find_if(++current_line, context->ass->Line.end(), predicate);
if (next != context->ass->Line.end()) if (next != context->ass->Line.end())
AddInactiveMarkers(dynamic_cast<AssDialogue*>(*next)); AddInactiveMarkers(static_cast<AssDialogue*>(*next));
} }
} }
break; break;
@ -585,8 +603,8 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines()
AssDialogue *active_line = context->selectionController->GetActiveLine(); AssDialogue *active_line = context->selectionController->GetActiveLine();
for (std::list<AssEntry*>::const_iterator it = context->ass->Line.begin(); it != context->ass->Line.end(); ++it) for (std::list<AssEntry*>::const_iterator it = context->ass->Line.begin(); it != context->ass->Line.end(); ++it)
{ {
if (*it != active_line) if (*it != active_line && predicate(*it))
AddInactiveMarkers(dynamic_cast<AssDialogue*>(*it)); AddInactiveMarkers(static_cast<AssDialogue*>(*it));
} }
break; break;
} }
@ -626,12 +644,9 @@ int64_t AudioTimingControllerDialogue::SnapPosition(int64_t position, int64_t sn
} }
void AudioTimingControllerDialogue::AddInactiveMarkers(AssDialogue *line) void AudioTimingControllerDialogue::AddInactiveMarkers(AssDialogue *line)
{
if (line)
{ {
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(line->Start), true)); context->audioController->SamplesFromMilliseconds(line->Start), true));
inactive_markers.push_back(InactiveLineMarker( inactive_markers.push_back(InactiveLineMarker(
context->audioController->SamplesFromMilliseconds(line->End), false)); context->audioController->SamplesFromMilliseconds(line->End), false));
} }
}

View file

@ -37,6 +37,7 @@
"Display" : { "Display" : {
"Draw" : { "Draw" : {
"Cursor Time" : true, "Cursor Time" : true,
"Inactive Comments" : true,
"Keyframes in Dialogue Mode" : true, "Keyframes in Dialogue Mode" : true,
"Keyframes in Karaoke Mode" : true, "Keyframes in Karaoke Mode" : true,
"Selection Background" : true, "Selection Background" : true,

View file

@ -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-in length"), "Audio/Lead/IN", 0, 36000);
OptionAdd(general, _("Default lead-out length"), "Audio/Lead/OUT", 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, _("Start-marker drag sensitivity"), "Audio/Start Drag Sensitivity", 1, 15);
OptionAdd(general, _("Line boundry thickness"), "Audio/Line Boundaries Thickness", 1, 5); OptionAdd(general, _("Line boundry thickness"), "Audio/Line Boundaries Thickness", 1, 5);
OptionAdd(general, _("Maximum snap distance"), "Audio/Snap/Distance", 0, 25); 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")); wxFlexGridSizer *display = PageSizer(_("Display Visual Options"));
OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background"); OptionAdd(display, _("Selection background"), "Audio/Display/Draw/Selection Background");
OptionAdd(display, _("Cursor time"), "Audio/Display/Draw/Cursor Time"); OptionAdd(display, _("Cursor time"), "Audio/Display/Draw/Cursor Time");