Skip to content

Commit

Permalink
#5127: More FavouritesManager implementation. Add legacy loading code…
Browse files Browse the repository at this point in the history
… to import MediaBrowser favourites that have been stored in a different XPath up to v2.10.
  • Loading branch information
codereader committed Dec 27, 2020
1 parent 55b012a commit 86ac171
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 8 deletions.
49 changes: 49 additions & 0 deletions radiantcore/decl/FavouriteSet.h
@@ -0,0 +1,49 @@
#pragma once

#include <string>
#include <set>

namespace decl
{

class FavouriteSet
{
private:
std::set<std::string> _set;

public:
std::set<std::string>& get()
{
return _set;
}

const std::set<std::string>& 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);
}
}
};

}
33 changes: 26 additions & 7 deletions radiantcore/decl/FavouritesManager.cpp
Expand Up @@ -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<std::string>()).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)
Expand All @@ -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<std::string> FavouritesManager::getFavourites(decl::Type type)
{
auto set = _favouritesByType.find(type);

return set != _favouritesByType.end() ? set->second : std::set<std::string>();
return set != _favouritesByType.end() ? set->second.get() : std::set<std::string>();
}

const std::string& FavouritesManager::getName() const
Expand All @@ -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<FavouritesManager> favouritesManagerModule;
Expand Down
3 changes: 2 additions & 1 deletion radiantcore/decl/FavouritesManager.h
@@ -1,6 +1,7 @@
#pragma once

#include "ifavourites.h"
#include "FavouriteSet.h"

namespace decl
{
Expand All @@ -9,7 +10,7 @@ class FavouritesManager :
public IFavouritesManager
{
private:
std::map<Type, std::set<std::string>> _favouritesByType;
std::map<Type, FavouriteSet> _favouritesByType;

public:
void addFavourite(decl::Type type, const std::string& path) override;
Expand Down
1 change: 1 addition & 0 deletions tools/msvc/DarkRadiantCore.vcxproj
Expand Up @@ -719,6 +719,7 @@
<ClInclude Include="..\..\radiantcore\clipper\Clipper.h" />
<ClInclude Include="..\..\radiantcore\clipper\ClipPoint.h" />
<ClInclude Include="..\..\radiantcore\clipper\SplitAlgorithm.h" />
<ClInclude Include="..\..\radiantcore\decl\FavouriteSet.h" />
<ClInclude Include="..\..\radiantcore\decl\FavouritesManager.h" />
<ClInclude Include="..\..\radiantcore\eclass\Doom3EntityClass.h" />
<ClInclude Include="..\..\radiantcore\eclass\Doom3ModelDef.h" />
Expand Down
3 changes: 3 additions & 0 deletions tools/msvc/DarkRadiantCore.vcxproj.filters
Expand Up @@ -2070,5 +2070,8 @@
<ClInclude Include="..\..\radiantcore\decl\FavouritesManager.h">
<Filter>src\decl</Filter>
</ClInclude>
<ClInclude Include="..\..\radiantcore\decl\FavouriteSet.h">
<Filter>src\decl</Filter>
</ClInclude>
</ItemGroup>
</Project>

0 comments on commit 86ac171

Please sign in to comment.