From 99a65974e47c587d37c8ce6e61c5e0c078761ebc Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Fri, 27 Apr 2012 19:07:07 +0000 Subject: [PATCH] Move the Next Line on Commit logic to the commit command so that other commands can do different things Originally committed to SVN as r6718. --- aegisub/src/audio_timing.h | 24 ++++++++++++--- aegisub/src/audio_timing_dialogue.cpp | 43 ++++++++++++++------------- aegisub/src/audio_timing_karaoke.cpp | 17 ++++------- aegisub/src/command/audio.cpp | 6 +++- aegisub/src/command/time.cpp | 2 +- 5 files changed, 54 insertions(+), 38 deletions(-) diff --git a/aegisub/src/audio_timing.h b/aegisub/src/audio_timing.h index f140a569d..68e1eca00 100644 --- a/aegisub/src/audio_timing.h +++ b/aegisub/src/audio_timing.h @@ -82,11 +82,27 @@ public: /// @param[out] ranges Rendering ranges will be added to this virtual void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const = 0; + enum NextMode { + /// Advance to the next timing unit, whether it's a line or a sub-part + /// of a line such as a karaoke syllable + TIMING_UNIT = 0, + + /// @brief Advance to the next line + /// + /// This may create a new line if there are no more lines in the file, + /// but should never modify existing lines + LINE, + + /// @brief Advance to the next line using default timing + /// + /// This may create new lines when needed, and should discard any + /// existing timing data in favor of the defaults + LINE_RESET_DEFAULT + }; + /// @brief Go to next timing unit - /// - /// Advances the timing controller cursor to the next timing unit, for - /// example the next dialogue line or the next karaoke syllable. - virtual void Next() = 0; + /// @param mode What sort of timing unit should be advanced to + virtual void Next(NextMode mode) = 0; /// @brief Go to the previous timing unit /// diff --git a/aegisub/src/audio_timing_dialogue.cpp b/aegisub/src/audio_timing_dialogue.cpp index a27992109..cd9dfd8b1 100644 --- a/aegisub/src/audio_timing_dialogue.cpp +++ b/aegisub/src/audio_timing_dialogue.cpp @@ -382,7 +382,7 @@ public: TimeRange GetPrimaryPlaybackRange() const; void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const; void GetLabels(TimeRange const& range, std::vector &out) const { } - void Next(); + void Next(NextMode mode); void Prev(); void Commit(); void Revert(); @@ -495,9 +495,28 @@ void AudioTimingControllerDialogue::GetRenderingStyles(AudioRenderingStyleRanges bind(&TimeableLine::GetStyleRange, std::tr1::placeholders::_1, &ranges)); } -void AudioTimingControllerDialogue::Next() +void AudioTimingControllerDialogue::Next(NextMode mode) { - context->selectionController->NextLine(); + if (mode == TIMING_UNIT) + { + context->selectionController->NextLine(); + return; + } + + int new_end_ms = *active_line.GetRightMarker(); + + cmd::call("grid/line/next/create", context); + + if (mode == LINE_RESET_DEFAULT || *active_line.GetRightMarker() == 0) { + const int default_duration = OPT_GET("Timing/Default Duration")->GetInt(); + // Setting right first here so that they don't get switched and the + // same marker gets set twice + active_line.GetRightMarker()->SetPosition(new_end_ms + default_duration); + active_line.GetLeftMarker()->SetPosition(new_end_ms); + sort(markers.begin(), markers.end(), marker_ptr_cmp()); + modified_lines.insert(&active_line); + UpdateSelection(); + } } void AudioTimingControllerDialogue::Prev() @@ -533,24 +552,6 @@ void AudioTimingControllerDialogue::DoCommit(bool user_triggered) commit_connection.Unblock(); modified_lines.clear(); } - - if (user_triggered && OPT_GET("Audio/Next Line on Commit")->GetBool()) - { - int new_end_ms = *active_line.GetRightMarker(); - - cmd::call("grid/line/next/create", context); - - if (*active_line.GetRightMarker() == 0) { - const int default_duration = OPT_GET("Timing/Default Duration")->GetInt(); - // Setting right first here so that they don't get switched and the - // same marker gets set twice - active_line.GetRightMarker()->SetPosition(new_end_ms + default_duration); - active_line.GetLeftMarker()->SetPosition(new_end_ms); - sort(markers.begin(), markers.end(), marker_ptr_cmp()); - modified_lines.insert(&active_line); - UpdateSelection(); - } - } } void AudioTimingControllerDialogue::Revert() diff --git a/aegisub/src/audio_timing_karaoke.cpp b/aegisub/src/audio_timing_karaoke.cpp index 26ecbbb03..05713b7c5 100644 --- a/aegisub/src/audio_timing_karaoke.cpp +++ b/aegisub/src/audio_timing_karaoke.cpp @@ -108,11 +108,9 @@ class AudioTimingControllerKaraoke : public AudioTimingController { std::vector labels; bool auto_commit; ///< Should changes be automatically commited? - bool auto_next; ///< Should user-initiated commits automatically go to the next? int commit_id; ///< Last commit id used for an autocommit void OnAutoCommitChange(agi::OptionValue const& opt); - void OnAutoNextChange(agi::OptionValue const& opt); void DoCommit(); void ApplyLead(bool announce_primary); @@ -125,7 +123,7 @@ public: void GetRenderingStyles(AudioRenderingStyleRanges &ranges) const; TimeRange GetPrimaryPlaybackRange() const; void GetLabels(const TimeRange &range, std::vector &out_labels) const; - void Next(); + void Next(NextMode mode); void Prev(); void Commit(); void Revert(); @@ -158,12 +156,10 @@ AudioTimingControllerKaraoke::AudioTimingControllerKaraoke(agi::Context *c, AssK , keyframes_provider(c, "Audio/Display/Draw/Keyframes in Karaoke Mode") , video_position_provider(c) , auto_commit(OPT_GET("Audio/Auto/Commit")->GetBool()) -, auto_next(OPT_GET("Audio/Next Line on Commit")->GetBool()) , commit_id(-1) { slots.push_back(kara->AddSyllablesChangedListener(&AudioTimingControllerKaraoke::Revert, this)); slots.push_back(OPT_SUB("Audio/Auto/Commit", &AudioTimingControllerKaraoke::OnAutoCommitChange, this)); - slots.push_back(OPT_SUB("Audio/Next Line on Commit", &AudioTimingControllerKaraoke::OnAutoNextChange, this)); keyframes_provider.AddMarkerMovedListener(std::tr1::bind(std::tr1::ref(AnnounceMarkerMoved))); video_position_provider.AddMarkerMovedListener(std::tr1::bind(std::tr1::ref(AnnounceMarkerMoved))); @@ -176,11 +172,12 @@ void AudioTimingControllerKaraoke::OnAutoCommitChange(agi::OptionValue const& op auto_commit = opt.GetBool(); } -void AudioTimingControllerKaraoke::OnAutoNextChange(agi::OptionValue const& opt) { - auto_next = opt.GetBool(); -} +void AudioTimingControllerKaraoke::Next(NextMode mode) { + // Don't create new lines since it's almost never useful to k-time a line + // before dialogue timing it + if (mode != TIMING_UNIT) + cur_syl = markers.size(); -void AudioTimingControllerKaraoke::Next() { ++cur_syl; if (cur_syl > markers.size()) { --cur_syl; @@ -253,8 +250,6 @@ void AudioTimingControllerKaraoke::DoCommit() { void AudioTimingControllerKaraoke::Commit() { if (!auto_commit) DoCommit(); - if (auto_next) - c->selectionController->NextLine(); } void AudioTimingControllerKaraoke::Revert() { diff --git a/aegisub/src/command/audio.cpp b/aegisub/src/command/audio.cpp index 509ea2d00..561b19be8 100644 --- a/aegisub/src/command/audio.cpp +++ b/aegisub/src/command/audio.cpp @@ -339,7 +339,11 @@ struct audio_commit : public validate_audio_open { void operator()(agi::Context *c) { AudioTimingController *tc = c->audioController->GetTimingController(); - if (tc) tc->Commit(); + if (tc) { + tc->Commit(); + if(OPT_GET("Audio/Next Line on Commit")->GetBool()) + tc->Next(AudioTimingController::LINE); + } } }; diff --git a/aegisub/src/command/time.cpp b/aegisub/src/command/time.cpp index 2b934d5c6..795ea0f30 100644 --- a/aegisub/src/command/time.cpp +++ b/aegisub/src/command/time.cpp @@ -288,7 +288,7 @@ struct time_next : public Command { void operator()(agi::Context *c) { c->audioController->Stop(); if (c->audioController->GetTimingController()) - c->audioController->GetTimingController()->Next(); + c->audioController->GetTimingController()->Next(AudioTimingController::TIMING_UNIT); } };