diff --git a/libs/wxutil/dataview/DeclarationTreeView.cpp b/libs/wxutil/dataview/DeclarationTreeView.cpp index c9e2edf6c5..e6546dee57 100644 --- a/libs/wxutil/dataview/DeclarationTreeView.cpp +++ b/libs/wxutil/dataview/DeclarationTreeView.cpp @@ -17,6 +17,7 @@ DeclarationTreeView::DeclarationTreeView(wxWindow* parent, decl::Type declType, _columns(columns), _declType(declType) { + SetFavouriteKeyColumn(_columns.declName); EnableFavouriteManagement(decl::getTypeName(_declType)); } diff --git a/libs/wxutil/dataview/ResourceTreeView.cpp b/libs/wxutil/dataview/ResourceTreeView.cpp index 51cb434724..43d7445cf9 100644 --- a/libs/wxutil/dataview/ResourceTreeView.cpp +++ b/libs/wxutil/dataview/ResourceTreeView.cpp @@ -46,7 +46,8 @@ ResourceTreeView::ResourceTreeView(wxWindow* parent, const TreeModel::Ptr& model _expandTopLevelItemsAfterPopulation(false), _columnToSelectAfterPopulation(nullptr), _setFavouritesRecursively(true), - _declPathColumn(_columns.fullName) + _declPathColumn(_columns.fullName), + _favouriteKeyColumn(_columns.fullName) { _treeStore = model; @@ -518,16 +519,21 @@ void ResourceTreeView::SetFavourite(TreeModel::Row& row, bool isFavourite) // Keep track of this choice if (isFavourite) { - GlobalFavouritesManager().addFavourite(_favouriteTypeName, row[_columns.fullName]); + GlobalFavouritesManager().addFavourite(_favouriteTypeName, row[_favouriteKeyColumn]); } else { - GlobalFavouritesManager().removeFavourite(_favouriteTypeName, row[_columns.fullName]); + GlobalFavouritesManager().removeFavourite(_favouriteTypeName, row[_favouriteKeyColumn]); } row.SendItemChanged(); } +void ResourceTreeView::SetFavouriteKeyColumn(const TreeModel::Column& column) +{ + _favouriteKeyColumn = column; +} + void ResourceTreeView::_onSetFavourite(bool isFavourite) { wxDataViewItem item = GetSelection(); diff --git a/libs/wxutil/dataview/ResourceTreeView.h b/libs/wxutil/dataview/ResourceTreeView.h index cf48c759af..d171e3f158 100644 --- a/libs/wxutil/dataview/ResourceTreeView.h +++ b/libs/wxutil/dataview/ResourceTreeView.h @@ -95,6 +95,7 @@ class ResourceTreeView : // The column that is hosting the declaration path (used by e.g. "copy to clipboard") TreeModel::Column _declPathColumn; + TreeModel::Column _favouriteKeyColumn; public: ResourceTreeView(wxWindow* parent, const Columns& columns, long style = wxDV_SINGLE); @@ -164,6 +165,9 @@ class ResourceTreeView : virtual void SetFavourite(TreeModel::Row& row, bool isFavourite); virtual void SetFavouriteRecursively(TreeModel::Row& row, bool isFavourite); + // Defines the column that is used to retrieve the key when adding/removing favourites + virtual void SetFavouriteKeyColumn(const TreeModel::Column& column); + virtual void SetupTreeModelFilter(); virtual bool IsTreeModelRowVisible(TreeModel::Row& row); diff --git a/libs/wxutil/dataview/ThreadedDeclarationTreePopulator.h b/libs/wxutil/dataview/ThreadedDeclarationTreePopulator.h index ea3ec8772e..17f17a66e6 100644 --- a/libs/wxutil/dataview/ThreadedDeclarationTreePopulator.h +++ b/libs/wxutil/dataview/ThreadedDeclarationTreePopulator.h @@ -1,5 +1,8 @@ #pragma once +#include "idecltypes.h" +#include "ifavourites.h" + #include "DeclarationTreeView.h" #include "ThreadedResourceTreePopulator.h" @@ -13,10 +16,35 @@ namespace wxutil class ThreadedDeclarationTreePopulator : public ThreadedResourceTreePopulator { +private: + const DeclarationTreeView::Columns& _columns; + + std::set _favourites; + public: - ThreadedDeclarationTreePopulator(const DeclarationTreeView::Columns& columns) : - ThreadedResourceTreePopulator(columns) - {} + ThreadedDeclarationTreePopulator(decl::Type type, const DeclarationTreeView::Columns& columns) : + ThreadedResourceTreePopulator(columns), + _columns(columns) + { + // Assemble the set of favourites for the given declaration type + _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(type)); + } + + ~ThreadedDeclarationTreePopulator() override + { + EnsureStopped(); + } + +protected: + const std::set& GetFavourites() const + { + return _favourites; + } + + bool IsFavourite(const std::string& declName) + { + return _favourites.count(declName) > 0; + } }; } diff --git a/plugins/dm.editing/ThreadedEntityDefPopulator.h b/plugins/dm.editing/ThreadedEntityDefPopulator.h index 7df0fec898..b8970105d4 100644 --- a/plugins/dm.editing/ThreadedEntityDefPopulator.h +++ b/plugins/dm.editing/ThreadedEntityDefPopulator.h @@ -18,18 +18,14 @@ class ThreadedEntityDefPopulator : { private: const wxutil::DeclarationTreeView::Columns& _columns; - std::set _favourites; wxIcon _icon; public: ThreadedEntityDefPopulator(const wxutil::DeclarationTreeView::Columns& columns, const std::string& iconName) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::EntityDef, columns), _columns(columns) { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::EntityDef)); - _icon.CopyFromBitmap(wxutil::GetLocalBitmap(iconName)); } @@ -53,7 +49,7 @@ class ThreadedEntityDefPopulator : if (!ClassShouldBeListed(eclass)) return; - bool isFavourite = _favourites.count(eclass->getDeclName()) > 0; + bool isFavourite = IsFavourite(eclass->getDeclName()); auto row = model->AddItem(); diff --git a/radiant/ui/animationpreview/MD5AnimationViewer.cpp b/radiant/ui/animationpreview/MD5AnimationViewer.cpp index c30997daee..b21bbf9ae5 100644 --- a/radiant/ui/animationpreview/MD5AnimationViewer.cpp +++ b/radiant/ui/animationpreview/MD5AnimationViewer.cpp @@ -26,19 +26,14 @@ class ThreadedModelDefLoader final : private: const wxutil::DeclarationTreeView::Columns& _columns; - std::set _favourites; - wxIcon _folderIcon; wxIcon _modelIcon; public: ThreadedModelDefLoader(const wxutil::DeclarationTreeView::Columns& columns) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::ModelDef, columns), _columns(columns) { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::Skin)); - _modelIcon.CopyFromBitmap(wxutil::GetLocalBitmap("model16green.png")); _folderIcon.CopyFromBitmap(wxutil::GetLocalBitmap("folder16.png")); } @@ -71,7 +66,7 @@ class ThreadedModelDefLoader final : private: void StoreModelDefValues(wxutil::TreeModel::Row& row, const std::string& modelName, const std::string& leafName, bool isFolder) { - bool isFavourite = _favourites.count(modelName) > 0; + bool isFavourite = IsFavourite(modelName); row[_columns.iconAndName] = wxVariant(wxDataViewIconText(leafName, !isFolder ? _modelIcon : _folderIcon)); row[_columns.iconAndName] = wxutil::TreeViewItemStyle::Declaration(isFavourite); diff --git a/radiant/ui/common/ShaderSelector.cpp b/radiant/ui/common/ShaderSelector.cpp index 45d14b094a..c731aa1a35 100644 --- a/radiant/ui/common/ShaderSelector.cpp +++ b/radiant/ui/common/ShaderSelector.cpp @@ -47,20 +47,15 @@ class ThreadedMaterialLoader final : const wxutil::DeclarationTreeView::Columns& _columns; const ShaderSelector::PrefixList& _prefixes; - std::set _favourites; - wxIcon _folderIcon; wxIcon _textureIcon; public: ThreadedMaterialLoader(const wxutil::DeclarationTreeView::Columns& columns, const ShaderSelector::PrefixList& prefixes) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::Material, columns), _columns(columns), _prefixes(prefixes) { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::Skin)); - _textureIcon.CopyFromBitmap(wxutil::GetLocalBitmap(TEXTURE_ICON)); _folderIcon.CopyFromBitmap(wxutil::GetLocalBitmap(FOLDER_ICON)); } @@ -100,7 +95,7 @@ class ThreadedMaterialLoader final : private: void StoreMaterialValues(wxutil::TreeModel::Row& row, const std::string& materialName, const std::string& leafName, bool isFolder) { - bool isFavourite = _favourites.count(materialName) > 0; + bool isFavourite = IsFavourite(materialName); row[_columns.iconAndName] = wxVariant(wxDataViewIconText(leafName, !isFolder ? _textureIcon : _folderIcon)); row[_columns.iconAndName] = wxutil::TreeViewItemStyle::Declaration(isFavourite); diff --git a/radiant/ui/common/SkinChooser.cpp b/radiant/ui/common/SkinChooser.cpp index ba6d61ac10..2bb953d7bd 100644 --- a/radiant/ui/common/SkinChooser.cpp +++ b/radiant/ui/common/SkinChooser.cpp @@ -35,8 +35,6 @@ namespace private: const wxutil::DeclarationTreeView::Columns& _columns; - std::set _favourites; - wxDataViewItem& _allSkinsItem; wxDataViewItem& _matchingSkinsItem; @@ -48,15 +46,12 @@ namespace public: ThreadedSkinLoader(const wxutil::DeclarationTreeView::Columns& columns, const std::string& model, wxDataViewItem& allSkinsItem, wxDataViewItem& matchingSkinsItem) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::Skin, columns), _columns(columns), _allSkinsItem(allSkinsItem), _matchingSkinsItem(matchingSkinsItem), _model(model) { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::Skin)); - _skinIcon.CopyFromBitmap(wxutil::GetLocalBitmap(SKIN_ICON)); _folderIcon.CopyFromBitmap(wxutil::GetLocalBitmap(FOLDER_ICON)); } @@ -120,7 +115,7 @@ namespace private: void StoreSkinValues(wxutil::TreeModel::Row& row, const std::string& fullSkinName, const std::string& leafName, bool isFolder) { - bool isFavourite = _favourites.count(fullSkinName) > 0; + bool isFavourite = IsFavourite(fullSkinName); row[_columns.iconAndName] = wxVariant(wxDataViewIconText(leafName, !isFolder ? _skinIcon : _folderIcon)); row[_columns.iconAndName] = wxutil::TreeViewItemStyle::Declaration(isFavourite); diff --git a/radiant/ui/common/SoundChooser.cpp b/radiant/ui/common/SoundChooser.cpp index bdf756f5e0..40ef56ed33 100644 --- a/radiant/ui/common/SoundChooser.cpp +++ b/radiant/ui/common/SoundChooser.cpp @@ -106,7 +106,7 @@ class ThreadedSoundShaderLoader : // Construct and initialise variables ThreadedSoundShaderLoader(const wxutil::DeclarationTreeView::Columns& columns) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::SoundShader, columns), _columns(columns) {} diff --git a/radiant/ui/eclasstree/EClassTreeBuilder.cpp b/radiant/ui/eclasstree/EClassTreeBuilder.cpp index 6279f20bb2..32d60d1676 100644 --- a/radiant/ui/eclasstree/EClassTreeBuilder.cpp +++ b/radiant/ui/eclasstree/EClassTreeBuilder.cpp @@ -18,12 +18,9 @@ namespace } EClassTreeBuilder::EClassTreeBuilder(const wxutil::DeclarationTreeView::Columns& columns) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::EntityDef, columns), _columns(columns) { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::EntityDef)); - _entityIcon.CopyFromBitmap(wxutil::GetLocalBitmap(ENTITY_ICON)); } @@ -65,7 +62,7 @@ void EClassTreeBuilder::visit(const IEntityClassPtr& eclass) _treePopulator->addPath(fullPath, [&](wxutil::TreeModel::Row& row, const std::string& path, const std::string& leafName, bool isFolder) { - bool isFavourite = _favourites.count(leafName) > 0; + bool isFavourite = IsFavourite(leafName); row[_columns.iconAndName] = wxVariant(wxDataViewIconText(leafName, _entityIcon)); row[_columns.iconAndName] = wxutil::TreeViewItemStyle::Declaration(isFavourite); diff --git a/radiant/ui/eclasstree/EClassTreeBuilder.h b/radiant/ui/eclasstree/EClassTreeBuilder.h index 546de100d4..24c64a9a58 100644 --- a/radiant/ui/eclasstree/EClassTreeBuilder.h +++ b/radiant/ui/eclasstree/EClassTreeBuilder.h @@ -22,8 +22,6 @@ class EClassTreeBuilder final : private: const wxutil::DeclarationTreeView::Columns& _columns; - std::set _favourites; - wxIcon _entityIcon; std::unique_ptr _treePopulator; diff --git a/radiant/ui/materials/MaterialPopulator.cpp b/radiant/ui/materials/MaterialPopulator.cpp index 2afdb90dd6..fd41a7f13b 100644 --- a/radiant/ui/materials/MaterialPopulator.cpp +++ b/radiant/ui/materials/MaterialPopulator.cpp @@ -148,11 +148,9 @@ struct ShaderNameFunctor // Construct and initialise variables MaterialPopulator::MaterialPopulator(const MaterialTreeView::TreeColumns& columns) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::Material, columns), _columns(columns) -{ - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::Material)); -} +{} MaterialPopulator::~MaterialPopulator() { @@ -162,7 +160,7 @@ MaterialPopulator::~MaterialPopulator() void MaterialPopulator::AddSingleMaterial(const wxutil::TreeModel::Ptr& model, const std::string& materialName) { - ShaderNameFunctor functor(*model, _columns, _favourites); + ShaderNameFunctor functor(*model, _columns, GetFavourites()); std::vector parts; string::split(parts, materialName, "/"); @@ -252,7 +250,7 @@ void MaterialPopulator::PopulateModel(const wxutil::TreeModel::Ptr& model) { model->SetHasDefaultCompare(false); - ShaderNameFunctor functor(*model, _columns, _favourites); + ShaderNameFunctor functor(*model, _columns, GetFavourites()); GlobalMaterialManager().foreachShaderName([&](const std::string& name) { ThrowIfCancellationRequested(); diff --git a/radiant/ui/materials/MaterialPopulator.h b/radiant/ui/materials/MaterialPopulator.h index 877560c531..a10cd5de79 100644 --- a/radiant/ui/materials/MaterialPopulator.h +++ b/radiant/ui/materials/MaterialPopulator.h @@ -14,9 +14,6 @@ class MaterialPopulator : private: const MaterialTreeView::TreeColumns& _columns; - // The set of favourites - std::set _favourites; - public: // Construct and initialise variables MaterialPopulator(const MaterialTreeView::TreeColumns& columns); diff --git a/radiant/ui/particles/ThreadedParticlesLoader.h b/radiant/ui/particles/ThreadedParticlesLoader.h index c6beaa6a7b..1d8b6e7010 100644 --- a/radiant/ui/particles/ThreadedParticlesLoader.h +++ b/radiant/ui/particles/ThreadedParticlesLoader.h @@ -21,16 +21,11 @@ class ThreadedParticlesLoader final : private: const wxutil::DeclarationTreeView::Columns& _columns; - std::set _favourites; - public: ThreadedParticlesLoader(const wxutil::DeclarationTreeView::Columns& columns) : - ThreadedDeclarationTreePopulator(columns), + ThreadedDeclarationTreePopulator(decl::Type::Particle, columns), _columns(columns) - { - // Get the list of favourites - _favourites = GlobalFavouritesManager().getFavourites(decl::getTypeName(decl::Type::Particle)); - } + {} ~ThreadedParticlesLoader() { @@ -53,7 +48,7 @@ class ThreadedParticlesLoader final : // Add the Def name to the list store wxutil::TreeModel::Row row = model->AddItem(); - bool isFavourite = _favourites.count(prtName) > 0; + bool isFavourite = IsFavourite(def.getDeclName()); row[_columns.iconAndName] = wxVariant(wxDataViewIconText(prtName)); row[_columns.iconAndName] = wxutil::TreeViewItemStyle::Declaration(isFavourite);