Handle external changes in the translation assisant

As all program hotkeys are now allowed while the translation assistant
is active, it can no longer assume that it's the only thing modifying
the file.

Originally committed to SVN as r6579.
This commit is contained in:
Thomas Goyne 2012-03-12 23:34:54 +00:00
parent 7e5b241260
commit d0150d6b6d
2 changed files with 51 additions and 2 deletions

View file

@ -66,10 +66,12 @@ static bool bad_block(AssDialogueBlock *block) {
DialogTranslation::DialogTranslation(agi::Context *c) DialogTranslation::DialogTranslation(agi::Context *c)
: wxDialog(c->parent, -1, _("Translation Assistant"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMINIMIZE_BOX) : wxDialog(c->parent, -1, _("Translation Assistant"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMINIMIZE_BOX)
, c(c) , c(c)
, file_change_connection(c->ass->AddCommitListener(&DialogTranslation::OnExternalCommit, this))
, active_line(c->selectionController->GetActiveLine()) , active_line(c->selectionController->GetActiveLine())
, cur_block(0) , cur_block(0)
, line_count(count_if(c->ass->Line.begin(), c->ass->Line.end(), cast<AssDialogue*>())) , line_count(count_if(c->ass->Line.begin(), c->ass->Line.end(), cast<AssDialogue*>()))
, line_number(count_if(c->ass->Line.begin(), find(c->ass->Line.begin(), c->ass->Line.end(), active_line), cast<AssDialogue*>()) + 1) , line_number(count_if(c->ass->Line.begin(), find(c->ass->Line.begin(), c->ass->Line.end(), active_line), cast<AssDialogue*>()) + 1)
, switching_lines(false)
{ {
SetIcon(BitmapToIcon(GETIMAGE(translation_toolbutton_16))); SetIcon(BitmapToIcon(GETIMAGE(translation_toolbutton_16)));
@ -164,11 +166,40 @@ DialogTranslation::DialogTranslation(agi::Context *c)
} }
else else
UpdateDisplay(); UpdateDisplay();
c->selectionController->AddSelectionListener(this);
} }
DialogTranslation::~DialogTranslation() { } DialogTranslation::~DialogTranslation() {
c->selectionController->RemoveSelectionListener(this);
}
void DialogTranslation::OnActiveLineChanged(AssDialogue *new_line) {
if (switching_lines) return;
active_line = new_line;
active_line->ParseASSTags();
cur_block = 0;
line_number = count_if(c->ass->Line.begin(), find(c->ass->Line.begin(), c->ass->Line.end(), active_line), cast<AssDialogue*>()) + 1;
if (bad_block(active_line->Blocks[cur_block]) && !NextBlock()) {
wxMessageBox(_("No more lines to translate."));
EndModal(1);
}
}
void DialogTranslation::OnExternalCommit(int commit_type) {
if (commit_type == AssFile::COMMIT_NEW || commit_type & AssFile::COMMIT_DIAG_ADDREM) {
line_count = count_if(c->ass->Line.begin(), c->ass->Line.end(), cast<AssDialogue*>());
line_number_display->SetLabel(wxString::Format(_("Current line: %d/%d"), (int)line_number, (int)line_count));
}
if (commit_type & AssFile::COMMIT_DIAG_TEXT)
OnActiveLineChanged(active_line);
}
bool DialogTranslation::NextBlock() { bool DialogTranslation::NextBlock() {
switching_lines = true;
do { do {
if (cur_block == active_line->Blocks.size() - 1) { if (cur_block == active_line->Blocks.size() - 1) {
c->selectionController->NextLine(); c->selectionController->NextLine();
@ -184,12 +215,14 @@ bool DialogTranslation::NextBlock() {
else else
++cur_block; ++cur_block;
} while (bad_block(active_line->Blocks[cur_block])); } while (bad_block(active_line->Blocks[cur_block]));
switching_lines = false;
UpdateDisplay(); UpdateDisplay();
return true; return true;
} }
bool DialogTranslation::PrevBlock() { bool DialogTranslation::PrevBlock() {
switching_lines = true;
do { do {
if (cur_block == 0) { if (cur_block == 0) {
c->selectionController->PrevLine(); c->selectionController->PrevLine();
@ -205,6 +238,7 @@ bool DialogTranslation::PrevBlock() {
else else
--cur_block; --cur_block;
} while (bad_block(active_line->Blocks[cur_block])); } while (bad_block(active_line->Blocks[cur_block]));
switching_lines = false;
UpdateDisplay(); UpdateDisplay();
return true; return true;
@ -245,7 +279,10 @@ void DialogTranslation::Commit(bool next) {
new_value.Replace("\n", "\\N"); new_value.Replace("\n", "\\N");
*active_line->Blocks[cur_block] = AssDialogueBlockPlain(new_value); *active_line->Blocks[cur_block] = AssDialogueBlockPlain(new_value);
active_line->UpdateText(); active_line->UpdateText();
file_change_connection.Block();
c->ass->Commit(_("translation assistant"), AssFile::COMMIT_DIAG_TEXT); c->ass->Commit(_("translation assistant"), AssFile::COMMIT_DIAG_TEXT);
file_change_connection.Unblock();
if (next) { if (next) {
if (!NextBlock()) { if (!NextBlock()) {

View file

@ -26,6 +26,9 @@
#include <libaegisub/exception.h> #include <libaegisub/exception.h>
#include <libaegisub/scoped_ptr.h> #include <libaegisub/scoped_ptr.h>
#include <libaegisub/signal.h>
#include "selection_controller.h"
namespace agi { struct Context; } namespace agi { struct Context; }
class AssDialogue; class AssDialogue;
@ -39,9 +42,11 @@ class wxCheckBox;
/// @brief Assistant for translating subtitles in one language to another language /// @brief Assistant for translating subtitles in one language to another language
/// ///
/// DOCME /// DOCME
class DialogTranslation : public wxDialog { class DialogTranslation : public wxDialog, private SelectionListener<AssDialogue> {
agi::Context *c; agi::Context *c;
agi::signal::Connection file_change_connection;
/// The active line /// The active line
AssDialogue *active_line; AssDialogue *active_line;
/// Which dialogue block in the active line is currently being translated /// Which dialogue block in the active line is currently being translated
@ -52,6 +57,9 @@ class DialogTranslation : public wxDialog {
/// Line number of the currently active line /// Line number of the currently active line
size_t line_number; size_t line_number;
/// Should active line change announcements be ignored?
bool switching_lines;
wxStaticText *line_number_display; wxStaticText *line_number_display;
ScintillaTextCtrl *original_text; ScintillaTextCtrl *original_text;
SubsTextEditCtrl *translated_text; SubsTextEditCtrl *translated_text;
@ -62,9 +70,13 @@ class DialogTranslation : public wxDialog {
void OnPlayAudioButton(wxCommandEvent &); void OnPlayAudioButton(wxCommandEvent &);
void OnPlayVideoButton(wxCommandEvent &); void OnPlayVideoButton(wxCommandEvent &);
void OnKeyDown(wxKeyEvent &evt); void OnKeyDown(wxKeyEvent &evt);
void OnExternalCommit(int commit_type);
void UpdateDisplay(); void UpdateDisplay();
void OnSelectedSetChanged(Selection const&, Selection const&) { }
void OnActiveLineChanged(AssDialogue *new_line);
public: public:
DialogTranslation(agi::Context *context); DialogTranslation(agi::Context *context);
~DialogTranslation(); ~DialogTranslation();