diff --git a/src/ass_file.cpp b/src/ass_file.cpp index 966e9cc19..c0e0ceb65 100644 --- a/src/ass_file.cpp +++ b/src/ass_file.cpp @@ -20,9 +20,12 @@ #include "ass_dialogue.h" #include "ass_info.h" #include "ass_style.h" +#include "ass_style_storage.h" #include "options.h" #include "utils.h" +#include + #include #include #include @@ -36,7 +39,7 @@ AssFile::~AssFile() { Events.clear_and_dispose([](AssDialogue *e) { delete e; }); } -void AssFile::LoadDefault(bool include_dialogue_line) { +void AssFile::LoadDefault(bool include_dialogue_line, agi::fs::path const& style_catalog_file) { Info.emplace_back("Title", "Default Aegisub file"); Info.emplace_back("ScriptType", "v4.00+"); Info.emplace_back("WrapStyle", "0"); @@ -47,8 +50,16 @@ void AssFile::LoadDefault(bool include_dialogue_line) { } Info.emplace_back("YCbCr Matrix", "None"); + // Add default style Styles.push_back(*new AssStyle); + // Add/replace any catalog styles requested + if (!style_catalog_file.empty() && agi::fs::FileExists(style_catalog_file)) { + AssStyleStorage catalog; + catalog.Load(style_catalog_file); + catalog.ReplaceIntoFile(*this); + } + if (include_dialogue_line) Events.push_back(*new AssDialogue); } diff --git a/src/ass_file.h b/src/ass_file.h index 9c1bd9ae8..3ae05a42d 100644 --- a/src/ass_file.h +++ b/src/ass_file.h @@ -81,7 +81,7 @@ public: /// @brief Load default file /// @param defline Add a blank line to the file - void LoadDefault(bool defline=true); + void LoadDefault(bool defline = true, agi::fs::path const& style_catalog_file = agi::fs::path()); /// Attach a file to the ass file void InsertAttachment(agi::fs::path const& filename); /// Get the names of all of the styles available diff --git a/src/ass_style_storage.cpp b/src/ass_style_storage.cpp index 1cf00a31d..8595a4f01 100644 --- a/src/ass_style_storage.cpp +++ b/src/ass_style_storage.cpp @@ -34,6 +34,7 @@ #include "ass_style_storage.h" +#include "ass_file.h" #include "ass_style.h" #include @@ -96,3 +97,16 @@ AssStyle *AssStyleStorage::GetStyle(std::string const& name) { } return nullptr; } + +void AssStyleStorage::ReplaceIntoFile(AssFile &file) { + std::vector replaced_styles; + for (auto const& s : style) { + AssStyle *existing_style = file.GetStyle(s->name); + if (existing_style) + replaced_styles.push_back(existing_style); + file.Styles.push_back(*new AssStyle(*s)); + } + for (auto s : replaced_styles) + delete s; +} + diff --git a/src/ass_style_storage.h b/src/ass_style_storage.h index e1099c183..46e4188ea 100644 --- a/src/ass_style_storage.h +++ b/src/ass_style_storage.h @@ -39,6 +39,7 @@ #include #include +class AssFile; class AssStyle; class AssStyleStorage { @@ -77,4 +78,8 @@ public: /// Load stored styles from a file /// @param filename Catalog filename. Does not have to exist. void Load(agi::fs::path const& filename); + + /// Insert all styles into a file, replacing existing styles with the same names + /// @param file File to replace styles in + void ReplaceIntoFile(AssFile &file); }; diff --git a/src/subs_controller.cpp b/src/subs_controller.cpp index de1f8a954..6526786c3 100644 --- a/src/subs_controller.cpp +++ b/src/subs_controller.cpp @@ -21,6 +21,7 @@ #include "ass_file.h" #include "ass_info.h" #include "ass_style.h" +#include "ass_style_storage.h" #include "charset_detect.h" #include "compat.h" #include "command/command.h" @@ -290,7 +291,7 @@ void SubsController::Close() { filename.clear(); AssFile blank; blank.swap(*context->ass); - context->ass->LoadDefault(); + context->ass->LoadDefault(true, config::path->Decode("?user/catalog/Default.sty")); context->ass->Commit("", AssFile::COMMIT_NEW); FileOpen(filename); }