From a03b37bdef707c285277c9d2dfb8ff5ac80dc02b Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Wed, 28 Mar 2012 23:58:40 +0000 Subject: [PATCH] Move the CanSave logic to the subtitle formats as it's obviously format-specific Originally committed to SVN as r6625. --- aegisub/src/ass_file.cpp | 42 +++---------------------------- aegisub/src/ass_file.h | 2 +- aegisub/src/subtitle_format.cpp | 28 +++++++++++++++++++-- aegisub/src/subtitle_format.h | 10 ++++++-- aegisub/src/subtitle_format_ass.h | 3 +++ aegisub/src/subtitle_format_txt.h | 3 +++ 6 files changed, 44 insertions(+), 44 deletions(-) diff --git a/aegisub/src/ass_file.cpp b/aegisub/src/ass_file.cpp index 09792e570..5c2eee457 100644 --- a/aegisub/src/ass_file.cpp +++ b/aegisub/src/ass_file.cpp @@ -225,45 +225,9 @@ void AssFile::SaveMemory(std::vector &dst) { } } -bool AssFile::CanSave() { - // ASS format? - wxString ext = filename.Lower().Right(4); - if (ext == ".ass") return true; - - // Never save texts - if (ext == ".txt") return false; - - // Check if it's a known extension - if (!SubtitleFormat::GetWriter(filename)) return false; - - // Scan through the lines - AssStyle defstyle; - AssStyle *curstyle; - AssDialogue *curdiag; - for (entryIter cur=Line.begin();cur!=Line.end();cur++) { - // Check style, if anything non-default is found, return false - curstyle = dynamic_cast(*cur); - if (curstyle) { - if (curstyle->GetEntryData() != defstyle.GetEntryData()) return false; - } - - // Check for attachments, if any is found, return false - if (dynamic_cast(*cur)) return false; - - // Check dialog - curdiag = dynamic_cast(*cur); - if (curdiag) { - // Overrides? - curdiag->ParseASSTags(); - for (size_t i=0;iBlocks.size();i++) { - if (curdiag->Blocks[i]->GetType() != BLOCK_PLAIN) return false; - } - curdiag->ClearBlocks(); - } - } - - // Success - return true; +bool AssFile::CanSave() const { + const SubtitleFormat *writer = SubtitleFormat::GetWriter(filename); + return writer && writer->CanSave(this); } void AssFile::AddLine(wxString data, int *version, AssAttachment **attach) { diff --git a/aegisub/src/ass_file.h b/aegisub/src/ass_file.h index 739d2e17e..3348d82ed 100644 --- a/aegisub/src/ass_file.h +++ b/aegisub/src/ass_file.h @@ -146,7 +146,7 @@ public: /// Add file name to the MRU list void AddToRecent(wxString file); /// Can the file be saved in its current format? - bool CanSave(); + bool CanSave() const; /// @brief Get the list of wildcards supported /// @param mode 0 = open, 1 = save, 2 = export static wxString GetWildcardList(int mode); diff --git a/aegisub/src/subtitle_format.cpp b/aegisub/src/subtitle_format.cpp index f83fe1dc5..e91ce4b0e 100644 --- a/aegisub/src/subtitle_format.cpp +++ b/aegisub/src/subtitle_format.cpp @@ -36,14 +36,17 @@ #include "config.h" +#include "subtitle_format.h" + #ifndef AGI_PRE #include #include // Keep this last so wxUSE_CHOICEDLG is set. #endif +#include "ass_attachment.h" #include "ass_dialogue.h" #include "ass_file.h" -#include "subtitle_format.h" +#include "ass_style.h" #include "subtitle_format_ass.h" #include "subtitle_format_encore.h" #include "subtitle_format_microdvd.h" @@ -75,7 +78,28 @@ bool SubtitleFormat::CanWriteFile(wxString const& filename) const { return GetWriteWildcards().Index(filename.AfterLast('.'), false) != wxNOT_FOUND; } -/// @brief Ask the user to enter the FPS +bool SubtitleFormat::CanSave(const AssFile *subs) const { + AssStyle defstyle; + for (std::list::const_iterator cur = subs->Line.begin(); cur != subs->Line.end(); ++cur) { + // Check style, if anything non-default is found, return false + if (const AssStyle *curstyle = dynamic_cast(*cur)) { + if (curstyle->GetEntryData() != defstyle.GetEntryData()) + return false; + } + + // Check for attachments, if any is found, return false + if (dynamic_cast(*cur)) return false; + + // Check dialog + if (const AssDialogue *curdiag = dynamic_cast(*cur)) { + if (curdiag->GetStrippedText() != curdiag->Text) + return false; + } + } + + return true; +} + FractionalTime SubtitleFormat::AskForFPS(bool showSMPTE) const { wxArrayString choices; bool drop = false; diff --git a/aegisub/src/subtitle_format.h b/aegisub/src/subtitle_format.h index 9c7262bfb..ae725743e 100644 --- a/aegisub/src/subtitle_format.h +++ b/aegisub/src/subtitle_format.h @@ -103,16 +103,22 @@ public: /// @brief Check if the given file can be read by this format /// - /// Default implement ion simply checks if the file's extension is in the + /// Default implementation simply checks if the file's extension is in the /// format's wildcard list virtual bool CanReadFile(wxString const& filename) const; /// @brief Check if the given file can be written by this format /// - /// Default implement ion simply checks if the file's extension is in the + /// Default implementation simply checks if the file's extension is in the /// format's wildcard list virtual bool CanWriteFile(wxString const& filename) const; + /// @brief Check if the given subtitles can be losslessly written by this format + /// + /// Default implementation rejects files with attachments, non-default + /// styles, and any overrides + virtual bool CanSave(const AssFile *file) const; + /// Load a subtitle file /// @param[out] target Destination to read lines into /// @param filename File to load diff --git a/aegisub/src/subtitle_format_ass.h b/aegisub/src/subtitle_format_ass.h index a0eb82af1..ca62c30fc 100644 --- a/aegisub/src/subtitle_format_ass.h +++ b/aegisub/src/subtitle_format_ass.h @@ -48,6 +48,9 @@ public: wxArrayString GetReadWildcards() const; wxArrayString GetWriteWildcards() const; + // Naturally the ASS subtitle format can save all Ass files + bool CanSave(const AssFile*) const { return true; } + void ReadFile(AssFile *target, wxString const& filename, wxString const& forceEncoding) const; void WriteFile(const AssFile *src, wxString const& filename, wxString const& encoding) const; }; diff --git a/aegisub/src/subtitle_format_txt.h b/aegisub/src/subtitle_format_txt.h index f6cd22e03..f36a560b0 100644 --- a/aegisub/src/subtitle_format_txt.h +++ b/aegisub/src/subtitle_format_txt.h @@ -47,6 +47,9 @@ public: wxArrayString GetReadWildcards() const; wxArrayString GetWriteWildcards() const; + // TXT format supports so little that it should always require an export + bool CanSave(const AssFile*) const { return false; } + bool CanWriteFile(wxString const& filename) const; void ReadFile(AssFile *target, wxString const& filename, wxString const& forceEncoding) const; void WriteFile(const AssFile *src, wxString const& filename, wxString const& encoding) const;