diff --git a/radiant/ui/modelselector/ModelDataInserter.h b/radiant/ui/modelselector/ModelDataInserter.h index 8de7fc9863..d223e58518 100644 --- a/radiant/ui/modelselector/ModelDataInserter.h +++ b/radiant/ui/modelselector/ModelDataInserter.h @@ -18,8 +18,6 @@ namespace const char* MODEL_ICON = "model16green.png"; const char* SKIN_ICON = "skin16.png"; const char* FOLDER_ICON = "folder16.png"; - - const char* MODELS_FOLDER = "models/"; } /** @@ -69,7 +67,7 @@ class ModelDataInserter : std::string displayName = path.substr(path.rfind("/") + 1); // Pathname is the model VFS name for a model, and blank for a folder - std::string fullPath = isExplicit ? (MODELS_FOLDER + path) : ""; + std::string fullPath = isExplicit ? path : ""; bool isFavourite = isExplicit && _favourites.count(fullPath) > 0; diff --git a/radiant/ui/modelselector/ModelPopulator.h b/radiant/ui/modelselector/ModelPopulator.h index 74fa68bb21..da051256b0 100644 --- a/radiant/ui/modelselector/ModelPopulator.h +++ b/radiant/ui/modelselector/ModelPopulator.h @@ -7,6 +7,7 @@ #include "EventRateLimiter.h" #include "ifilesystem.h" +#include "ieclass.h" #include "i18n.h" #include "string/string.h" #include "os/path.h" @@ -63,6 +64,7 @@ class ModelPopulator final : void PopulateModel(const wxutil::TreeModel::Ptr& model) override { wxutil::VFSTreePopulator populator(model); + constexpr const char* MODELS_FOLDER = "models/"; // Search for model files GlobalFileSystem().forEachFile( @@ -72,7 +74,7 @@ class ModelPopulator final : // Only add visible models if (fileInfo.visibility == vfs::Visibility::NORMAL) { - visitModelFile(fileInfo.name, populator); + visitModelFile(MODELS_FOLDER + fileInfo.name, populator); } }, 0 @@ -80,11 +82,39 @@ class ModelPopulator final : ThrowIfCancellationRequested(); + // Model Defs Folder + wxIcon folderIcon; + folderIcon.CopyFromBitmap(wxArtProvider::GetBitmap(GlobalUIManager().ArtIdPrefix() + FOLDER_ICON)); + reportProgress(_("Building tree...")); // Fill in the column data (TRUE = including skins) ModelDataInserter inserterSkins(_columns, true); populator.forEachNode(inserterSkins); + + reportProgress(_("Adding Model Definitions...")); + + // Model Defs + wxutil::TreeModel::Row modelDefs(model->AddItem()); + modelDefs[_columns.iconAndName] = wxVariant(wxDataViewIconText(_("Model Definitions"), folderIcon)); + modelDefs[_columns.fullName] = _("Model Definitions"); + modelDefs[_columns.modelPath] = ""; + modelDefs[_columns.leafName] = _("Model Definitions"); + modelDefs[_columns.skin] = std::string(); + modelDefs[_columns.isSkin] = false; + modelDefs[_columns.isFolder] = true; + modelDefs[_columns.isFavourite] = false; + modelDefs.SendItemAdded(); + + wxutil::VFSTreePopulator modelDefPopulator(model, modelDefs.getItem()); + + GlobalEntityClassManager().forEachModelDef([&](const IModelDefPtr& def) + { + ThrowIfCancellationRequested(); + modelDefPopulator.addPath(def->name); + }); + + modelDefPopulator.forEachNode(inserterSkins); } void SortModel(const wxutil::TreeModel::Ptr& model) override