From 863e041d4dd3ac89e7140f87d5548184a29a4d4c Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Thu, 11 Oct 2012 09:19:16 -0700 Subject: [PATCH] Honor the configured MRU limits Actually use the limits set in the preferences dialog rather than always limiting the MRU lists to 16. Currently only the Find and Replace limits can be set to above 16 due to how the open recent items commands are implemented. Closes #1528. --- aegisub/libaegisub/common/mru.cpp | 51 +++++++++++++-------- aegisub/libaegisub/include/libaegisub/mru.h | 28 +++++++---- aegisub/src/main.cpp | 2 +- aegisub/src/preferences.cpp | 2 +- 4 files changed, 53 insertions(+), 30 deletions(-) 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);