[DEV] better treeview with select buffer

This commit is contained in:
Edouard DUPIN 2018-08-30 23:20:18 +02:00
parent e575ec6116
commit 1d65639191
3 changed files with 95 additions and 40 deletions

View File

@ -122,7 +122,7 @@ appl::Buffer::Buffer() :
m_highlight(null) { m_highlight(null) {
addObjectType("appl::Buffer"); addObjectType("appl::Buffer");
static int32_t bufferBaseId = 0; static int32_t bufferBaseId = 0;
m_fileName = "REL:No Name " + etk::toString(bufferBaseId); m_fileName = etk::FSNode("REL:No Name " + etk::toString(bufferBaseId)).getFileSystemName();
bufferBaseId++; bufferBaseId++;
} }
@ -139,7 +139,7 @@ bool appl::Buffer::loadFile(const etk::String& _name) {
etk::FSNode file(_name); etk::FSNode file(_name);
etk::String name = file.getName(); etk::String name = file.getName();
APPL_INFO("Load file : '" << name << "'"); APPL_INFO("Load file : '" << name << "'");
m_fileName = name; m_fileName = file.getFileSystemName();
m_hasFileName = true; m_hasFileName = true;
m_isModify = true; m_isModify = true;
m_cursorPos = 0; m_cursorPos = 0;
@ -158,10 +158,10 @@ void appl::Buffer::setFileName(const etk::String& _name) {
APPL_DEBUG("Convert filename :'" << _name << "'"); APPL_DEBUG("Convert filename :'" << _name << "'");
etk::FSNode file(_name); etk::FSNode file(_name);
etk::String name = file.getName(); etk::String name = file.getName();
if (m_fileName == name) { if (m_fileName == file.getFileSystemName()) {
return; return;
} }
m_fileName = name; m_fileName = file.getFileSystemName();
m_hasFileName = true; m_hasFileName = true;
signalChangeName.emit(); signalChangeName.emit();
setModification(true); setModification(true);

View File

@ -75,30 +75,11 @@ static etk::String getCommonPathPart(const etk::String& _left, const etk::String
void appl::widget::BufferTree::generateFlatTree() { void appl::widget::BufferTree::generateFlatTree() {
// Brut Force Mode... // Brut Force Mode...
etk::String upperParent = ""; etk::String upperParent = getRootPath();
etk::Vector<appl::BufferShared> tmpNewBuffer;
for (auto& it : *m_bufferManager) {
if (it == null) {
continue;
}
if (it->hasFileName() == false) {
tmpNewBuffer.pushBack(it);
continue;
}
etk::FSNode nodeName = it->getFileName();
if (upperParent == "") {
upperParent = nodeName.getNameFolder();
APPL_ERROR("init root: " << nodeName.getFileSystemName() << " root=" << upperParent);
continue;
}
upperParent = getCommonPathPart(upperParent, nodeName.getNameFolder());
APPL_ERROR("Update: " << nodeName.getFileSystemName() << " " << nodeName.getNameFolder() << " root=" << upperParent);
}
APPL_ERROR("update tree: " << upperParent);
// Now we have the root path... // Now we have the root path...
// Need to feed all elements needed. // Need to feed all elements needed.
etk::FSNode nodeRoot = upperParent; etk::FSNode nodeRoot = upperParent;
m_tree = etk::TreeNode<appl::TreeElement>::create(TreeElement(upperParent, etk::FSNode(upperParent).getFileName(), true, true)); m_tree = etk::TreeNode<appl::TreeElement>::create(TreeElement(nodeRoot, true));
populateNodeIfNeeded(m_tree); populateNodeIfNeeded(m_tree);
updateFlatTree(); updateFlatTree();
} }
@ -117,20 +98,39 @@ void appl::widget::BufferTree::populateNodeIfNeeded(ememory::SharedPtr<etk::Tree
return; return;
} }
etk::Vector<etk::FSNode*> child = etk::FSNode(value.m_path).folderGetSubList(false, true, true, false); etk::Vector<etk::FSNode*> child = etk::FSNode(value.m_path).folderGetSubList(false, true, true, false);
APPL_ERROR(" nbChilds: " << child.size()); APPL_ERROR(" nbChilds: " << child.size() << " for path: " << value.m_path);
for (auto& it: child) { for (auto& it: child) {
APPL_ERROR("add element: " << *it); APPL_ERROR("add element: " << *it);
if (it->getNodeType() == etk::typeNode_folder) { auto elem = etk::TreeNode<appl::TreeElement>::create(TreeElement(*it, false));
auto elem = etk::TreeNode<appl::TreeElement>::create(TreeElement(it->getFileSystemName(), it->getNameFile(), true, false)); _node->addChild(elem);
m_tree->addChild(elem);
} else {
auto elem = etk::TreeNode<appl::TreeElement>::create(TreeElement(it->getFileSystemName(), it->getNameFile(), false, false));
m_tree->addChild(elem);
}
// TODO: ETK_FREE(etk::FSNode, it); // TODO: ETK_FREE(etk::FSNode, it);
} }
} }
void appl::widget::BufferTree::goUpper() {
APPL_ERROR("Go upper ...");
if (m_tree == null) {
generateFlatTree();
return;
}
// generate new futur root node ...
etk::FSNode node = etk::FSNode(m_tree->getData().m_path).folderGetParent();
auto treeElement = etk::TreeNode<appl::TreeElement>::create(TreeElement(node, true));
// Add all sub-items
populateNodeIfNeeded(treeElement);
// find old root node in the sublist:
for (auto& it: treeElement->getChilds()) {
if (it->getData().m_nodeName == m_tree->getData().m_nodeName) {
it = m_tree;
break;
}
}
// set new root node:
m_tree = treeElement;
// update display:
updateFlatTree();
}
void appl::widget::BufferTree::updateFlatTree() { void appl::widget::BufferTree::updateFlatTree() {
m_flatTree.setRoot(m_tree, m_flatTree.setRoot(m_tree,
[&](const TreeElement& _value){ [&](const TreeElement& _value){
@ -163,8 +163,58 @@ void appl::widget::BufferTree::removeAllElement() {
//m_list.clear(); //m_list.clear();
} }
etk::String appl::widget::BufferTree::getRootPath() {
etk::String upperParent = "";
etk::Vector<appl::BufferShared> tmpNewBuffer;
for (auto& it : *m_bufferManager) {
if (it == null) {
continue;
}
if (it->hasFileName() == false) {
tmpNewBuffer.pushBack(it);
continue;
}
etk::FSNode nodeName = it->getFileName();
if (upperParent == "") {
upperParent = nodeName.getNameFolder();
APPL_ERROR("init root: " << nodeName.getFileSystemName() << " root=" << upperParent);
continue;
}
upperParent = getCommonPathPart(upperParent, nodeName.getNameFolder());
APPL_ERROR("Update: " << nodeName.getFileSystemName() << " " << nodeName.getNameFolder() << " root=" << upperParent);
}
if (upperParent == "") {
APPL_ERROR("Nothing find ==> get home path...");
upperParent = etk::FSNodeGetHomePath();
}
APPL_ERROR("update tree: " << upperParent);
return upperParent;
}
void appl::widget::BufferTree::onNewBuffer(const ememory::SharedPtr<appl::Buffer>& _buffer) { void appl::widget::BufferTree::onNewBuffer(const ememory::SharedPtr<appl::Buffer>& _buffer) {
generateFlatTree(); APPL_ERROR("New Buffer open: '" << _buffer->getFileName() << "'");
if (m_tree == null) {
generateFlatTree();
} else {
etk::String rootPath = getRootPath();
while (rootPath != m_tree->getData().m_path ) {
goUpper();
}
}
auto listElements = m_tree->findIf([&](const etk::TreeNode<TreeElement>& _node) {
APPL_WARNING("Compare : '" << _node.getData().m_path << "' =?= '" << _buffer->getFileName() << "'");
if (_node.getData().m_path == _buffer->getFileName()) {
return true;
}
return false;
});
if (listElements.size() == 0) {
APPL_ERROR(" ==> Can not find BUFFER ...");
} else {
listElements[0]->getData().m_buffer = _buffer;
}
updateFlatTree();
/* /*
ememory::SharedPtr<appl::Buffer> buffer = m_bufferManager->get(_value); ememory::SharedPtr<appl::Buffer> buffer = m_bufferManager->get(_value);
if (buffer == null) { if (buffer == null) {
@ -327,18 +377,20 @@ bool appl::widget::BufferTree::onItemEvent(const ewol::event::Input& _event, con
} else { } else {
value.m_isExpand = true; value.m_isExpand = true;
} }
updateFlatTree();
return true; return true;
} else if (value.m_buffer == null) { } else if (value.m_buffer == null) {
// TODO: Open the file... // TODO: Open the file...
return true return true;
} }
} }
if (_event.getStatus() == gale::key::status::pressSingle) { if (_event.getStatus() == gale::key::status::pressSingle) {
APPL_INFO("Event on List: " << _event << " pos=" << _pos ); APPL_INFO("Event on List: " << _event << " pos=" << _pos );
if (value.m_buffer != null) { if (value.m_buffer != null) {
// TODO: Display the current buffer... // TODO: Display the current buffer...
return true return true;
} }
}
/* /*
if( _pos.y() >= 0 if( _pos.y() >= 0
&& _pos.y() < (int64_t)m_list.size()) { && _pos.y() < (int64_t)m_list.size()) {

View File

@ -15,10 +15,10 @@
namespace appl { namespace appl {
class TreeElement { class TreeElement {
public: public:
TreeElement(const etk::String& _path,const etk::String& _nodeName, bool _isFolder = false, bool _isExpand=false): TreeElement(const etk::FSNode& _node, bool _isExpand=false):
m_path(_path), m_path(_node.getFileSystemName()),
m_nodeName(_nodeName), m_nodeName(_node.getNameFile()),
m_isFolder(_isFolder), m_isFolder(_node.getNodeType() == etk::typeNode_folder),
m_buffer(null), m_buffer(null),
m_isSelected(false), m_isSelected(false),
m_isExpand(_isExpand) { m_isExpand(_isExpand) {
@ -54,6 +54,9 @@ namespace appl {
int32_t m_selectedID; int32_t m_selectedID;
void updateFlatTree(); void updateFlatTree();
void generateFlatTree(); void generateFlatTree();
etk::String getRootPath();
void populateNodeIfNeeded(ememory::SharedPtr<etk::TreeNode<appl::TreeElement>> _node);
void goUpper();
ememory::SharedPtr<etk::TreeNode<TreeElement>> m_tree; ememory::SharedPtr<etk::TreeNode<TreeElement>> m_tree;
etk::FlatTree<TreeElement> m_flatTree; etk::FlatTree<TreeElement> m_flatTree;
ememory::SharedPtr<appl::Buffer> m_selection; ememory::SharedPtr<appl::Buffer> m_selection;