diff --git a/radiantcore/decl/FavouriteSet.h b/radiantcore/decl/FavouriteSet.h new file mode 100644 index 0000000000..6854349d72 --- /dev/null +++ b/radiantcore/decl/FavouriteSet.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include + +namespace decl +{ + +class FavouriteSet +{ +private: + std::set _set; + +public: + std::set& get() + { + return _set; + } + + const std::set& get() const + { + return _set; + } + + void loadFromRegistry(const std::string& rootPath) + { + xml::NodeList favourites = GlobalRegistry().findXPath(rootPath + "//favourite"); + + for (xml::Node& node : favourites) + { + _set.insert(node.getAttributeValue("value")); + } + } + + void saveToRegistry(const std::string& rootPath) + { + GlobalRegistry().deleteXPath(rootPath + "//favourite"); + + xml::Node favourites = GlobalRegistry().createKey(rootPath); + + for (const auto& favourite : _set) + { + xml::Node node = favourites.createChild("favourite"); + node.setAttributeValue("value", favourite); + } + } +}; + +} diff --git a/radiantcore/decl/FavouritesManager.cpp b/radiantcore/decl/FavouritesManager.cpp index a1bc56870e..3fb88f88ac 100644 --- a/radiantcore/decl/FavouritesManager.cpp +++ b/radiantcore/decl/FavouritesManager.cpp @@ -6,16 +6,23 @@ namespace decl { +namespace +{ + const char* const RKEY_MEDIABROWSER_LEGACY_ROOT = "user/ui/mediaBrowser/favourites"; + const char* const RKEY_FAVOURITES_ROOT = "user/ui/favourites"; + const char* const RKEY_SUBPATH_MATERIALS = "/materials"; +} + void FavouritesManager::addFavourite(decl::Type type, const std::string& path) { auto set = _favouritesByType.find(type); if (set == _favouritesByType.end()) { - set = _favouritesByType.emplace(type, std::set()).first; + set = _favouritesByType.emplace(type, FavouriteSet()).first; } - set->second.emplace(path); + set->second.get().emplace(path); } void FavouritesManager::removeFavourite(decl::Type type, const std::string& path) @@ -27,21 +34,21 @@ void FavouritesManager::removeFavourite(decl::Type type, const std::string& path return; } - set->second.erase(path); + set->second.get().erase(path); } bool FavouritesManager::isFavourite(decl::Type type, const std::string& path) { auto set = _favouritesByType.find(type); - return set != _favouritesByType.end() ? set->second.count(path) > 0 : false; + return set != _favouritesByType.end() ? set->second.get().count(path) > 0 : false; } std::set FavouritesManager::getFavourites(decl::Type type) { auto set = _favouritesByType.find(type); - return set != _favouritesByType.end() ? set->second : std::set(); + return set != _favouritesByType.end() ? set->second.get() : std::set(); } const std::string& FavouritesManager::getName() const @@ -64,12 +71,24 @@ const StringSet& FavouritesManager::getDependencies() const void FavouritesManager::initialiseModule(const IApplicationContext&) { - // TODO: Load favourites from registry + // Up to version 2.10.0, the MediaBrowser favourites were stored in this path + _favouritesByType[Type::Material].loadFromRegistry(RKEY_MEDIABROWSER_LEGACY_ROOT); + + // Get rid of this old key after importing its data + GlobalRegistry().deleteXPath(RKEY_MEDIABROWSER_LEGACY_ROOT); + + // Load from the regular paths + std::string root = RKEY_FAVOURITES_ROOT; + _favouritesByType[Type::Material].loadFromRegistry(root + RKEY_SUBPATH_MATERIALS); } void FavouritesManager::shutdownModule() { - // TODO: Save favourites to registry + std::string root = RKEY_FAVOURITES_ROOT; + GlobalRegistry().deleteXPath(RKEY_FAVOURITES_ROOT); + + // Save favourites to registry + _favouritesByType[Type::Material].saveToRegistry(root + RKEY_SUBPATH_MATERIALS); } module::StaticModule favouritesManagerModule; diff --git a/radiantcore/decl/FavouritesManager.h b/radiantcore/decl/FavouritesManager.h index 25b99fd0e1..b7ffee46db 100644 --- a/radiantcore/decl/FavouritesManager.h +++ b/radiantcore/decl/FavouritesManager.h @@ -1,6 +1,7 @@ #pragma once #include "ifavourites.h" +#include "FavouriteSet.h" namespace decl { @@ -9,7 +10,7 @@ class FavouritesManager : public IFavouritesManager { private: - std::map> _favouritesByType; + std::map _favouritesByType; public: void addFavourite(decl::Type type, const std::string& path) override; diff --git a/tools/msvc/DarkRadiantCore.vcxproj b/tools/msvc/DarkRadiantCore.vcxproj index c0208592f2..24a8adc509 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj +++ b/tools/msvc/DarkRadiantCore.vcxproj @@ -719,6 +719,7 @@ + diff --git a/tools/msvc/DarkRadiantCore.vcxproj.filters b/tools/msvc/DarkRadiantCore.vcxproj.filters index bf5421e440..d21d2bdd49 100644 --- a/tools/msvc/DarkRadiantCore.vcxproj.filters +++ b/tools/msvc/DarkRadiantCore.vcxproj.filters @@ -2070,5 +2070,8 @@ src\decl + + src\decl + \ No newline at end of file