Skip to content

Commit

Permalink
#6 Update browse asset folder
Browse files Browse the repository at this point in the history
  • Loading branch information
ducphamhong committed Mar 3, 2021
1 parent 73e6944 commit e63a143
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 54 deletions.
15 changes: 15 additions & 0 deletions Projects/Editor/Source/AssetManager/CAssetManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,21 @@ namespace Skylicht
}
}

bool CAssetManager::isFolderEmpty(const char* folder)
{
for (const auto& file : fs::directory_iterator(folder))
{
std::string path = file.path().generic_u8string();

if (file.is_directory())
{
return false;
}
}

return true;
}

void CAssetManager::beginLoadGUID()
{
m_fileIterator = m_files.begin();
Expand Down
4 changes: 3 additions & 1 deletion Projects/Editor/Source/AssetManager/CAssetManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,15 @@ namespace Skylicht

void getFolder(const char* folder, std::vector<SFileInfo>& files);

bool isFolderEmpty(const char* folder);

void beginLoadGUID();

bool loadGUID(int count);

void saveGUID(const char* path, SFileNode& node);

void readGUID(const char *path, SFileNode& node);
void readGUID(const char* path, SFileNode& node);

void removeUnusedMeta();

Expand Down
67 changes: 47 additions & 20 deletions Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ This file is part of the "Skylicht Engine".

#include "pch.h"
#include "CSpaceAssets.h"
#include "AssetManager/CAssetManager.h"

namespace Skylicht
{
Expand Down Expand Up @@ -58,26 +57,9 @@ namespace Skylicht

// add root to tree folder
assetManager->getRoot(files);
for (const SFileInfo& f : files)
{
if (f.IsFolder == true)
{
root->addNode(f.NameW.c_str(), GUI::ESystemIcon::Folder);
}
}

/*
GUI::CTreeNode* child2 = root->addNode(L"Child 2", GUI::ESystemIcon::OpenFolder);
child2->addNode(L"File", GUI::ESystemIcon::File);
child2->addNode(L"Document", GUI::ESystemIcon::FileDocument);
child2->addNode(L"Image", GUI::ESystemIcon::FileImage);
child2->expand();
for (int i = 0; i < 20; i++)
{
root->addNode(L"Child _", GUI::ESystemIcon::Folder);
}
*/
addTreeFolder(root, files);

// spliter
spliter->setControl(m_folder, 0, 0);

GUI::CListBox* listBox = new GUI::CListBox(spliter);
Expand All @@ -99,5 +81,50 @@ namespace Skylicht
{

}

void CSpaceAssets::addTreeFolder(GUI::CTreeNode* node, std::vector<SFileInfo>& files)
{
CAssetManager* assetManager = CAssetManager::getInstance();

for (const SFileInfo& f : files)
{
if (f.IsFolder == true)
{
GUI::CTreeNode* childNode = node->addNode(f.NameW.c_str(), GUI::ESystemIcon::Folder);
childNode->TagString = f.FullPath;
childNode->OnExpand = BIND_LISTENER(&CSpaceAssets::OnTreeNodeExpand, this);
childNode->OnCollapse = BIND_LISTENER(&CSpaceAssets::OnTreeNodeCollapse, this);

if (assetManager->isFolderEmpty(f.FullPath.c_str()) == false)
childNode->setAlwayShowExpandButton(true);
}
}
}

void CSpaceAssets::OnTreeNodeExpand(GUI::CBase* node)
{
GUI::CTreeNode* treeNode = dynamic_cast<GUI::CTreeNode*>(node);
if (treeNode != NULL)
{
treeNode->setIcon(GUI::ESystemIcon::OpenFolder);

CAssetManager* assetManager = CAssetManager::getInstance();

std::vector<SFileInfo> files;
assetManager->getFolder(treeNode->TagString.c_str(), files);

addTreeFolder(treeNode, files);
}
}

void CSpaceAssets::OnTreeNodeCollapse(GUI::CBase* node)
{
GUI::CTreeNode* treeNode = dynamic_cast<GUI::CTreeNode*>(node);
if (treeNode != NULL)
{
treeNode->setIcon(GUI::ESystemIcon::Folder);
treeNode->removeAllTreeNode();
}
}
}
}
10 changes: 10 additions & 0 deletions Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ This file is part of the "Skylicht Engine".
#pragma once

#include "SkylichtEngine.h"
#include "AssetManager/CAssetManager.h"
#include "Editor/Space/CSpace.h"

namespace Skylicht
Expand All @@ -41,6 +42,15 @@ namespace Skylicht
CSpaceAssets(GUI::CWindow* window, CEditor* editor);

virtual ~CSpaceAssets();

void OnTreeNodeExpand(GUI::CBase* node);

void OnTreeNodeCollapse(GUI::CBase* node);

protected:

void addTreeFolder(GUI::CTreeNode* node, std::vector<SFileInfo>& files);

};
}
}
1 change: 1 addition & 0 deletions Projects/Editor/Source/GUI/Controls/CTreeControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ namespace Skylicht
m_scrollControl->dock(EPosition::Fill);
m_scrollControl->showScrollBar(true, true);
m_scrollControl->getVerticalSroll()->setNudgeAmount(40.0f);
m_scrollControl->setDebugValue(1);

m_innerPanel = m_scrollControl->getInnerPanel();

Expand Down
68 changes: 46 additions & 22 deletions Projects/Editor/Source/GUI/Controls/CTreeNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,15 @@ namespace Skylicht
{
namespace GUI
{
CTreeNode::CTreeNode(CBase *parent, CTreeNode *root) :
CTreeNode::CTreeNode(CBase* parent, CTreeNode* root) :
CBase(parent),
m_root(root),
m_expand(false),
m_selected(false)
m_selected(false),
TagInt(0),
TagFloat(0.0f),
TagData(NULL),
m_alwayShowExpandButton(false)
{
m_parentNode = dynamic_cast<CTreeNode*>(parent);

Expand Down Expand Up @@ -75,7 +79,7 @@ namespace Skylicht

void CTreeNode::layout()
{
if (m_innerPanel->Children.size() == 0)
if (m_innerPanel->Children.size() == 0 && m_alwayShowExpandButton == false)
{
m_innerPanel->setHidden(true);
m_expandButton->setHidden(true);
Expand Down Expand Up @@ -116,7 +120,7 @@ namespace Skylicht
SPoint row = m_row->localPosToCanvas();
SPoint control = m_root->localPosToCanvas();

CTreeControl *treeControl = (CTreeControl*)(m_root);
CTreeControl* treeControl = (CTreeControl*)(m_root);
SRect bounds = m_row->getBounds();
bounds.X = bounds.X - (row.X - control.X);
bounds.Width = treeControl->getScrollControl()->getInnerWidth();
Expand All @@ -135,11 +139,16 @@ namespace Skylicht

CTreeNode* CTreeNode::addNode(const std::wstring& text, ESystemIcon icon)
{
CTreeNode *node = addNode(text);
CTreeNode* node = addNode(text);
node->setIcon(icon);
return node;
}

void CTreeNode::removeAllTreeNode()
{
m_innerPanel->removeAllChildren();
}

void CTreeNode::setText(const std::wstring& text)
{
if (m_title == NULL)
Expand All @@ -165,27 +174,42 @@ namespace Skylicht
m_title->showIcon(true);
else
m_title->showIcon(false);

invalidate();
}

void CTreeNode::onExpand(CBase *base)
void CTreeNode::onExpand(CBase* base)
{
m_expand = !m_expand;

if (m_expand)
{
if (OnExpand != nullptr)
OnExpand(this);
}
else
{
if (OnCollapse != nullptr)
OnCollapse(this);
}

invalidate();

recurseLayout();
}

void CTreeNode::onDoubleClick(CBase *base)
void CTreeNode::onDoubleClick(CBase* base)
{
onExpand(base);
}

void CTreeNode::onDown(CBase *base)
void CTreeNode::onDown(CBase* base)
{
m_root->onNodeClick(base);
setSelected(!m_selected);
}

void CTreeNode::onNodeClick(CBase *base)
void CTreeNode::onNodeClick(CBase* base)
{

}
Expand All @@ -198,9 +222,9 @@ namespace Skylicht
if (m_innerPanel->Children.size() == 0)
return NULL;

for (CBase *c : m_innerPanel->Children)
for (CBase* c : m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
CTreeNode* node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
CTreeNode* child = node->getChildSelected();
Expand All @@ -220,9 +244,9 @@ namespace Skylicht
if (m_innerPanel->Children.size() == 0)
return NULL;

for (CBase *c : m_innerPanel->Children)
for (CBase* c : m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
CTreeNode* node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
m_root->deselectAll();
Expand All @@ -245,10 +269,10 @@ namespace Skylicht
List::reverse_iterator i = m_innerPanel->Children.rbegin(), end = m_innerPanel->Children.rend();
while (i != end)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(*i);
CTreeNode* node = dynamic_cast<CTreeNode*>(*i);
if (node && !node->isDisabled())
{
CTreeNode *child = node->selectLastChild();
CTreeNode* child = node->selectLastChild();

if (child == NULL)
{
Expand All @@ -272,7 +296,7 @@ namespace Skylicht
std::list<CTreeNode*> priorityQueue;
priorityQueue.push_back(this);

CTreeNode *lastItem = NULL;
CTreeNode* lastItem = NULL;

while (priorityQueue.size() > 0)
{
Expand All @@ -293,9 +317,9 @@ namespace Skylicht
{
std::list<CTreeNode*>::iterator i = priorityQueue.begin();

for (CBase *c : visit->m_innerPanel->Children)
for (CBase* c : visit->m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
CTreeNode* node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
i = priorityQueue.insert(i, node);
Expand Down Expand Up @@ -339,9 +363,9 @@ namespace Skylicht
{
std::list<CTreeNode*>::iterator i = priorityQueue.begin();

for (CBase *c : visit->m_innerPanel->Children)
for (CBase* c : visit->m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
CTreeNode* node = dynamic_cast<CTreeNode*>(c);
if (node && !node->isDisabled())
{
i = priorityQueue.insert(i, node);
Expand Down Expand Up @@ -383,9 +407,9 @@ namespace Skylicht
{
setSelected(false);

for (CBase *c : m_innerPanel->Children)
for (CBase* c : m_innerPanel->Children)
{
CTreeNode *node = dynamic_cast<CTreeNode*>(c);
CTreeNode* node = dynamic_cast<CTreeNode*>(c);
if (node)
{
node->deselectAll();
Expand Down
Loading

0 comments on commit e63a143

Please sign in to comment.