#pragma once #include "ProjectBrowserModel.h" #include "Support/StringEncoding.h" #include #include #include #include namespace XCEngine::UI::Editor::App::ProjectBrowserModelSupport { inline constexpr std::string_view kAssetsRootId = "Assets"; inline std::string ToLowerCopy(std::string value) { std::transform( value.begin(), value.end(), value.begin(), [](unsigned char character) { return static_cast(std::tolower(character)); }); return value; } inline std::string PathToUtf8String(const std::filesystem::path& path) { return Support::WideToUtf8(path.native()); } inline std::string NormalizePathSeparators(std::string value) { std::replace(value.begin(), value.end(), '\\', '/'); return value; } inline std::string BuildRelativeItemId( const std::filesystem::path& path, const std::filesystem::path& assetsRoot) { const std::filesystem::path relative = std::filesystem::relative(path, assetsRoot.parent_path()); const std::string normalized = NormalizePathSeparators(PathToUtf8String(relative.lexically_normal())); return normalized.empty() ? std::string(kAssetsRootId) : normalized; } inline std::string BuildAssetDisplayName(const std::filesystem::path& path, bool directory) { if (directory) { return PathToUtf8String(path.filename()); } const std::string filename = PathToUtf8String(path.filename()); const std::size_t extensionOffset = filename.find_last_of('.'); if (extensionOffset == std::string::npos || extensionOffset == 0u) { return filename; } return filename.substr(0u, extensionOffset); } inline bool IsMetaFile(const std::filesystem::path& path) { return ToLowerCopy(path.extension().string()) == ".meta"; } inline bool HasChildDirectories(const std::filesystem::path& folderPath) { std::error_code errorCode = {}; const std::filesystem::directory_iterator end = {}; for (std::filesystem::directory_iterator iterator(folderPath, errorCode); !errorCode && iterator != end; iterator.increment(errorCode)) { if (iterator->is_directory(errorCode)) { return true; } } return false; } inline std::vector CollectSortedChildDirectories( const std::filesystem::path& folderPath) { std::vector paths = {}; std::error_code errorCode = {}; const std::filesystem::directory_iterator end = {}; for (std::filesystem::directory_iterator iterator(folderPath, errorCode); !errorCode && iterator != end; iterator.increment(errorCode)) { if (iterator->is_directory(errorCode)) { paths.push_back(iterator->path()); } } std::sort( paths.begin(), paths.end(), [](const std::filesystem::path& lhs, const std::filesystem::path& rhs) { return ToLowerCopy(PathToUtf8String(lhs.filename())) < ToLowerCopy(PathToUtf8String(rhs.filename())); }); return paths; } } // namespace XCEngine::UI::Editor::App::ProjectBrowserModelSupport