diff --git a/aegisub/libaegisub/common/mru.cpp b/aegisub/libaegisub/common/mru.cpp index 8f1b44e96..d76701342 100644 --- a/aegisub/libaegisub/common/mru.cpp +++ b/aegisub/libaegisub/common/mru.cpp @@ -20,16 +20,31 @@ #include "../config.h" +#include "libaegisub/mru.h" + #include "libaegisub/cajun/writer.h" #include "libaegisub/io.h" #include "libaegisub/json.h" #include "libaegisub/log.h" -#include "libaegisub/mru.h" +#include "libaegisub/option.h" +#include "libaegisub/option_value.h" namespace agi { -MRUManager::MRUManager(const std::string &config, const std::string &default_config): config_name(config) { +MRUManager::MRUManager(std::string const& config, std::string const& default_config, agi::Options *options) +: config_name(config) +, options(options) +{ + option_names["Audio"] = "Limits/MRU"; + option_names["Keyframes"] = "Limits/MRU"; + option_names["Subtitles"] = "Limits/MRU"; + option_names["Timecodes"] = "Limits/MRU"; + option_names["Video"] = "Limits/MRU"; + + option_names["Find"] = "Limits/Find Replace"; + option_names["Replace"] = "Limits/Find Replace"; + LOG_D("agi/mru") << "Loading MRU List"; json::Object root(json_util::file(config, default_config)); @@ -37,7 +52,6 @@ MRUManager::MRUManager(const std::string &config, const std::string &default_con Load(it->first, it->second); } - MRUManager::~MRUManager() { } @@ -48,30 +62,27 @@ MRUManager::MRUListMap &MRUManager::Find(std::string const& key) { return index->second; } - -void MRUManager::Add(const std::string &key, const std::string &entry) { +void MRUManager::Add(std::string const& key, std::string const& entry) { MRUListMap &map = Find(key); map.remove(entry); map.push_front(entry); - Prune(map); + Prune(key, map); Flush(); } - -void MRUManager::Remove(const std::string &key, const std::string &entry) { +void MRUManager::Remove(std::string const& key, std::string const& entry) { Find(key).remove(entry); Flush(); } - -const MRUManager::MRUListMap* MRUManager::Get(const std::string &key) { +const MRUManager::MRUListMap* MRUManager::Get(std::string const& key) { return &Find(key); } -std::string const& MRUManager::GetEntry(const std::string &key, size_t entry) { - const MRUManager::MRUListMap *map = Get(key); +std::string const& MRUManager::GetEntry(std::string const& key, const size_t entry) { + const MRUManager::MRUListMap *const map = Get(key); if (entry >= map->size()) throw MRUErrorIndexOutOfRange("Requested element index is out of range."); @@ -81,7 +92,6 @@ std::string const& MRUManager::GetEntry(const std::string &key, size_t entry) { return *index; } - void MRUManager::Flush() { json::Object out; @@ -93,24 +103,29 @@ void MRUManager::Flush() { json::Writer::Write(out, io::Save(config_name).Get()); } - /// @brief Prune MRUListMap to the desired length. /// This uses the user-set values for MRU list length. -inline void MRUManager::Prune(MRUListMap& map) { - map.resize(std::min(16, map.size())); +void MRUManager::Prune(std::string const& key, MRUListMap& map) const { + size_t limit = 16u; + if (options) { + std::map::const_iterator it = option_names.find(key); + if (it != option_names.end()) + limit = (size_t)options->Get(it->second)->GetInt(); + } + map.resize(std::min(limit, map.size())); } /// @brief Load MRU Lists. /// @param key List name. /// @param array json::Array of values. -void MRUManager::Load(const std::string &key, const json::Array& array) { +void MRUManager::Load(std::string const& key, const json::Array& array) { try { copy(array.begin(), array.end(), back_inserter(mru[key])); } catch (json::Exception const&) { // Out of date MRU file; just discard the data and skip it } - Prune(mru[key]); + Prune(key, mru[key]); } } diff --git a/aegisub/libaegisub/include/libaegisub/mru.h b/aegisub/libaegisub/include/libaegisub/mru.h index eb16d18a8..8bf0c739d 100644 --- a/aegisub/libaegisub/include/libaegisub/mru.h +++ b/aegisub/libaegisub/include/libaegisub/mru.h @@ -32,6 +32,10 @@ namespace json { typedef std::deque Array; } +namespace agi { + class Options; +} + namespace agi { DEFINE_BASE_EXCEPTION_NOINNER(MRUError,Exception) @@ -47,14 +51,13 @@ DEFINE_SIMPLE_EXCEPTION_NOINNER(MRUErrorIndexOutOfRange, MRUError, "mru/invalid" /// If a file fails to open, Remove() should be called. /// class MRUManager { - public: /// @brief Map for time->value pairs. - typedef std::list MRUListMap; + typedef std::list MRUListMap; /// @brief Constructor /// @param config File to load MRU values from - MRUManager(const std::string &config, const std::string &default_config); + MRUManager(std::string const& config, std::string const& default_config, agi::Options *options = 0); /// Destructor ~MRUManager(); @@ -63,33 +66,35 @@ public: /// @param key List name /// @param entry Entry to add /// @exception MRUErrorInvalidKey thrown when an invalid key is used. - void Add(const std::string &key, const std::string &entry); + void Add(std::string const& key, std::string const& entry); /// @brief Remove entry from the list. /// @param key List name /// @param entry Entry to add /// @exception MRUErrorInvalidKey thrown when an invalid key is used. - void Remove(const std::string &key, const std::string &entry); + void Remove(std::string const& key, std::string const& entry); /// @brief Return list /// @param key List name /// @exception MRUErrorInvalidKey thrown when an invalid key is used. - const MRUListMap* Get(const std::string &key); + const MRUListMap* Get(std::string const& key); /// @brief Return A single entry in a list. /// @param key List name /// @param entry 0-base position of entry /// @exception MRUErrorInvalidKey thrown when an invalid key is used. - std::string const& GetEntry(const std::string &key, size_t entry); + std::string const& GetEntry(std::string const& key, const size_t entry); /// Write MRU lists to disk. void Flush(); private: - /// Internal name of the config file, set during object construction. const std::string config_name; + /// User preferences object for maximum number of items to list + agi::Options *const options; + /// @brief Map for MRUListMap values. /// @param std::string Name /// @param MRUListMap instance. @@ -98,8 +103,11 @@ private: /// Internal MRUMap values. MRUMap mru; - void Load(const std::string &key, const ::json::Array& array); - inline void Prune(MRUListMap& map); + /// Map from MRU name to option name + std::map option_names; + + void Load(std::string const& key, ::json::Array const& array); + void Prune(std::string const& key, MRUListMap& map) const; MRUListMap &Find(std::string const& key); }; diff --git a/aegisub/src/main.cpp b/aegisub/src/main.cpp index ec58a57e2..5ac03bb9a 100644 --- a/aegisub/src/main.cpp +++ b/aegisub/src/main.cpp @@ -203,7 +203,7 @@ bool AegisubApp::OnInit() { icon::icon_init(); StartupLog("Load MRU"); - config::mru = new agi::MRUManager(STD_STR(StandardPaths::DecodePath("?user/mru.json")), GET_DEFAULT_CONFIG(default_mru)); + config::mru = new agi::MRUManager(STD_STR(StandardPaths::DecodePath("?user/mru.json")), GET_DEFAULT_CONFIG(default_mru), config::opt); #ifdef __VISUALC__ SetThreadName((DWORD) -1,"AegiMain"); diff --git a/aegisub/src/preferences.cpp b/aegisub/src/preferences.cpp index 38224bc7a..99b5dbd96 100644 --- a/aegisub/src/preferences.cpp +++ b/aegisub/src/preferences.cpp @@ -116,7 +116,7 @@ General::General(wxTreebook *book, Preferences *parent): OptionPage(book, parent OptionAdd(general, _("Undo Levels"), "Limits/Undo Levels", 2); wxFlexGridSizer *recent = PageSizer(_("Recently Used Lists")); - OptionAdd(recent, _("Files"), "Limits/MRU"); + OptionAdd(recent, _("Files"), "Limits/MRU", 0, 16); OptionAdd(recent, _("Find/Replace"), "Limits/Find Replace"); SetSizerAndFit(sizer);