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);
cancel_button->Enable(false);
enabled = false;
c->audioController->SetTimingController(CreateDialogueTimingController(c->audioController, c->selectionController, c->ass));
c->audioController->SetTimingController(CreateDialogueTimingController(c));
new_size = wxSize(-1, 0);
}

View file

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

View file

@ -44,6 +44,7 @@
#include "ass_time.h"
#include "audio_controller.h"
#include "audio_timing.h"
#include "include/aegisub/context.h"
#include "main.h"
#include "selection_controller.h"
#include "utils.h"
@ -132,8 +133,8 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele
AudioMarkerDialogueTiming *GetRightMarker();
const AudioMarkerDialogueTiming *GetRightMarker() const;
/// The owning audio controller
AudioController *audio_controller;
/// The owning project context
agi::Context *context;
/// Update the audio controller's selection
void UpdateSelection();
@ -146,17 +147,9 @@ class AudioTimingControllerDialogue : public AudioTimingController, private Sele
/// Autocommit option
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 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
void OnActiveLineChanged(AssDialogue *new_line);
void OnSelectedSetChanged(const Selection &lines_added, const Selection &lines_removed);
@ -187,15 +180,15 @@ public:
// Specific interface
/// @brief Constructor
AudioTimingControllerDialogue(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass);
AudioTimingControllerDialogue(agi::Context *c);
~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
@ -249,30 +242,28 @@ void AudioMarkerDialogueTiming::InitPair(AudioMarkerDialogueTiming *marker1, Aud
// AudioTimingControllerDialogue
AudioTimingControllerDialogue::AudioTimingControllerDialogue(AudioController *audio_controller, SelectionController<AssDialogue> *selection_controller, AssFile *ass)
AudioTimingControllerDialogue::AudioTimingControllerDialogue(agi::Context *c)
: timing_modified(false)
, commit_id(-1)
, audio_controller(audio_controller)
, context(c)
, 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]);
if (audio_controller->IsAudioOpen())
if (c->audioController->IsAudioOpen())
Revert();
selection_controller->AddSelectionListener(this);
commit_slot = ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this);
audio_open_slot = audio_controller->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, this);
c->selectionController->AddSelectionListener(this);
commit_slot = c->ass->AddCommitListener(&AudioTimingControllerDialogue::OnFileChanged, this);
audio_open_slot = c->audioController->AddAudioOpenListener(&AudioTimingControllerDialogue::Revert, this);
}
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)
{
if (audio_controller->IsAudioOpen())
if (context->audioController->IsAudioOpen())
Revert();
}
@ -352,22 +343,22 @@ SampleRange AudioTimingControllerDialogue::GetPrimaryPlaybackRange() const
void AudioTimingControllerDialogue::Next()
{
selection_controller->NextLine();
context->selectionController->NextLine();
}
void AudioTimingControllerDialogue::Prev()
{
selection_controller->PrevLine();
context->selectionController->PrevLine();
}
void AudioTimingControllerDialogue::Commit()
{
int new_start_ms = audio_controller->MillisecondsFromSamples(GetLeftMarker()->GetPosition());
int new_end_ms = audio_controller->MillisecondsFromSamples(GetRightMarker()->GetPosition());
int new_start_ms = context->audioController->MillisecondsFromSamples(GetLeftMarker()->GetPosition());
int new_end_ms = context->audioController->MillisecondsFromSamples(GetRightMarker()->GetPosition());
// 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
@ -378,7 +369,7 @@ void AudioTimingControllerDialogue::Commit()
if (timing_modified)
{
Selection sel;
selection_controller->GetSelectedSet(sel);
context->selectionController->GetSelectedSet(sel);
for (Selection::iterator sub = sel.begin(); sub != sel.end(); ++sub)
{
(*sub)->Start.SetMS(new_start_ms);
@ -388,11 +379,11 @@ void AudioTimingControllerDialogue::Commit()
commit_slot.Block();
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
}
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();
timing_modified = false;
@ -404,10 +395,10 @@ void AudioTimingControllerDialogue::Commit()
/// like the edit box, so maybe add a way to do that which both
/// this and the edit box can use
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();
markers[0].SetPosition(audio_controller->SamplesFromMilliseconds(new_end_ms));
markers[1].SetPosition(audio_controller->SamplesFromMilliseconds(new_end_ms + default_duration));
markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms));
markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end_ms + default_duration));
timing_modified = true;
UpdateSelection();
}
@ -418,15 +409,15 @@ void AudioTimingControllerDialogue::Commit()
void AudioTimingControllerDialogue::Revert()
{
if (AssDialogue *line = selection_controller->GetActiveLine())
if (AssDialogue *line = context->selectionController->GetActiveLine())
{
AssTime new_start = line->Start;
AssTime new_end = line->End;
if (new_start.GetMS() != 0 || new_end.GetMS() != 0)
{
markers[0].SetPosition(audio_controller->SamplesFromMilliseconds(new_start.GetMS()));
markers[1].SetPosition(audio_controller->SamplesFromMilliseconds(new_end.GetMS()));
markers[0].SetPosition(context->audioController->SamplesFromMilliseconds(new_start.GetMS()));
markers[1].SetPosition(context->audioController->SamplesFromMilliseconds(new_end.GetMS()));
timing_modified = false;
UpdateSelection();
}