#include "ProjectBrowserModelSupport.h" namespace XCEngine::UI::Editor::App { using namespace ProjectBrowserModelSupport; void ProjectBrowserModel::Initialize(const std::filesystem::path& repoRoot) { m_assetsRootPath = (repoRoot / "project/Assets").lexically_normal(); Refresh(); } void ProjectBrowserModel::SetFolderIcon(const ::XCEngine::UI::UITextureHandle& icon) { m_folderIcon = icon; if (!m_assetsRootPath.empty()) { RefreshFolderTree(); } } void ProjectBrowserModel::Refresh() { RefreshFolderTree(); EnsureValidCurrentFolder(); RefreshAssetList(); } bool ProjectBrowserModel::Empty() const { return m_treeItems.empty(); } const std::filesystem::path& ProjectBrowserModel::GetAssetsRootPath() const { return m_assetsRootPath; } const std::vector& ProjectBrowserModel::GetFolderEntries() const { return m_folderEntries; } const std::vector& ProjectBrowserModel::GetTreeItems() const { return m_treeItems; } const std::vector& ProjectBrowserModel::GetAssetEntries() const { return m_assetEntries; } const std::string& ProjectBrowserModel::GetCurrentFolderId() const { return m_currentFolderId; } const ProjectBrowserModel::FolderEntry* ProjectBrowserModel::FindFolderEntry( std::string_view itemId) const { for (const FolderEntry& entry : m_folderEntries) { if (entry.itemId == itemId) { return &entry; } } return nullptr; } const ProjectBrowserModel::AssetEntry* ProjectBrowserModel::FindAssetEntry( std::string_view itemId) const { for (const AssetEntry& entry : m_assetEntries) { if (entry.itemId == itemId) { return &entry; } } return nullptr; } bool ProjectBrowserModel::NavigateToFolder(std::string_view itemId) { if (itemId.empty() || FindFolderEntry(itemId) == nullptr || itemId == m_currentFolderId) { return false; } m_currentFolderId = std::string(itemId); EnsureValidCurrentFolder(); RefreshAssetList(); return true; } std::vector ProjectBrowserModel::BuildBreadcrumbSegments() const { std::vector segments = {}; if (m_currentFolderId.empty()) { segments.push_back(BreadcrumbSegment{ std::string(kAssetsRootId), std::string(kAssetsRootId), true }); return segments; } std::string cumulativeFolderId = {}; std::size_t segmentStart = 0u; while (segmentStart < m_currentFolderId.size()) { const std::size_t separator = m_currentFolderId.find('/', segmentStart); const std::size_t segmentLength = separator == std::string_view::npos ? m_currentFolderId.size() - segmentStart : separator - segmentStart; if (segmentLength > 0u) { std::string label = std::string(m_currentFolderId.substr(segmentStart, segmentLength)); if (cumulativeFolderId.empty()) { cumulativeFolderId = label; } else { cumulativeFolderId += "/"; cumulativeFolderId += label; } segments.push_back(BreadcrumbSegment{ std::move(label), cumulativeFolderId, false }); } if (separator == std::string_view::npos) { break; } segmentStart = separator + 1u; } if (segments.empty()) { segments.push_back(BreadcrumbSegment{ std::string(kAssetsRootId), std::string(kAssetsRootId), true }); return segments; } segments.back().current = true; return segments; } void ProjectBrowserModel::EnsureValidCurrentFolder() { if (m_currentFolderId.empty()) { m_currentFolderId = std::string(kAssetsRootId); } if (FindFolderEntry(m_currentFolderId) == nullptr) { m_currentFolderId = m_treeItems.empty() ? std::string() : m_treeItems.front().itemId; } } } // namespace XCEngine::UI::Editor::App