From 1d656391911603702ec7a5627384c68bc63aaa78 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 30 Aug 2018 23:20:18 +0200 Subject: [PATCH] [DEV] better treeview with select buffer --- sources/appl/Buffer.cpp | 8 +- sources/appl/widget/BufferTree.cpp | 116 +++++++++++++++++++++-------- sources/appl/widget/BufferTree.hpp | 11 ++- 3 files changed, 95 insertions(+), 40 deletions(-) diff --git a/sources/appl/Buffer.cpp b/sources/appl/Buffer.cpp index e38c0f6..51e5053 100644 --- a/sources/appl/Buffer.cpp +++ b/sources/appl/Buffer.cpp @@ -122,7 +122,7 @@ appl::Buffer::Buffer() : m_highlight(null) { addObjectType("appl::Buffer"); 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++; } @@ -139,7 +139,7 @@ bool appl::Buffer::loadFile(const etk::String& _name) { etk::FSNode file(_name); etk::String name = file.getName(); APPL_INFO("Load file : '" << name << "'"); - m_fileName = name; + m_fileName = file.getFileSystemName(); m_hasFileName = true; m_isModify = true; m_cursorPos = 0; @@ -158,10 +158,10 @@ void appl::Buffer::setFileName(const etk::String& _name) { APPL_DEBUG("Convert filename :'" << _name << "'"); etk::FSNode file(_name); etk::String name = file.getName(); - if (m_fileName == name) { + if (m_fileName == file.getFileSystemName()) { return; } - m_fileName = name; + m_fileName = file.getFileSystemName(); m_hasFileName = true; signalChangeName.emit(); setModification(true); diff --git a/sources/appl/widget/BufferTree.cpp b/sources/appl/widget/BufferTree.cpp index 5ea5ee6..7ee9280 100644 --- a/sources/appl/widget/BufferTree.cpp +++ b/sources/appl/widget/BufferTree.cpp @@ -75,30 +75,11 @@ static etk::String getCommonPathPart(const etk::String& _left, const etk::String void appl::widget::BufferTree::generateFlatTree() { // Brut Force Mode... - etk::String upperParent = ""; - etk::Vector 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); + etk::String upperParent = getRootPath(); // Now we have the root path... // Need to feed all elements needed. etk::FSNode nodeRoot = upperParent; - m_tree = etk::TreeNode::create(TreeElement(upperParent, etk::FSNode(upperParent).getFileName(), true, true)); + m_tree = etk::TreeNode::create(TreeElement(nodeRoot, true)); populateNodeIfNeeded(m_tree); updateFlatTree(); } @@ -117,20 +98,39 @@ void appl::widget::BufferTree::populateNodeIfNeeded(ememory::SharedPtr 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) { APPL_ERROR("add element: " << *it); - if (it->getNodeType() == etk::typeNode_folder) { - auto elem = etk::TreeNode::create(TreeElement(it->getFileSystemName(), it->getNameFile(), true, false)); - m_tree->addChild(elem); - } else { - auto elem = etk::TreeNode::create(TreeElement(it->getFileSystemName(), it->getNameFile(), false, false)); - m_tree->addChild(elem); - } + auto elem = etk::TreeNode::create(TreeElement(*it, false)); + _node->addChild(elem); // 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::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() { m_flatTree.setRoot(m_tree, [&](const TreeElement& _value){ @@ -163,8 +163,58 @@ void appl::widget::BufferTree::removeAllElement() { //m_list.clear(); } +etk::String appl::widget::BufferTree::getRootPath() { + etk::String upperParent = ""; + etk::Vector 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& _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& _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 buffer = m_bufferManager->get(_value); if (buffer == null) { @@ -327,18 +377,20 @@ bool appl::widget::BufferTree::onItemEvent(const ewol::event::Input& _event, con } else { value.m_isExpand = true; } + updateFlatTree(); return true; } else if (value.m_buffer == null) { // TODO: Open the file... - return true + return true; } } if (_event.getStatus() == gale::key::status::pressSingle) { APPL_INFO("Event on List: " << _event << " pos=" << _pos ); if (value.m_buffer != null) { // TODO: Display the current buffer... - return true + return true; } + } /* if( _pos.y() >= 0 && _pos.y() < (int64_t)m_list.size()) { diff --git a/sources/appl/widget/BufferTree.hpp b/sources/appl/widget/BufferTree.hpp index 493f44a..393d50a 100644 --- a/sources/appl/widget/BufferTree.hpp +++ b/sources/appl/widget/BufferTree.hpp @@ -15,10 +15,10 @@ namespace appl { class TreeElement { public: - TreeElement(const etk::String& _path,const etk::String& _nodeName, bool _isFolder = false, bool _isExpand=false): - m_path(_path), - m_nodeName(_nodeName), - m_isFolder(_isFolder), + TreeElement(const etk::FSNode& _node, bool _isExpand=false): + m_path(_node.getFileSystemName()), + m_nodeName(_node.getNameFile()), + m_isFolder(_node.getNodeType() == etk::typeNode_folder), m_buffer(null), m_isSelected(false), m_isExpand(_isExpand) { @@ -54,6 +54,9 @@ namespace appl { int32_t m_selectedID; void updateFlatTree(); void generateFlatTree(); + etk::String getRootPath(); + void populateNodeIfNeeded(ememory::SharedPtr> _node); + void goUpper(); ememory::SharedPtr> m_tree; etk::FlatTree m_flatTree; ememory::SharedPtr m_selection;