Only perform charset detection once when opening subtitles
Relying on TextFileReader to do the charset detection results in the user being prompted to pick a charset twice when it can't be auto-detected, since the result from trying to open the subtitles as timecodes was not being reused. Closes #1512.
This commit is contained in:
parent
47c36c9033
commit
d55949d9c1
2 changed files with 21 additions and 12 deletions
|
@ -21,6 +21,7 @@
|
|||
#include "ass_dialogue.h"
|
||||
#include "ass_file.h"
|
||||
#include "ass_style.h"
|
||||
#include "charset_detect.h"
|
||||
#include "compat.h"
|
||||
#include "command/command.h"
|
||||
#include "include/aegisub/context.h"
|
||||
|
@ -81,21 +82,29 @@ SubsController::SubsController(agi::Context *context)
|
|||
});
|
||||
}
|
||||
|
||||
void SubsController::Load(agi::fs::path const& filename, std::string const& charset) {
|
||||
void SubsController::Load(agi::fs::path const& filename, std::string charset) {
|
||||
if (TryToClose() == wxCANCEL) return;
|
||||
|
||||
// TextFileReader does this automatically, but relying on that results in
|
||||
// the user being prompted twice if it can't be auto-detected, since we
|
||||
// open the file twice below.
|
||||
if (charset.empty())
|
||||
charset = CharSetDetect::GetEncoding(filename);
|
||||
|
||||
// Make sure that file isn't actually a timecode file
|
||||
try {
|
||||
TextFileReader testSubs(filename, charset);
|
||||
std::string cur = testSubs.ReadLineFromFile();
|
||||
if (boost::starts_with(cur, "# timecode")) {
|
||||
context->videoController->LoadTimecodes(filename);
|
||||
return;
|
||||
if (charset != "binary") {
|
||||
try {
|
||||
TextFileReader testSubs(filename, charset);
|
||||
std::string cur = testSubs.ReadLineFromFile();
|
||||
if (boost::starts_with(cur, "# timecode")) {
|
||||
context->videoController->LoadTimecodes(filename);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (...) {
|
||||
// if trying to load the file as timecodes fails it's fairly
|
||||
// safe to assume that it is in fact not a timecode file
|
||||
}
|
||||
}
|
||||
catch (...) {
|
||||
// if trying to load the file as timecodes fails it's fairly
|
||||
// safe to assume that it is in fact not a timecode file
|
||||
}
|
||||
|
||||
const SubtitleFormat *reader = SubtitleFormat::GetReader(filename);
|
||||
|
|
|
@ -74,7 +74,7 @@ public:
|
|||
/// @brief Load from a file
|
||||
/// @param file File name
|
||||
/// @param charset Character set of file or empty to autodetect
|
||||
void Load(agi::fs::path const& file, std::string const& charset="");
|
||||
void Load(agi::fs::path const& file, std::string charset="");
|
||||
|
||||
/// @brief Save to a file
|
||||
/// @param file Path to save to
|
||||
|
|
Loading…
Reference in a new issue