140 lines
4.0 KiB
C++
140 lines
4.0 KiB
C++
#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::FolderEntry>& ProjectBrowserModel::GetFolderEntries() const {
|
|
return m_folderEntries;
|
|
}
|
|
|
|
const std::vector<Widgets::UIEditorTreeViewItem>& ProjectBrowserModel::GetTreeItems() const {
|
|
return m_treeItems;
|
|
}
|
|
|
|
const std::vector<ProjectBrowserModel::AssetEntry>& 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::BreadcrumbSegment> ProjectBrowserModel::BuildBreadcrumbSegments() const {
|
|
std::vector<BreadcrumbSegment> 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
|