Make AudioTimingControllerDialogue operate on a project context

Originally committed to SVN as r5616.
This commit is contained in:
Thomas Goyne 2011-09-28 19:44:44 +00:00
parent a25c5c1909
commit 156885b56d
3 changed files with 31 additions and 43 deletions

View File

@ -135,7 +135,7 @@ void AudioKaraoke::SetEnabled(bool en) {
accept_button->Enable(false); accept_button->Enable(false);
cancel_button->Enable(false); cancel_button->Enable(false);
enabled = false; enabled = false;
c->audioController->SetTimingController(CreateDialogueTimingController(c->audioController, c->selectionController, c->ass)); c->audioController->SetTimingController(CreateDialogueTimingController(c));
new_size = wxSize(-1, 0); new_size = wxSize(-1, 0);
} }

View File

@ -154,11 +154,8 @@ public:
/// @brief Create a standard dialogue audio timing controller /// @brief Create a standard dialogue audio timing controller
/// @param audio_controller The audio controller to own the timing controller /// @param c Project context
/// @param selection_controller The selection controller to manage the set of AudioTimingController *CreateDialogueTimingController(agi::Context *c);
/// lines being timed
/// @param ass The file being timed
AudioTimingController *CreateDialogueTimingController(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass);
/// @brief Create a karaoke audio timing controller /// @brief Create a karaoke audio timing controller
/// @param c Project context /// @param c Project context

View File

@ -44,6 +44,7 @@
#include "ass_time.h" #include "ass_time.h"
#include "audio_controller.h" #include "audio_controller.h"
#include "audio_timing.h" #include "audio_timing.h"
#include "include/aegisub/context.h"
#include "main.h" #include "main.h"
#include "selection_controller.h" #include "selection_controller.h"
#include "utils.h" #include "utils.h"
@ -132,8 +133,8 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele
AudioMarkerDialogueTiming *GetRightMarker(); AudioMarkerDialogueTiming *GetRightMarker();
const AudioMarkerDialogueTiming *GetRightMarker() const; const AudioMarkerDialogueTiming *GetRightMarker() const;
/// The owning audio controller /// The owning project context
AudioController *audio_controller; agi::Context *context;
/// Update the audio controller's selection /// Update the audio controller's selection
void UpdateSelection(); void UpdateSelection();
@ -146,17 +147,9 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele
/// Autocommit option /// Autocommit option
const agi::OptionValue *auto_commit; const agi::OptionValue *auto_commit;
/// Selection controller managing the set of lines currently being timed
SelectionController<AssDialogue> *selection_controller;
agi::signal::Connection commit_slot; agi::signal::Connection commit_slot;
agi::signal::Connection audio_open_slot; agi::signal::Connection audio_open_slot;
/// @todo Dealing with the AssFile directly is probably not the best way to
/// handle committing, but anything better probably needs to wait for
/// the subtitle container work
AssFile *ass;
// SubtitleSelectionListener interface // SubtitleSelectionListener interface
void OnActiveLineChanged(AssDialogue *new_line); void OnActiveLineChanged(AssDialogue *new_line);
void OnSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed); void OnSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed);
@ -187,15 +180,15 @@ public:
// Specific interface // Specific interface
/// @brief Constructor /// @brief Constructor
AudioTimingControllerDialogue(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass); AudioTimingControllerDialogue(agi::Context *c);
~AudioTimingControllerDialogue(); ~AudioTimingControllerDialogue();
}; };
AudioTimingController *CreateDialogueTimingController(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass) AudioTimingController *CreateDialogueTimingController(agi::Context *c)
{ {
return new AudioTimingControllerDialogue(audio_controller, selection_controller, ass); return new AudioTimingControllerDialogue(c);
} }
// AudioMarkerDialogueTiming // AudioMarkerDialogueTiming
@ -249,30 +242,28 @@ void AudioMarkerDialogueTiming::InitPair(AudioMarkerDialogueTiming *marker1, Aud
// AudioTimingControllerDialogue // AudioTimingControllerDialogue
AudioTimingControllerDialogue::AudioTimingControllerDialogue(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass) AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c)
: timing_modified(false) : timing_modified(false)
, commit_id(-1) , commit_id(-1)
, audio_controller(audio_controller) , context(c)
, auto_commit(OPT_GET("Audio/Auto/Commit")) , auto_commit(OPT_GET("Audio/Auto/Commit"))
, selection_controller(selection_controller)
, ass(ass)
{ {
assert(audio_controller != 0); assert(c->audioController != 0);
AudioMarkerDialogueTiming::InitPair(&markers[0], &markers[1]); AudioMarkerDialogueTiming::InitPair(&markers[0], &markers[1]);
if (audio_controller->IsAudioOpen()) if (c->audioController->IsAudioOpen())
Revert(); Revert();
selection_controller->AddSelectionListener(this); c->selectionController->AddSelectionListener(this);
commit_slot = ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this); commit_slot = c->ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this);
audio_open_slot = audio_controller->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, this); audio_open_slot = c->audioController->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, this);
} }
AudioTimingControllerDialogue::~AudioTimingControllerDialogue() AudioTimingControllerDialogue::~AudioTimingControllerDialogue()
{ {
selection_controller->RemoveSelectionListener(this); context->selectionController->RemoveSelectionListener(this);
} }
@ -309,7 +300,7 @@ void AudioTimingControllerDialogue::GetMarkers(const SampleRange &range, AudioMa
void AudioTimingControllerDialogue::OnActiveLineChanged(AssDialogue *new_line) void AudioTimingControllerDialogue::OnActiveLineChanged(AssDialogue *new_line)
{ {
if (audio_controller->IsAudioOpen()) if (context->audioController->IsAudioOpen())
Revert(); Revert();
} }
@ -352,22 +343,22 @@ SampleRange AudioTimingControllerDialogue::GetPrimaryPlaybackRange() const
void AudioTimingControllerDialogue::Next() void AudioTimingControllerDialogue::Next()
{ {
selection_controller->NextLine(); context->selectionController->NextLine();
} }
void AudioTimingControllerDialogue::Prev() void AudioTimingControllerDialogue::Prev()
{ {
selection_controller->PrevLine(); context->selectionController->PrevLine();
} }
void AudioTimingControllerDialogue::Commit() void AudioTimingControllerDialogue::Commit()
{ {
int new_start_ms = audio_controller->MillisecondsFromSamples(GetLeftMarker()->GetPosition()); int new_start_ms = context->audioController->MillisecondsFromSamples(GetLeftMarker()->GetPosition());
int new_end_ms = audio_controller->MillisecondsFromSamples(GetRightMarker()->GetPosition()); int new_end_ms = context->audioController->MillisecondsFromSamples(GetRightMarker()->GetPosition());
// If auto committing is enabled, timing_modified will be true iif it is an // If auto committing is enabled, timing_modified will be true iif it is an
// auto commit, as there is never pending changes to commit when the button // auto commit, as there is never pending changes to commit when the button
@ -378,7 +369,7 @@ void AudioTimingControllerDialogue::Commit()
if (timing_modified) if (timing_modified)
{ {
Selection sel; Selection sel;
selection_controller->GetSelectedSet(sel); context->selectionController->GetSelectedSet(sel);
for (Selection::iterator sub = sel.begin(); sub != sel.end(); ++sub) for (Selection::iterator sub = sel.begin(); sub != sel.end(); ++sub)
{ {
(*sub)->Start.SetMS(new_start_ms); (*sub)->Start.SetMS(new_start_ms);
@ -388,11 +379,11 @@ void AudioTimingControllerDialogue::Commit()
commit_slot.Block(); commit_slot.Block();
if (user_triggered) if (user_triggered)
{ {
ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME); context->ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME);
commit_id = -1; // never coalesce with a manually triggered commit commit_id = -1; // never coalesce with a manually triggered commit
} }
else else
commit_id = context->ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME, commit_id, selection_controller->GetActiveLine()); commit_id = context->ass->Commit(_("timing"), AssFile::COMMIT_DIAG_TIME, commit_id, context->selectionController->GetActiveLine());
commit_slot.Unblock(); commit_slot.Unblock();
timing_modified = false; timing_modified = false;
@ -404,10 +395,10 @@ void AudioTimingControllerDialogue::Commit()
/// like the edit box, so maybe add a way to do that which both /// like the edit box, so maybe add a way to do that which both
/// this and the edit box can use /// this and the edit box can use
Next(); Next();
if (selection_controller->GetActiveLine()->End.GetMS() == 0) { if (context->selectionController->GetActiveLine()->End.GetMS() == 0) {
const int default_duration = OPT_GET("Timing/Default Duration")->GetInt(); const int default_duration = OPT_GET("Timing/Default Duration")->GetInt();
markers[0].SetPosition(audio_controller->SamplesFromMilliseconds(new_end_ms)); markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms));
markers[1].SetPosition(audio_controller->SamplesFromMilliseconds(new_end_ms + default_duration)); markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms + default_duration));
timing_modified = true; timing_modified = true;
UpdateSelection(); UpdateSelection();
} }
@ -418,15 +409,15 @@ void AudioTimingControllerDialogue::Commit()
void AudioTimingControllerDialogue::Revert() void AudioTimingControllerDialogue::Revert()
{ {
if (AssDialogue *line = selection_controller->GetActiveLine()) if (AssDialogue *line = context->selectionController->GetActiveLine())
{ {
AssTime new_start = line->Start; AssTime new_start = line->Start;
AssTime new_end = line->End; AssTime new_end = line->End;
if (new_start.GetMS() != 0 || new_end.GetMS() != 0) if (new_start.GetMS() != 0 || new_end.GetMS() != 0)
{ {
markers[0].SetPosition(audio_controller->SamplesFromMilliseconds(new_start.GetMS())); markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_start.GetMS()));
markers[1].SetPosition(audio_controller->SamplesFromMilliseconds(new_end.GetMS())); markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end.GetMS()));
timing_modified = false; timing_modified = false;
UpdateSelection(); UpdateSelection();
} }